Bereits geöffnetes Excel automatisieren
-
Hi,
ich automatisiere Excel wie folgt (hier startet eine neue Instanz von Excel):
// Initialize COM for this thread... CoInitialize(NULL); // Get CLSID for our server... CLSID clsid; HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); if(FAILED(hr)) { ::MessageBox(NULL, "CLSIDFromProgID() failed", "Error", 0x10010); return -1; } // Start server and get IDispatch... IDispatch *pXlApp; hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp); if(FAILED(hr)) { ::MessageBox(NULL, "Excel not registered properly", "Error", 0x10010); return -2; } [...]
Von da an arbeite ich mit der Variable pXLApp weiter und "sende" die entsprechende Aktionen.
Wenn Excel bereits geöffnet ist, soll das Programm allerdings auf das geöffnete Application-Objekt zugreifen und kein neues Excel öffnen.Folgenden Code-Schnipsel fand ich dazu:
CLSID clsid; LPOLESTR lpszProgID = OLESTR("Excel.Application"); LPUNKNOWN pUnk; HWND hExcelMainWnd =0; hExcelMainWnd = FindWindow("XLMAIN",NULL); if(!hExcelMainWnd) MessageBox(NULL,"No instances of Excel running?","Error",MB_OK); SendMessage(hExcelMainWnd,WM_USER + 18, 0, 0); if (FAILED(CLSIDFromProgID(lpszProgID, &clsid))) return -1; HRESULT hr =GetActiveObject(clsid,NULL,(IUnknown**)&pUnk);
Ich weiß aber nicht, ob das der richtige Weg ist und wie ich zu der Variable pXLApp komme.
Hat jemand eine Tipp für mich?Gruß
Steffen
-
Das Thema hatten wir erst in microsoft.public.de.vc:
http://groups.google.de/group/microsoft.public.de.vc/browse_frm/thread/85b94c2d908ab480/c69977348e703f2e?hl=de&tvc=1&q=rot+excel+disphelper#c69977348e703f2eDu kannst Du ROT Table absuchen und dort die entsprechende Excel Instanz finden.
Du kannst auch die VB/VBS Funktion GetObject nachprogrammieren (Moniker), die Dir gezielt eine existierende Excel Tabele öffnet, oder wenn diese schon offen sit, Dir das Objekt gibt.