Excel Zelle Selektieren ??!?



  • Da Excel beim speichern die zuletzt selektierte Zelle speichert, und Zugriffe auf Zellen über...

    Sheet.OlePropertyGet("Cells",2,3).OlePropertyGet("Value")
    

    ... scheinbar relational sind, also abhängig von der Position des Cursors, warum auch immer, muss ich den Cursor auf das Feld 1,1 positionieren.

    Sowas in dieser Art hat nicht funktioniert 😞

    Sheet.OlePropertyGet("Range", 1, 1OleFunction("Select");
    

    Der zugehörige VB Code sieht so aus:

    Range("A1").Select
    

    Jemand nen Tipp ??



  • Hi

    Eigenschaft
    -----------
    Range("A1").Select
                ------
                Methode
    

    also gilt:

    Eigenschaft
    ----------------------------
    OlePropertyGet("Range","A1").OleFunction("Select");
                                 ----------------------
                                 Methode
    

    ungetestet....



  • HI, danke das du geantwortet hast.
    So hatte ich das schon probiert...
    siehe dem was ich da drüber schon gepostet hab.
    Is nur irgendwie kaputt gegangen ?!?
    Ich probiers nochma und sag dann morgen bescheid ...

    danke auf jeden fall schon mal 🙂



  • hm

    Cells bezieht sich normalerweise immer auf den Anfangspunkt. Die erste Zelle zu makieren ist eigentlich überflüssig.

    Probiere das zugreifen mal über ein Macro aus. Das müsste es eigentlich bestätigen.



  • Ich konnte es nich lassen ... habs ausprobiert.

    Excel.OlePropertyGet("Range","A1").OleFunction("Select");
    

    Nur wenn ich den Aufruf so mache, ergibt es keinen Fehler, allerdings passiert auch nix 😞 ... mit Sheet.* gibts nen Fehler.

    Das Problem ist, das die erste Zeile Fixiert ist, und Excel wie gesagt zuletzt selektierte Zelle speichert. Wenn ich also 400 Zeilen habe, und Zeile 300 eine Zelle selektiert ist, dann wird das Blatt mit sicht auf diese Zelle in Zeile 300 geöffnet. Dadurch funktioniert der Zugriff auf die Zelle in Zeile 1, aber alles was danach kommt, wird erst ab der Zeile unter der fixierten ausgelesen, also zum Beispiel Zeile 1, danach dann 299,300,301 usw. ... obwohl das eigentlich die zeilen 2, 3,4, usw. sein sollten. Wenn ich die Zelle 1,1 vorher selektiere, speichere, dann funktioniert das auslesen und er geht alle Zeilen 1 - 400 durch. Aber dazu brauch ich halt dieses Select.

    Zur not könnte ich noch die gesamte Excel Wrapper Klasse einfügen die Ihr in der FAQ habt. Aber da is ziemlich viel Zeug dabei das ich nich gebrauchen kann und überflüssig ist. Hab auch schon da drin geschaut und nix gefunden.

    Irgend ne Idee ?? Den Rest mit dem auslesen der Namen der Blätter und anwählen und sowas hab ich übrigends Dank deiner erklärung hinbekommen .... DANKE !!! 🙂



  • Hi,

    die Wrapper-Klassen müssten mal wieder überarbeitet werden.(Wenn ich doch nur Zeit hätte...)

    Aber da wird sowas gemacht:

    //---------------------------------------------------------------------------- 
     String __fastcall TMLWorksheet::GetCellString(int Col, int Row) 
     { 
        return var_Sheet.OlePropertyGet("Cells",Col+1,Row+1).OlePropertyGet("Value"); 
     } 
     //---------------------------------------------------------------------------- 
     void __fastcall TMLWorksheet::SetCellString(int Col, int Row, String Text) 
     { 
        var_Sheet.OlePropertyGet("Cells",Col+1,Row+1).OlePropertySet("Value",Text.c_str()); 
     } 
     //--------------------------------------------------------------------------- 
     void __fastcall TMLWorksheet::SetCellString_Range(String Range,String Text) 
     { 
        return var_Sheet.OlePropertyGet("Range",Range.c_str()).OlePropertySet("Value",Text.c_str()); 
     } 
     //----
    

    also müsste es so gehen.

    Du solltest auf Zellen nicht von der Excel_Instanz zugreifen sonder vom Tabellenblatt, indem die Zelle ist. Dann müsste es auch gehen.
    Ich denke, dass ich den Code getestet habe 🙄 , also müsste es auch gehen.



  • Also ich greife so wie in der Wrapper Klasse auch auf die Daten zu:

    Sheet.OlePropertyGet("Cells",y,1).OlePropertyGet("Value");
    

    ... und trotzdem der fehler. Wie gesagt. Wenn ich die Zelle 1,1 selektiere und speichere und dann mein programm drüber laufen lasse funktioniert das 🙂

    Aber ich kann doch von einem User nicht erwarten erst Excel zu öffnen, den Mauszeiger oben links hinzusetzen, zu klicken und dann zu speichern ... und erst dann das programm zu starten 😞

    ... wenn du keine idee mehr hast dann probier ich jez mal die Wrapper Klasse komplett einzubinden.



  • schick mir ne Mai, ich schick dir die Dateien



  • Danke für das Angebot 🙂 ... ich werd drauf zurück kommen,
    eine Idee hab ich aber noch.

    Es liegt wie du vermutet hast nich an der Zelle. Aber das auswählen des Sheets scheint nicht korrekt geklappt zu haben. Wenn ich die Datei öffne und das Sheet aus dem ich die Daten lese anwähle und dann speicher funktioniert das auselesen.

    Excel = Variant::CreateObject("Excel.Application");
        Excel.OlePropertyGet("Workbooks").OleFunction("Open", dlgOpen -> FileName.c_str());
        //Beliebige Arbeitsmappe öffnen ... funktioniert
    
        Workbook = Excel.OlePropertyGet("ActiveWorkbook");
        Sheet = Workbook.OlePropertyGet("ActiveSheet");
        //Objekte für Workbooks und Sheets anlegen ... funktioniert
    
        //Anzahl der Tabellen auslesen
        int anz_t = Workbook.OlePropertyGet("Sheets").OlePropertyGet("Count");
    
        //Namen der Tabellen auslesen
        vector <AnsiString> tabs;
        for (int i = 1; i <= anz_t; i++)
        {
          cmb -> Items -> Add(Workbook.OlePropertyGet("Sheets", i).OlePropertyGet("Name"));
        }  
        cmb -> ItemIndex = 0;
    
        Workbook.OlePropertyGet("Sheets", 1).OleFunction("Select");
    


  • versuch mal über den Namen oder über den Index an das Sheet zu kommen. Schreib einfach testhalber mal was in einer Zelle.


Anmelden zum Antworten