Excel und OLE



  • Hallo,
    steuere Excel an und übergebe aus einem StringGrid Daten.
    Klappt alles wunderbar; nur bei der Spaltenbreite und Selektierung
    der Tabelle bekomme ich Fehlermeldung "...falscher Variablentyp.."
    Witzigerweise wird die Funktion aber jeweils in Excel korrekt umgesetzt...!?

    void __fastcall TForm21::frm21_btnExcelClick(TObject *Sender)
    {try {                                                                          // Fehllerroutine Start
     Integer iRow,iCol,iSumme; AnsiString z1,z2,zFile;                              // Vars definieren
     Variant Excel,vSheet,vFont,vCell,vCol,vRange;                                  // Vars definieren
    
     if(FileExists(zExcel)==false) {                                                // Pfad falsch
      ShowMessage("MS Excel Pfadangabe nicht korrekt bzw. Programm nicht gefunden.\rBitte geben Sie den korrekten Pfad an.\r\r=> "+zExcel); // Info geben
      frm21_btnAuswahlClick(0);                                                     // und Auswahl ermöglichen
      return;                                                                       // und raus
     }                                                                              // ende if(FileExists
    
     z1="Statistik "+frm21_cbStatistik->Text;                                       // Bezeichnung Arbeitsmappe
     zFile=Form1->PrgPfad+"Ablage\\excel_"+z1+".xls";                               // Filename erzeugen
    
     Excel=CreateOleObject("Excel.Application");                                    // Excel OLE anmelden
     Excel.OlePropertySet("Visible",true);                                          // Excel sichtbar machen
    
     Excel=Excel.OlePropertyGet("Workbooks");                                       // Zugriff auf die Workbooks
     Excel.OleFunction("Add");                                                      // 1. Arbeitsblatt erstellen
     vSheet=Excel.OlePropertyGet("Item",1);                                         // Zugriff auf das erste Worksheet
     vSheet=vSheet.OlePropertyGet("Worksheets");                                    // und
     vSheet.OlePropertyGet("Item",1).OlePropertySet("Name",z1.c_str());             // Dem Worksheet einen Namen geben
    
     vSheet=vSheet.OlePropertyGet("Item",1);                                        // Zugriff auf das erste Worksheet
    
     iCol=frm21_grdStatistik->ColCount;                                             // Anzahl Spalten
     iRow=frm21_grdStatistik->RowCount;                                             // Anzahl Zeilen
     for (int i1=0;i1<iRow;i1++) {                                                  // alle Zeilen
      for (int i0=0;i0<iCol;i0++) {                                                 // alle Spalten
       z1=frm21_grdStatistik->Cells[i0][i1];                                        // Text auslesen
       vCell=vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",i1+2,i0+2);       // Zelle ermitteln
       vCell.OlePropertySet("Value", z1.c_str());                                   // Zelle beschreiben
    
       if(i1==0) {                                                                  // ÜBERSCHRIFT
        vFont=vCell.OlePropertyGet("Font");                                         // Fontzugriff übergeben
        vFont.OlePropertySet("Name", WideString("Arial"));                          // Schriftname
        vFont.OlePropertySet("Size", 10);                                           // Schriftgrösse
        vFont.OlePropertySet("Bold" ,true);                                         // Fontstil
        vFont.OlePropertySet("Color",clBlue);                                       // Farbe des Textes
       }                                                                            // ende if(i1==0
    
      }                                                                             // ende for(int i0
     }                                                                              // ende for(int i1
     z1="Summen"; z2=IntToStr(frm21_grdChart->Tag);
     vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",iRow+3,2).OlePropertySet("Value", z1.c_str()); // Summenzeile 1. Spalte
     vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",iRow+3,3).OlePropertySet("Value", z2.c_str()); // Summenzeile 2. Spalte
     vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",iRow+3,4).OlePropertySet("Value", "100");      // Summenzeile 3. Spalte
    
     vCol=vSheet.OlePropertyGet("Columns","C");                                     // Spalte C
     vCol.OlePropertySet("HorizontalAlignment",alRight);                            // rechtsbündig ausrichten
     vCol=vSheet.OlePropertyGet("Columns","D");                                     // Spalte D
     vCol.OlePropertySet("HorizontalAlignment",alRight);                            // rechtsbündig ausrichten
    
     // Ab hier Abstürze mit Breite ???
     vCol=vSheet.OlePropertyGet("Columns","B");                                     // Spalte B
     //vCol.OlePropertySet("ColumnWidth",300);
     //try { vCol.OlePropertySet("AutoFit",true); } catch(...) {}                     // und Breite auf Optimal
    
     // Ab hier Abstürze und Selektierung ???
     //vRange=vSheet.OlePropertyGet("Range","B2:D"+IntToStr(iRow+2));                 // Tabelle auswählen
     //try { vRange.OlePropertySet("Select",true); } catch(...) {}                    // und selektieren
    
     Excel=Unassigned;                                                              // und auflösen
     }                                                                              // try ende
     catch(...) {                                                                   // Fehlerroutine Step
      ShowMessage("Fehler -> TForm21::frm21_btnExcelClick()"); }                    // Fehler anzeigen
    }
    

    Die Zeilen der Abstürze sind am Emde; habe alles mögliche probiert, komme aber nicht weiter. Wie kann ich aus der Tabelle ein Diagramm erzeugen bzw. ein weiteres Arbeitsblatt erzeugen (da stürzt er mir auch immer ab...)

    Danke für jeden Tipp
    Grüsse Stefan



  • versuchs mal so:

    vCol=vSheet.OlePropertyGet("Columns","B");
     vCol.OlePropertySet("ColumnWidth",30);
     vCol.OleFunction("Autofit");
    
     String test = "B2:D"+IntToStr(iRow+2);
     vRange=vSheet.OlePropertyGet("Range",test.c_str());
     vRange.OleFunction("Select");
    

    ein einfacher Test im Excel ergab, dass die Spaltenbreite maximal 255 sein kann



  • Hallo, Linnea

    Supertip! Vielen Dank... 🙂
    Werde mich jetzt an die Diagramme wagen..

    Grüsse, Stefan

    👍


Anmelden zum Antworten