Mit Microsoft anmelden
Melden Sie sich an, oder erstellen Sie ein Konto.
Hallo,
Wählen Sie ein anderes Konto aus.
Sie haben mehrere Konten.
Wählen Sie das Konto aus, mit dem Sie sich anmelden möchten.

Problembeschreibung

Wenn Sie versuchen, GetObject (Microsoft Visual Basic) oder GetActiveObject (Microsoft Visual C++) zu verwenden, um eine Microsoft Office-Anwendung zu automatisieren, erhalten Sie eine der folgenden Fehlermeldungen, obwohl die Office-Anwendung ausgeführt wird:

Fehlermeldung 1

Laufzeitfehler "429": ActiveX-Komponente kann kein Objekt erstellen

Fehlermeldung 2

Fehler: 0x800401e3 "Vorgang nicht verfügbar"

Ursache

Obwohl die Office-Anwendung ausgeführt wird, ist Sie möglicherweise nicht in der ausgeführten Objekttabelle (rot) registriert. Eine ausgeführte Instanz einer Office-Anwendung muss in der rot registriert werden, bevor Sie an die Verwendung von GetObject (Visual Basic) oder GetActiveObject (Visual C++) angefügt werden kann. Wenn eine Office-Anwendung gestartet wird, werden die ausgeführten Objekte nicht sofort registriert. Dadurch wird der Startvorgang der Anwendung optimiert. Statt beim Start zu registrieren, registriert eine Office-Anwendung ihre ausgeführten Objekte in der rot, sobald Sie den Fokus verliert. Wenn Sie versuchen, eine Verbindung mit GetObject oder GetActiveObject an eine ausgeführte Instanz einer Office-Anwendung anzufügen, bevor die Anwendung den Fokus verloren hat, wird möglicherweise einer der oben aufgeführten Fehler angezeigt.

Fehlerbehebung

Mithilfe von Code können Sie den Fokus von der Office-Anwendung auf Ihre eigene Anwendung (oder auf eine andere Anwendung) ändern, damit Sie sich selbst in der rot registrieren kann. Wenn im Code die exe-Datei der Office-Anwendung gestartet wird, müssen Sie möglicherweise warten, bis die Office-Anwendung das Laden beendet hat, bevor Sie versuchen, eine Verbindung mit der ausgeführten Instanz herzustellen. Ein Codebeispiel wird im Abschnitt "Weitere Informationen" als Problemumgehung bereitgestellt.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

In den meisten Fällen müssen Entwickler, die eine Office-Anwendung automatisieren möchten, CreateObject (Visual Basic) oder CoCreateInstance (Visual C++) verwenden, um eine neue Instanz der Office-Anwendung zu starten. Es gibt jedoch Fälle, in denen Sie möglicherweise eine Office-Anwendung automatisieren möchten, die bereits ausgeführt wird, beispielsweise wenn der Benutzer zuvor die Office-Anwendung gestartet hat. Wenn Sie die ausführbare Datei der Office-Anwendung mithilfe von Code gestartet haben, können Sie Befehlszeilenoptionen für die Anwendung angeben. Um die ausgeführte Office-Anwendung zu automatisieren, müssen Sie GetObject oder GetActiveObjectverwenden.

Schritte zum Reproduzieren des Verhaltens

  1. Starten Sie Microsoft Visual Basic, und erstellen Sie ein neues Standard-EXE-Projekt. Form1 wird standardmäßig erstellt.

  2. Fügen Sie Form1 ein Befehlsschaltflächen -Steuerelement hinzu.

  3. Fügen Sie dem Code Modul des Formulars den folgenden Code hinzu.

    Private Sub Command1_Click()    Dim oExcel As Object    ' Launch a new instance of Microsoft Excel:    Shell "C:\Program Files\Microsoft Office\Office\Excel.EXE", _       vbMinimizedNoFocus    ' An error 429 occurs on the following line:    Set oExcel = GetObject(, "Excel.Application")    MsgBox oExcel.Name    Set oExcel = NothingEnd Sub
  4. Stellen Sie sicher, dass der Speicherort der Datei "Excel. exe" im Codebeispiel richtig ist.

  5. Beenden Sie Microsoft Excel, wenn es bereits ausgeführt wird.

  6. Drücken Sie F5, um das Projekt auszuführen, und klicken Sie auf Command1.

Problemumgehung

Um das Problem zu umgehen, haben Sie folgende Möglichkeiten:

  • Geben Sie den Fokus auf die Office-Anwendung, indem Sie das zweite Argument der Shell-Funktion auf vbMinimizedFocus, vbMaximizedFocusoder vbNormalFocusändern.

  • Verleihen Sie Ihrem Visual Basic-Formular den Fokus.

  • Versuchen Sie GetObject , während Sie die Ladezeit der Office-Anwendung in Rechnung stellen.

Der folgende überarbeitete Code veranschaulicht diese Problemumgehung.

Private Declare Sub Sleep Lib "kernel32" _    (ByVal dwMilliseconds As Long)Private Sub Command1_Click()    Dim intSection As Integer    Dim intTries As Integer    Dim oExcel As Object        ' Enable error handler for this procedure:    On Error GoTo ErrorHandler        ' Launch Microsoft Excel, giving it focus:    Shell "C:\Program Files\Microsoft Office\Office\Excel.EXE", _        vbMinimizedFocus 'other options for starting with        'focus: vbMaximizedFocus and vbNormalFocus        ' Move focus back to this form. (This ensures the Office    '  application registers itself in the ROT, allowing    '  GetObject to find it.)    Me.SetFocus        ' Attempt to use GetObject to reference the running    '  Office application:    intSection = 1 'attempting GetObject...    Set oExcel = GetObject(, "Excel.Application")    intSection = 0 'resume normal error handling        ' Now you can automate Microsoft Excel:    MsgBox oExcel.Name & ": able to GetObject after " & _        intTries + 1 & " tries.", vbMsgBoxSetForeground        ' Finished with automation so release your reference:    Set oExcel = Nothing        ' Exit procedure:    Exit Sub    ErrorHandler:    If intSection = 1 Then 'GetObject may have failed because the    'Shell function is asynchronous; enough time has not elapsed    'for GetObject to find the running Office application. Wait    'wait 1/2 seconds and retry the GetObject. If you try 20 times    'and GetObject still fails, assume some other reason    'for GetObject failing and exit the procedure.        intTries = intTries + 1        If intTries < 20 Then            Sleep 500 ' wait 1/2 seconds            Resume 'resume code at the GetObject line        Else            MsgBox "GetObject still failing. Process ended.", _                vbMsgBoxSetForeground        End If    Else 'intSection = 0 so use normal error handling:        MsgBox Error$    End IfEnd Sub

Problemumgehung für C++

Wenn Sie in C++ programmieren, wird im folgenden Codebeispiel eine ähnliche Problemumgehung veranschaulicht, die im obigen Visual Basic-Beispiel gezeigt wird. Beachten Sie, dass SetForegroundWindow verwendet wird, um den Fokus von Excel zu verschieben, sodass er seine ausgeführten Objekte registrieren kann.

//Store the handle of the currently active window...HWND hwndCurrent = ::GetForegroundWindow();//Launch Excel and wait until it is waiting for//user input...STARTUPINFO Start;PROCESS_INFORMATION ProcInfo;ZeroMemory(&Start,sizeof(STARTUPINFO));Start.cb=sizeof(Start);Start.dwFlags = STARTF_USESHOWWINDOW;Start.wShowWindow = SW_SHOWMINIMIZED;//Change the path to Excel as needed...LPSTR pszExcelPath =       "c:\\program files\\microsoft office\\office\\excel.exe";::CreateProcess(NULL, pszExcelPath, 0, 0, 1,       NORMAL_PRIORITY_CLASS, 0, NULL, &Start, &ProcInfo);if((::WaitForInputIdle(ProcInfo.hProcess, 10000))==WAIT_TIMEOUT){    ::MessageBox(NULL, "Timed out waiting for Excel.", NULL,                   MB_OK);}//Restore the active window to the foreground...//  NOTE: If you comment out this line, the code will fail!::SetForegroundWindow(hwndCurrent);//Initialize COM library...::CoInitialize(NULL);//Attach to the running instance...CLSID clsid;CLSIDFromProgID(L"Excel.Application", &clsid);  IUnknown *pUnk = NULL;IDispatch *pDisp = NULL;for(int i=1;i<=5;i++) //try attaching for up to 5 attempts{   HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);   if(SUCCEEDED(hr))    {       hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);       break;   }   ::Sleep(1000);}        if (!pDisp) {    ::MessageBox(NULL, "Failed to find instance!!", "Error",                  MB_ICONHAND);}else {    ::MessageBox(NULL, "Got instance of Excel!", "Success", MB_OK);}//Release the no-longer-needed IUnknown...if (pUnk)     pUnk->Release();//... Add your automation code for Excel here ...//Release pDisp when no longer needed...if (pDisp)    pDisp->Release();//Cleanup COM...CoUninitialize();

Informationsquellen

Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:

192919 Automatisieren einer sicheren Access-Datenbank mit Visual Basic

237338 Fehlermeldung mit WordMail: "Diese Methode oder Eigenschaft ist nicht verfügbar"

240794 So ermitteln Sie den Pfad für eine Office-Anwendung

Benötigen Sie weitere Hilfe?

Ihre Office-Fähigkeiten erweitern
Schulungen erkunden
Neue Funktionen als Erster erhalten
Microsoft Insider beitreten

War diese Information hilfreich?

Wie zufrieden sind Sie mit der Sprachqualität?
Was hat Ihre Erfahrung beeinflusst?

Vielen Dank für Ihr Feedback!

×