WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Datein in Excel einbinden - 'Range' über txt festlegen

 

Sc@r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2016, 12:57     Titel: Datein in Excel einbinden - 'Range' über txt festlegen
  Antworten mit Zitat      
Hallo zusammen,
ich hoffe mir kann jemand weiterhelfen.
Ich muss Daten von Matlab in eine Exceltabelle schreiben:

Folgender Code funktioniert:

Code:
...

   %Excel Kommunikation mittels ActiveXServer
        Excelobj = actxserver('excel.application')
        %set(Excelobj, 'Visible', 1);
        workbooks = Excelobj.Workbooks;
        Excelfile = Filename_old;
        TMPBOOK = Excelobj.Workbooks.Add(Excelfile);
        %Excelobj.ActiveWorkbook = Excelfile;
       
        % Aktiviere den ersten Sheet
        Sheets = Excelobj.ActiveWorkbook.Sheets;
        sheet1 = get(Sheets, 'Item', 1);
        invoke(sheet1, 'Activate');
        % handle zum aktiven Sheet
        Activesheet = Excelobj.Activesheet;
       
        % Schreibe Temperaturen (vorher/nachher) und Feuchte in Daten / B21
        % / C21 / D21
        ActivesheetRange = get(Activesheet,'Range','B21:B21');
        pretemp = handles.pretemp;
        posttemp = handles.posttemp;
        humid = handles.humid;
        set(ActivesheetRange, 'Value', pretemp);
        ActivesheetRange = get(Activesheet,'Range','C21:C21');
        set(ActivesheetRange, 'Value', posttemp);
        ActivesheetRange = get(Activesheet,'Range','D21:D21');
        set(ActivesheetRange, 'Value', humid);


   ....


Da ich die Datei flexibel halten möchte und man nicht direkt auf den Quelltext zugreifen soll, wollte ich die Speicherzellen der Exceldatei in eine Textdatei auslagern.

Die Textdatei Klima sieht dann wie folgt aus:

Schreibe_Temperatur_vorher 'B21:B21'
Schreibe_Temperatur_nachher 'C21:C21'
Schreibe_Feuchte 'D21:D21'

Wenn ich die Textdatei in einem Probedurchlauf durchgehe erhalte ich folgendes:

Code:
ExcelCell = fopen('C:\User\ADM\Desktop\Klima.txt');
   Cell = textscan(ExcelCell, '%s');


Cell = {6x1 cell}
Cell{1}{2} = 'B21:B21'
Cell{1}{4} = 'C21:C21'
Cell{1}{6} = 'D21:D21'


soweit so gut...


Ich dachte mir nun, das ich die Textdatei , wie gerade gezeigt, in das Programm einbinden kann:

Code:
ExcelCell = fopen('C:\User\ADM\Desktop\Klima.txt');
   Cell = textscan(ExcelCell, '%s');

   %Excel Kommunikation mittels ActiveXServer
        Excelobj = actxserver('excel.application')
        %set(Excelobj, 'Visible', 1);
        workbooks = Excelobj.Workbooks;
        Excelfile = Filename_old;
        TMPBOOK = Excelobj.Workbooks.Add(Excelfile);
        %Excelobj.ActiveWorkbook = Excelfile;
       
        % Aktiviere den ersten Sheet
        Sheets = Excelobj.ActiveWorkbook.Sheets;
        sheet1 = get(Sheets, 'Item', 1);
        invoke(sheet1, 'Activate');
        % handle zum aktiven Sheet
        Activesheet = Excelobj.Activesheet;
       
        % Schreibe Temperaturen (vorher/nachher) und Feuchte in Daten / B21
        % / C21 / D21
        ActivesheetRange = get(Activesheet,'Range',Cell{1}{2});
        pretemp = handles.pretemp;
        posttemp = handles.posttemp;
        humid = handles.humid;
        set(ActivesheetRange, 'Value', pretemp);
        ActivesheetRange = get(Activesheet,'Range',Cell{1}{4});
        set(ActivesheetRange, 'Value', posttemp);
        ActivesheetRange = get(Activesheet,'Range',Cell{1}{6});
        set(ActivesheetRange, 'Value', humid);
        ....


bei dieser Ausführung erhalte ich den Error in
ActivesheetRange = get(Activesheet,'Range',Cell{1}{2});



Dachte mir zuerst, dass MATLAB sich den vorher definierten Bereich dann aus der txt holt. Das ist aber leider nicht der Fall. Wäre ja auch zu leicht geswesen Rolling Eyes
Ich muss den Bereich der Excel also wohl neu definieren, aber irgendwie stehe ich da gerade etwas auf dem Schlauch.


Wie kann ich den Bereich 'B21:B21' aus der txt auslesen, dass MATLAB ihn wie im ersten Quellcode oben verwendet?


Bin über jeden Tipp dankbar.

Mit freundlichen Grüßen
Sc@r


Harald
Forum-Meister

Forum-Meister


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

welche Fehlermeldung bekommst du in der angegebenen Zeile?

Was liefert Eingabe von
Code:
?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sc@r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2016, 13:59     Titel:
  Antworten mit Zitat      
Wenn ich das Programm durchlaufen lasse und bei

Code:
ActivesheetRange = get(Activesheet,'Range',Cell{1}{2});
 

einen Breakpoint setze, bekomme ich den Array (6x1)

    Schreibe_Temperatur_vorher
    'B21:B21'
    Schreibe_Temperatur_nachher
    'C21:C21'
    Schreibe_Feuchte
    'D21:D21'


Dort steht in

Cell{1}{2} = 'B21:B21'


Sobald ich dann den nächsten Schritt ausführe, also

Code:
ActivesheetRange = get(Activesheet,'Range',Cell{1}{2});
 


sagt mir Matlab:

Zitat:
Error using Interface.000208D_0000_0000_c000_000000000046/get

Undocumented Function
There is no documentation for
Error using Interface.000208D_0000_0000_c000_000000000046/get




gibt es vllt einen anderen Weg die Speicherzellen über eine txt einlese?

(muss gestehen, dass ich noch nicht so lange mit Matlab arbeite)

Grüße
S@ar
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.05.2016, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

... und wenn du den Code nochmal mit 'B21:B21' ausführst, funktioniert es immer noch? Ich würde mal vermuten, dass die Datei vielleicht noch geöffnet war.

Zitat:
(muss gestehen, dass ich noch nicht so lange mit Matlab arbeite)

Warum tust du dir dann auch noch ActiveX an? Mit xlsread und xlswrite bzw. readtable und writetable lässt es sich viel leichter arbeiten und du bekommst sinnvolle Fehlermeldungen. In den letzten Releases gab es auch deutliche Fortschritte, was das wiederholte Lesen und Schreiben mit diesen Befehlen angeht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sc@r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2016, 14:45     Titel:
  Antworten mit Zitat      
Wenn ich den Code so wie oben beschrieben ausführe


Code:
...
ActivesheetRange = get(Activesheet,'Range','B21:B21');
...


funktioniert wieder alles.


Habe es gerade nochmal mit dem Array ausgeführt und alles andere vorher geschlossen. Der Fehler tritt leider immer noch auf.



ActiveX schien mir im ersten Moment ganz gut. Bin ja noch nicht so lange dran. Smile
Ohne die Auslagerung der Speicherbereiche in die txt funktioniert es ja auch. Nur leider muss das Programm flexibler sein.

Hättest du denn vllt noch eine andere Idee, dass es auch mit dem bestehenden funktioniert? Muss es ja eigentlich nur schaffen, dass MATLAB den Bereich, den man in der Excel haben möchte, aus der txt nimmt und in

Code:
...
ActivesheetRange = get(Activesheet,...


einfügt.

Grüße
Sc@r
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.05.2016, 14:53     Titel:
  Antworten mit Zitat      
Hallo,

dann gibt es offensichtlich einen Unterschied zwischen 'B21:B21' und C{1}{2}.

Was genau liefert
Code:
zelle1 = 'B21:B21' ;
zelle2 = C{1}{2};
isequal(zelle1, zelle2)


Ich habe gerade eine Vermutung: hast du in der Textdatei etwa ' ' um den Bereich gemacht? Die müssten weg.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sc@r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2016, 15:16     Titel:
  Antworten mit Zitat      
Bin gerade per Handy online.
Haben gerade einen Stromausfall. Werde es wohl erst morgen testen können Confused

In der Textdatei stehen ' ' um den Bereich. Dachte die müssten dort auch verwendet werden, da ich diese auch in

Code:
ActivesheetRange = get(Activesheet,'Range','B21:B21');


setzen musste.


Werde diese dann sofort entfernen und mich dann melden. Hoffe, dass es das Problem ist Smile

Schon mal recht herzlichen Dank für deine Hilfe. Falls ich es heute nicht mehr schaffe melde ich mich morgen.

Grüße
Sc@r
 
Sc@r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2016, 09:14     Titel:
  Antworten mit Zitat      
Hi,

habe gerade die txt bearbeitet und die ' ' entfernt, danach habe ich geprüft ob in den Zellen das Gleiche steht und nochmal das gesamte Programm ausgeführt


Code:
zelle1 = 'B21:B21' ;
 zelle2 = C{1}{2};
isequal(zelle1, zelle2)

ans =

     1




Beim Ausführen des Programms tritt der Fehler aber leider immer noch auf Crying or Very sad

Grüße
Sc@r
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2016, 10:33     Titel:
  Antworten mit Zitat      
Hallo,

kann ich mir beim besten Willen nicht vorstellen.
Wenn zelle1 und zelle2 gleich sind, dann müssen Befehle mit diesen beiden Alternativen auch das gleiche liefern.

Bitte nochmal überprüfen, ob ansonsten keine Unterschiede da sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sc@r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2016, 11:59     Titel:
  Antworten mit Zitat      
Jetzt geht es Very Happy

Code:
...
ActivesheetRange = get(Activesheet,'Range','B21:B21');
...
 



Textdatei:

Schreibe_Temperatur_vorher B21:B21
Schreibe_Temperatur_nachher C21:C21
Schreibe_Feuchte D21:D21
Range


Code:
ExcelCell = fopen('C:\User\ADM\Desktop\Klima.txt');
   Cell = textscan(ExcelCell, '%s');



Cell = {7x1 cell}
Cell{1}{2} = B21:B21
Cell{1}{4} = C21:C21
Cell{1}{6} = D21:D21
Cell{1}{7} = Range




Veränderter Code:

Code:
...
ActivesheetRange = get(Activesheet,Cell{1}{7},Cell{1}{2});
...



Danke für deine Hilfe. Wink
Bin echt froh das es jetzt doch funktioniert.

Grüße
Sc@r
 
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.