Excel-Makro starten



  • Hallo zusammen!
    Ich möchte von einer C++ - Anwendung aus ein Makro in einer bestimmten Excel-Mappe starten. Kann mir da jemand weiterhelfen.
    Besten Dank.



  • So lautet der VB-Code, um ein Makro zu starten:

    Sub startMakro()
    Application.Run "Mappe1!test_makro"
    End Sub

    Dieses Makro musst du nun eben in C++ "übersetzen".
    Schau dir dazu mal die Möglichkeit an, wie du über OLE Excel ansteuern kannst.
    Kleine Hilfe, wie du zu Excel eine Verbindung aufbauen kansst:

    // Variablendeklaration
      Variant Excel;
    
      // versuche Excel zu öffnen,
      // falls schon offen -> OK
      // falls geschlossen -> erzeuge neue Instanz
      try
      {
        // Excel ist bereits geöffnet
        Excel = GetActiveOleObject("Excel.Application");
      }
      catch(...)
      {
        // Excel ist noch nicht geöffnet
        Excel = CreateOleObject("Excel.Application");
      }
    


  • Besten Dank JeGr erstmal.
    Der sonstige Umgang mit Excel ist kein Problem.
    Also ein Mappe öffnen, Daten auslesen/einfügen,...
    Nur mit den Makros hab ich Schwierigkeiten.
    Könntest du da evtl. noch ein bisschen detaillierter drauf
    eingehen?

    Danke.



  • Dann erzähl erst mal, WIE du genau auf Excel zugreifst?
    Benutzt du die Komponenten aus dem BCB oder über die OLE-Schnittstelle?
    Zeig auch mal den Code-Abschnitt, in dem du auf Excel zugreift und wo du dann das Makro ausführen willst.

    Ohne diese Informationen kann ich dir nicht wirklich weiterhelfen.



  • Ich verwende die OLE-Funktionen, da ich mit den BCB-Components keinen Erfolg hatte. Hat zwar mit Word super gefunzt, aber mit Excel hatte ich so meine Probleme. Egal.
    Hier mein Source.
    (Enthält für das Ausführen von Makros ein paar unwichtige Sachen, aber egal)

    void __fastcall TfrmOLEFunktions::WriteCell(char *chFileName, char *chExcelSheet, char *chExcelCell, pExcelCells pECell)
    {
    Variant all_workbooks;
    Variant my_workbook;
    Variant all_worksheets;
    Variant my_worksheet;
    Variant my_range;

    PropertyGet Range("Range");
    PropertySet SetValue("Value");
    PropertySet SetFormula("Formula");
    PropertyGet GetValue("GetValue");
    PropertyGet GetFormula("GetFormula");
    PropertySet Visible("Visible");

    Procedure Open("Open");
    Procedure Activate("Activate");

    Variant my_excel=Variant::CreateObject("excel.application");
    my_excel.Exec(Visible << 0);

    all_workbooks = my_excel.OlePropertyGet("Workbooks");
    all_workbooks.Exec(Open << chFileName);

    my_workbook = my_excel.OlePropertyGet("ActiveWorkbook");
    all_worksheets = my_workbook.OlePropertyGet("Sheets");

    my_worksheet = my_workbook.OlePropertyGet("Worksheets", chExcelSheet);
    my_worksheet.OleFunction("Activate");

    "****Hier sollte das Makro "XY" ausgeführt werden*****"

    my_excel.OleFunction("Quit");
    my_excel = Unassigned;

    }



  • Also, ist doch gar nicht so schwer:

    #include <utilcls.h>
    
      // Variablendeklaration
      Variant Excel;
    
      // versuche Excel zu öffnen,
      // falls schon offen -> OK
      // falls geschlossen -> erzeuge neue Instanz
      try
      {
        // Excel ist bereits geöffnet
        Excel = GetActiveOleObject("Excel.Application");
      }
      catch(...)
      {
        // Excel ist noch nicht geöffnet
        Excel = CreateOleObject("Excel.Application");
      }
    
      // versuche die Excel-Datei zu öffnen
      // und das Makro "Mein_Makro" auszuführen
      try
      {
        // Variablendeklaration
        Variant WorkBooks;
    
        // ermittle alle Workbooks
        WorkBooks = Excel.OlePropertyGet("WorkBooks");
        // öffne die Excel-Datei
        WorkBooks.OleFunction("Open", "C:\\Temp\\Makro_Test.xls");
        // führe Makro aus
        Excel.OleFunction("Run", "Mein_Makro");
        // mache Excel sichtbar
        Excel.OlePropertySet("Visible", true);
      }
      // Fehlerbehandlung
      catch(...)
      {
        // schliesse Excel-Datei
        Excel.OleFunction("Quit");
        Excel = Unassigned;
      }
    


  • Jo, jetzt hauts hin.
    Super! Besten Dank. 🙂



  • Den Tipp finde ich sehr gut!
    Wie erstellt man jedoch mittels C++Builder mit später
    Bindung ein Makro?

    Gruss



  • Ich weiss, dass das Dingen schon ewig alt ist... ich versuche jedoch gerade etwas ähnliches.

    Bei bringt der Code

    try
                    {
                            var_Excel = GetActiveOleObject("Excel.Application");
                    }
                    catch(...)
                    {
                            var_Excel=CreateOleObject("Excel.Application");
                            // Excelinstanz zu Kontrollzwecken sichtbar machen
                            var_Excel.OlePropertySet("Visible", FVisible);
                    }
    

    jedoch eine Fehlermeldung, wenn kein Excel prozess mehr im Gange ist.
    Heißt GetActiveObject wirft eine Exception. Diese wird gemeldet und angezeigt, was ich verhindern will. Führe ich jedoch das Programm fort springt er in die catch Anweisung.

    Eine Idee?

    Danke schon mal.



  • Hallo

    Die Borland IDE zeigt im Debug-Modus immer alle Exceptions an egal ob sie im Programm noch behandelt wird (kann man irgendwo in den Projekt-Optionen auch auschalten, afaik). Starte mal das Programm ohne IDE, du wirst sehen das die Exception nicht angezeigt wird.

    bis bald
    akari


Anmelden zum Antworten