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


  • Mod

    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#c69977348e703f2e

    Du 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.


Anmelden zum Antworten