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 SubDieses 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