Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Buchempfehlung erbeten

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

actxserver ColorIndex in Schleife bestimmen

 

Krys
Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2020, 15:22     Titel: actxserver ColorIndex in Schleife bestimmen
  Antworten mit Zitat      
Moin liebes Forum,

ich möchte über Matlab zwei Excel-Tabellen miteinander vergleichen und nach dem Vergleich eine neue Tabelle erstellen, die die Unterschiede zeigt. Ich muss sagen, dass es ziemlich gut läuft und ich schöne Fortschritte mache.

Die Zellen in der Spalte 'M' können vier verschiedene Wörter enthalten, wobei jedem Wort eine bestimmte Füllfarbe zugeordnet wird. Nun möchte ich abfragen welche Werte sich in den Zellen der Spalte 'M' befinden und welche Füllfarben vorliegen.

Code:
[S.filename_xlsx_1, S.pathname_xlsx_1] = uigetfile({'*.xlsx'},'1. DF-Tabelle laden'); % Excel_Tabelle auswählen
file = strcat(S.pathname_xlsx_1, S.filename_xlsx_1);

% Einlesen der Excel-Tabelle
[S.num_1,S.txt_1,S.raw_1] = xlsread(file);
S.DF_table_1 = readtable(file);

% Verbindung zu Excel erstellen
S.excel_1 = actxserver('Excel.Application');

% optional, make excel visible
excel.Visible = true;    

% open excel file
S.workbook_1 = S.excel_1.Workbooks.Open(file);

% get worksheet reference
S.worksheet_1 = S.workbook_1.Worksheets.Item(1);

% Länge der Excel-Liste bestimmen
S.length_1 = length(S.raw_1);                    
S.length_1 = sprintf('%d',S.length_1);      
S.M_end_1 = (strcat('M6:','M', S.length_1));  % Spalte festlegen und Anzahl der Zeilen hinzufügen --> Range

% Inhalt der Zelle
S.excelRange_1 = get(S.worksheet_1,'Range', S.M_end_1);       % An dieser Stelle habe ich bspw. eine Range von M6:M5306  --> FUNKTIONIERT BESTENS
S.Cell_Inhalt_M_1 = S.excelRange_1.Value;                     % dementsprechend habe ich an dieser Stelle ein 5306x1 cell



Nun möchte ich quasi das gleiche für den ColorIndex machen. Wenn ich den folgenden Code verwende, wird in meinem Fall eine 43 ausgegeben, was der Farbe grün entspricht und auch so in der Excel-Tabelle vorliegt.

Code:
S.ColorIndex_1 = S.worksheet_1.Range('M6').Interior.ColorIndex;  % funktioniert    S.ColorIndex = 43


Wenn in meiner Excel bspw. die Zellen 'M6:M9' grün (ColorIndex = 43) sind und ich diese Range im Code eingebe, wird mir nur eine 1x1 int32 mit dem Wert 43 im Workspace hinterlegt. Allerdings hätte ich gerne ein 4x1 cell, die in jeder Zelle eine 43 enthält.

Code:
S.ColorIndex_1 = S.worksheet_1.Range('M6:M9').Interior.ColorIndex;  % es wird zwar kein Fehler ausgegeben allerdings habe ich hier kein 4x1 cell wie ich ihn bei der gleichen Range beim Bestimmen des Value hätte


Noch blöder wird es, wenn dann Zelle 'M10' bspw. gelb (ColorIndex = 6) ist. Wenn ich den oberen Code mit einer Range von 'M6:M10' eingebe, wird mir ein 1x1 double mit 'NaN' ausgespuckt. Ich kann mir leider nicht erklären warum das so ist.

Dementsprechend wären die Fragen wie folgt:

1.) Warum kann ich bei der Bestimmung des ColorIndex keine Range eingeben, wie ich es bei der Bestimmung des Value mache. Bzw. warum wird kein cell ausgegeben, dass für jede Excel-Zelle einen Wert beinhaltet.

2.) Warum wird ein 'NaN' ausgegeben, wenn die Zellen innerhalb der Range verschiedene Füllfarben beinhalten.


Ich hoffe, dass das nicht zu kompliziert klingt und ich genügend Informationen erwähnt habe. Ich glaube auch, dass es nicht einfach sein wird eine Antwort darauf zu finden, da das erstellen von Excel Tabellen mit actxserver nicht sehr gängig ist.

LG
Krys
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 21.145
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.03.2020, 15:28     Titel:
  Antworten mit Zitat      
Hallo,

meine Vermutung wäre, dass Excel das in der Form einfach nicht unterstützt.
Am einfachsten ist es wohl, wenn du in einer Schleife für jede Zelle einzeln den Farbwert abfragst und das in MATLAB zu einem Array zusammensetzt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2020, 16:32     Titel:
  Antworten mit Zitat      
Danke für deine schnelle Antwort!

Dass Excel das nicht unterstützt, hatte ich auch schon vermutet aber ein wenig Hoffnung hatte ich trotzdem , dass das vllt jemand widerlegen kann.

Ich muss sagen, dass ich mit Matlab einigermaßen klarkomme und mir immer wieder nette Dinge gelingen aber ich habe immer wieder Probleme mit Schleifen.

Für den vorliegenden Fall kriege ich die Schleife nicht hin. Wahrscheinlich ist das ganz easy nur bin ich zu blöd dafür.

Ich hätte versucht das irgendwie so zu lösen:

Code:
for i = 6:M_end          
 ii = i + 1;
 ii = num2str(ii);
 m = strcat('M',ii);
 ColorIndex = S.worksheet_1.Range(m).Interior.ColorIndex;
end


allerdings wird der ColorIndex nur für 'M10' ausgegeben.

Ich wette es ist etwas banales was mir da fehlt.

Gruß
Krys
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 21.145
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.03.2020, 16:40     Titel:
  Antworten mit Zitat      
Hallo,

... weil du ColorIndex überschreibst. Schnelle Abhilfe:

Code:
for i = 6:M_end          
 ii = i + 1;
 ii = num2str(ii);
 m = strcat('M',ii);
 ColorIndex(i-5) = S.worksheet_1.Range(m).Interior.ColorIndex;
end


Besser:
Code:
all_i = 6:M_end;
ColorIndex = zeros(size(all_i));
for k = 1:numel(all_i)          
 i = all_i(k);
 m = strcat('M',num2str(i));
 ColorIndex(k) = S.worksheet_1.Range(m).Interior.ColorIndex;
end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2020, 16:46     Titel:
  Antworten mit Zitat      
Super!

Funktioniert! Vielen Dank!

Gruß
Krys
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2020, 14:44     Titel:
  Antworten mit Zitat      
Moin,

wie schon gesagt, habe ich echt Probleme Schleifen vernünftig einzusetzen.

Ich arbeite immer noch an dem Vergleich der beiden Excel-Tabellen.
Mir ist ein Problem beim Vergleich meiner Tabellen aufgefallen.

In meinen Tabellen habe ich in Spalte 'L' ID's, die verglichen werden müssen.

Die Spalte mit den ID's aus Tabelle 1 heißt ID_1. Für die zweite Tabelle entsprechend ID_2

Code:
ID_1 %  5301x1 cell
ID_1{1, 1} = '92_447_487_0'


ID_2 ist meistens genauso aufgebaut und hat von {1,1} bis {5301,1} die gleichen IDs

d.h.

Code:
ID_2 %  5301x1 cell
und ID_2{1, 1} sollte auch = '92_447_487_0'


Es kann trotzdem vorkommen, dass eine ID aus Tabelle 2 und die dazugehörige Zeile gelöscht wurden, weil der Inhalt nicht mehr benötigt wird. Ich muss nun prüfen, ob alle IDs aus ID_1 auch in ID_2 vorhanden sind.

Mein erster Gedanke war einfach
Code:
ID_1 = S.raw_1(6:end,12);    % Spalte L mit den ID's aus Tabelle 1
ID_2 = S.raw_2(6:end,12);    % Spalte L mit den ID's aus Tabelle 2

S.comp_ID = strcmp(S.ID_1(:,1), S.ID_2(:,1));   % Vergleich der einzelnen Zellen
S.comp_ID = double (S.comp_ID);
S.row_zeros_ID = find(S.comp_ID == 0);    % findet die Nullen im Vergleich. Null bedeutet, dass IDs an der Stelle S.row_zeros nicht übereinstimmen


Naja...nun ist mir aufgefallen, dass der Vergleich nicht mehr möglich ist, wenn in Tabelle 2 eine Zeile mit der dazugehörigen ID gelöscht wird. Dann verschieben sich bei Tabelle 2 alle Zeilen (die unter der gelöschten Zeile waren) um einen Wert nach oben, sodass sich die gleichen ID's nicht mehr in den gleichen Zeilen befinden.

Deswegen habe ich mir gedacht, dass jede ID einzeln in einer schleife gesucht werden muss. Ich habe versucht eine Lösung zu finden, indem ich mich an der oben geposteten Schleife orientiert habe.

Code:
ID_1 = S.raw_1(6:end,12);   % alle ID's aus Tabelle 1
ID_2 = S.raw_2(6:end,12);   % alle ID's aus Tabelle 2

N = length(S.raw_1);
all_i = 6:N;
find_ID = zeros(size(all_i));

for k = 1:numel(all_i)    
 i = all_i(k);
 ID_find(k) = find(ismember(ID_1,ID_2(i,1)));
end



Code:
Index exceeds matrix dimensions.  % Das ist der Fehler der ausgegeben wird


Ich lade mal zwei Tabellen und einen an die beiden Tabellen angepasste m-File hoch. Vielleicht hat ja jemand eine Idee. Ich vermute, dass es wieder nur eine Kleinigkeit ist. Aber um Schleifen einzusetzen, bin ich einfach zu doof.

VG
Krys

P.S.
Also nochmal vereinfacht gesagt...ich müsste prüfen, ob ID_2{1,12} in ID_1 vorhanden ist. Im nächsten Schritt : Ist ID_2{2,12} in ID_1 enthalten
Ist ID_2{3,12} in ID_1 enthalten usw.

Test.m
 Beschreibung:

Download
 Dateiname:  Test.m
 Dateigröße:  1.78 KB
 Heruntergeladen:  19 mal
Tabelle_2.xls
 Beschreibung:

Download
 Dateiname:  Tabelle_2.xls
 Dateigröße:  20.5 KB
 Heruntergeladen:  12 mal
Tabelle_1.xls
 Beschreibung:

Download
 Dateiname:  Tabelle_1.xls
 Dateigröße:  21 KB
 Heruntergeladen:  12 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 21.145
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.03.2020, 19:36     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion ismember macht das ganz ohne Schleife:

Code:


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2020, 11:56     Titel:
  Antworten mit Zitat      
So simple ... Rolling Eyes

Vielen Dank!

Grüße
Krys
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2020, 11:48     Titel:
  Antworten mit Zitat      
Hallo nochmal,

ich muss leider nochmal nerven, weil ich seit Tagen nicht weiterkomme und ich mir auch nicht sicher bin, ob mein Vorhaben überhaupt umsetzbar ist.

Ich hatte ja schon ein wenig erläutert was ich vorhabe.

Ich versuche es nochmal kurz zusammenzufassen.
Ich möchte zwei Tabellen miteinander vergleichen, die zum größten Teil identisch sind. Es kann vorkommen, dass in der zweiten Tabelle komplette Zeilen fehlen oder Inhalte in den Zellen geändert wurden. Um es zu verdeutlichen lade ich zwei Tabellen hoch, die so aufgebaut sind wie die Tabellen, die ich vor ein paar Tagen hochgeladen habe. Allerdings sind diese einfacher aufgebaut, sodass man das Problem vielleicht schneller versteht.

In den beiden Tabellen befinden sich in Spalte B sogenannte IDs. Im ersten Schritt soll ich prüfen, ob welche davon fehlen bzw. die ganze dazugehörige Zeile. Ist dies der Fall, wird ein neues Blatt erstellt und die Zeile dieser ID kopiert und in das neue Blatt eingesetzt. Generell bekomme ich das hin.

Code:

handles.ID_1 = handles.raw_1(6:end,2);    
handles.ID_2 = handles.raw_2(6:end,2);    

handles.ID_find = ismember(handles.ID_1, handles.ID_2);          
handles.ID_find = double(handles.ID_find);                  
[ID_row_zeros] = find(handles.ID_find == 0);        
handles.ID_deleted = isempty(ID_row_zeros);          

ID_row_zeros_str = string(num2str(ID_row_zeros));   % ID_row_zeros_str gibt an welche Zeilen fehlen. In dem Fall ist es Zeile 8, 22, 30, 31. Diese vier Zeilen sind in der 1.Tabelle lila markiert, damit man sie schneller findet.


% ##########   copy the first 5 rows    ############

% im Folgenden wird die Tabellenkopfzeile vom ersten Blatt in das zweite Blatt kopiert

handles.worksheet_1.Rows.Item(1).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A1').PasteSpecial(13);
handles.worksheet_1.Rows.Item(2).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A2').PasteSpecial(13);
handles.worksheet_1.Rows.Item(3).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A3').PasteSpecial(13);
handles.worksheet_1.Rows.Item(4).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A4').PasteSpecial(13);
handles.worksheet_1.Rows.Item(5).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A5').PasteSpecial(13);


% ##########   paste deleted rows to the 2nd sheet    ##############

% Im folgenden Teil befindet sich mein Problem. Ich kann die vier fehlenden Zeilen in das zweite Blatt kopieren. Allerdings mache ich das einzeln. Wenn aber ID_row_zeros 200 fehlende Zeilen enthält, würde ich mir wünschen, dass diese einfach komplett in das zweite Blatt eingefügt werden und nicht wie im folgenden Code einzeln.


handles.worksheet_1.Rows.Item(ID_row_zeros(1,1)).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A6').PasteSpecial(13);

handles.worksheet_1.Rows.Item(ID_row_zeros(2,1)).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A7').PasteSpecial(13);

handles.worksheet_1.Rows.Item(ID_row_zeros(3,1)).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A8').PasteSpecial(13);

handles.worksheet_1.Rows.Item(ID_row_zeros(3,1)).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A9').PasteSpecial(13);

% Ich hätte gerne sowas wie der folgende Code

handles.worksheet_1.Rows.Item(ID_row_zeros).Copy;
handles.workbook_1.Worksheets.Item(2).PasteSpecial(13);

% rein theoretisch sage ich, dass alle ID_row_zeros Werte in das zweite Blatt eingefügt werden sollen aber so geht das leider nicht. Da wäre es super, wenn es eine passende Syntax geben würde.

 


Wie immer hoffe ich, dass ich mich verständlich genug ausgedrückt habe.

VG

demo.m
 Beschreibung:

Download
 Dateiname:  demo.m
 Dateigröße:  8.61 KB
 Heruntergeladen:  3 mal
table_2_demo.zip
 Beschreibung:

Download
 Dateiname:  table_2_demo.zip
 Dateigröße:  18.5 KB
 Heruntergeladen:  3 mal
table_1_demo.zip
 Beschreibung:

Download
 Dateiname:  table_1_demo.zip
 Dateigröße:  21.58 KB
 Heruntergeladen:  3 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 21.145
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.03.2020, 12:03     Titel:
  Antworten mit Zitat      
Hallo,

ich musste jetzt lange suchen um zu finden, was eigentlich die Frage ist...

Die letzte der 4 Zeilen sollte wohl so lauten:
handles.worksheet_1.Rows.Item(ID_row_zeros(4,1)).Copy;
handles.workbook_1.Worksheets.Item(2).Range('A9').PasteSpecial(13);

Dann kann man das in einer for-Schleife machen:
Code:
for k = 1:irgendwas
handles.worksheet_1.Rows.Item(ID_row_zeros(k,1)).Copy;
handles.workbook_1.Worksheets.Item(2).Range(['A', num2str(k+5)]).PasteSpecial(13);
end


Ob es auch ohne geht, ist eine Frage dessen, was Excel unterstützt.

Generell wäre mein Vorschlag zu versuchen, die Daten nach MATLAB zu importieren, so viel wie möglich dort zu machen, und das dann wieder nach Excel zu exportieren. Diese VBA-Befehle machen ja nicht wirklich Spaß, und da hilft es auch nichts, das aus MATLAB heraus zu machen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2020, 12:28     Titel:
  Antworten mit Zitat      
Das hat tatsächlich funktioniert! Vielen Dank.

Ich habe vorher bei Mathworks um Hilfe gebeten, weil ich nicht immer hier nerven möchte aber da konnte mir leider keiner helfen. Generell wurde mir auch dort empfohlen es so zu machen wie du es gesagt hast.

Also in Matlab importieren und, dort bearbeiten und anschließend wieder als excel abspeichern. Aber gerade bin ich so weit und mir fällt es gerade schwer den Aufwand abzuschätzen das alles wieder "rückgängig" zu machen, was ich bisher aufgebaut habe.

Nochmals Danke. Vielleicht werde ich deinen Rat befolgen, wenn ich auf das nächste Problem stoße.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.