Excel Sheet letzte beschriebene Zeile finden mittels OLE



  • Hallo,

    Ich benötige aus meinem Programm die Möglichkeit aus einem Excel File zu lesen und in die Datei zu schreiben. Dazu habe ich bereits einige Lösungen mittel OLE gefunden.
    Für ein bestimmtes Thema benötige ich jedoch Hilfe: Da ich neue Einträge immer am Ende anfügen möchte, muss ich nach dem Öffnen oder vor dem Schreibvorgang die letzte beschrieben Zeile ermitteln. In VBA könnte ich in die letzte Zeile springen und die aktuelle Zelleposition auslesen ->
    Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row

    Ich wollte diese Code Zeile mittels OLE ausführen:
    x=Sheet.OlePropertyGet("End(xlUp)").OlePropertyGet("Row");

    Leider funktioniert die Code-Zeile nicht 😞

    Hatte jemand bereits das selbe Problem bzw. hat eine Lösung für mich?
    Ich verwende den C++ Builder.

    Anbei mein Code:
    [code="cpp"]
    try{
    // Open Excel
    Variant _uC_file = CreateOleObject("Excel.Application");
    _uC_file.OlePropertySet("Visible", true);
    _uC_file.OlePropertyGet("Workbooks").OleProcedure("Open","C:\\Temp\\TC5.xls");
    Variant Sheet = _uC_file.OlePropertyGet("Sheets","Sheet1");
    Variant Cells = Sheet.OlePropertyGet("Cells");

    // Read Cells
    Variant Cell;
    Cell = Cells.OlePropertyGet("Item",1,1);
    AnsiString temp_cell = 0;
    temp_cell = Cell.OlePropertyGet("Value");
    Cell = Cells.OlePropertyGet("Item",2,1);
    temp_cell = Cell.OlePropertyGet("Value");

    Variant WorkSheets = _uC_file.OlePropertyGet("Worksheets");
    Variant WorkSheet = WorkSheets.OlePropertyGet("Item", 1);

    // Find first empty row
    unsigned int x=Sheet.OlePropertyGet("Rows").OlePropertyGet("Count");
    Cell = Cells.OlePropertyGet("Item",x,1);
    x=Sheet.OlePropertyGet("End(xlUp)").OlePropertyGet("Row");
    //Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row

    // Write Cells
    Variant Range = WorkSheet.OlePropertyGet("Cells", 10, 10); // Row=.Zeile / Col=Spalte
    Range.OlePropertySet("Value", "TestText");

    try
    {
    _uC_file.OlePropertySet("DisplayAlerts",false);
    _uC_file.OlePropertyGet("ActiveWorkBook").OlePropertyGet("Save"); //save file
    }
    catch(...)
    {
    //return false;
    }

    _uC_file.OleProcedure("Quit");
    _uC_file = Unassigned;
    }
    catch(...){

    // MessageBox(0, L"Impossible to connect OLE",L"OLE Error", MB_OK);
    }
    [/code]

    Danke für Eure Antwort.

    Grüße,

    Andi



  • Petsche schrieb:

    Ich wollte diese Code Zeile mittels OLE ausführen:
    x=Sheet.OlePropertyGet("End(xlUp)").OlePropertyGet("Row");

    Keine Ahnung von der Excel API, aber das ist ganz sicher keine Property, das ist eine Funktion mit einem Argument. Du brauchst also eine OleFunction.



  • Habe die Code-Zeile wie folgt abgeändert:

    x=Sheet.OleFunction("End(xlUp)");
    

    Wird die Zeile ausgeführt, bekomme ich den Fehler "Exception class EOleSysError with message Unknown Name".



  • Anbei die Lösung:

    unsigned int last_row=Sheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
    


  • Petsche schrieb:

    Habe die Code-Zeile wie folgt abgeändert:

    x=Sheet.OleFunction("End(xlUp)");
    

    Wird die Zeile ausgeführt, bekomme ich den Fehler "Exception class EOleSysError with message Unknown Name".

    Schön dass du eine andere Lösung gefunden hast, aber siehst du wirklich nicht, was dein Fehler ist?
    Wer soll denn "End(xlUp)" jetzt parsen? Das ist schon ein Funktionsaufruf in einer Programmiersprache, in deinem Fall wars glaub ich VBA. In VBA geht der Interpreter her und bröckelt das auseinander. Es ist also eine Funktion End, die einen Parameter xlup bekommt (was auch immer das ist).
    Das müsste dann irgendwie so ausschauen:

    x = Sheet.OleFunction("End", xlUp);

    Aber wie gesagt, keine Ahnung von der Excel API an sich und du müsstest schauen, ob das xlUp hier auch bekannt ist.


Anmelden zum Antworten