Prisijunkite prie „Microsoft“
Prisijunkite arba sukurkite paskyrą.
Sveiki,
Pasirinkti kitą paskyrą.
Turite kelias paskyras
Pasirinkite paskyrą, kurią naudodami norite prisijungti.

Simptomai

Kai bandote naudoti GetObject ("Microsoft Visual Basic") arba getactiveobject ("Microsoft Visual C++"), kad automatizuotumėte "Microsoft Office" taikomąją programą, galite gauti vieną iš šių klaidos žinučių, net jei paleista "Office" taikomoji programa:

1 klaidos pranešimas

Vykdymo laiko klaida "429": "ActiveX" komponentas negali kurti objekto

2 klaidos pranešimas

Klaida: 0x800401ev3 "operacija neprieinama"

Priežastis

Nors "Office" taikomoji programa veikia, ji gali būti neregistruota "veikia objektų" lentelėje (puvinio). Su "Office" taikomosios programos vykdytu egzemplioriumi turi būti užregistruotas puvinio, prieš jį prisegimas prie " GetObject " ("Visual Basic") arba getactiveobject ("Visual C++"). Kai "Office" taikomoji programa pradedama, ji iš karto neregistruoja savo veikiančių objektų. Taip optimizyra taikomosios programos paleisties procesas. Vietoj to, kad užsiregistruosite paleisties metu, "Office" taikomoji programa užregistruos jo einamus objektus. Todėl jei bandote naudoti GetObject arba getactiveobject , kad galėtumėte pridėti prie "Office" taikomosios programos "Office" taikomosios programos, prieš suaktyvintą taikomąją programą, galite gauti vieną iš anksčiau pateiktų klaidų.

Sprendimas

Naudodami kodą, galite pakeisti įvesties vietą iš "Office" programos į savo programą (arba į kitą taikomąją programą), kad ją būtų galima užregistruoti kaip puvinį. Be to, jei jūsų kodas pradeda "Office" taikomosios programos "exe" failą, gali tekti palaukti, kol "Office" taikomoji programa baigs krauti prieš bandant pridėti prie vykdomos instancijos. Kodo pavyzdys pateikiamas kaip sprendimo būdas skyriuje "daugiau informacijos".

Statusą

Šią problemą galima sukurti pagal dizainą.

Daugiau informacijos

Daugeliu atvejų kūrėjai, kurie nori automatizuoti "Office" taikomąją programą, turi naudoti " CreateObject " ("Visual Basic") arba " CoCreateInstance " ("Visual C++"), kad būtų paleistas naujas "Office" programos egzempliorius. Tačiau yra atvejų, kai galbūt norėsite automatizuoti "Office" programą, kuri jau paleista: pvz., jei vartotojas anksčiau pradėjo naudoti "Office" taikomąją programą. Arba, jei Paleidome "Office" taikomosios programos vykdomąjį failą naudodami kodą, kad galėtumėte nustatyti taikomosios programos komandų eilutės perjungtuvus. Norėdami automatizuoti veikiančią "Office" taikomąją programą, turite naudoti GetObject arba getactiveobject.

Veikimo atkūrimo veiksmai

  1. Paleiskite "Microsoft Visual Basic" ir sukurkite naują standartinį EXE projektą. Form1 sukuriamas pagal numatytuosius numatytuosius.

  2. Įtraukite CommandButton valdiklį į Form1.

  3. Įtraukite šį kodą į formos kodo modulį.

    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. Įsitikinkite, kad kodo pavyzdyje "Excel. exe" vieta teisinga.

  5. Išeikite iš "Microsoft Excel", jei ji jau paleista.

  6. Paspauskite F5, kad paleistumėte projektą, ir spustelėkite Command1.

Sprendimas

Norėdami išspręsti problemą, galite:

  • Sutelkite dėmesį į "Office" taikomąją programą pakeisdami antrąjį apvalkalo funkcijos argumentą į Vbminimizedfocus, vbmaximizedfocusarba vbnormalfocus.

  • Suteikite savo "Visual Basic" formos įvesties vietą.

  • Mėginimas GetObject , kai naudojama "Office" taikomosios programos įkėlimo laikas.

Šis persvarstytas kodas iliustruoja šį sprendimo būdą.

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

Sprendimo būdas, skirtas C++

Jei esate programavimas "C++", toliau pateiktas kodo pavyzdys rodo panašų sprendimo būdą, rodomą anksčiau pateiktame "Visual Basic" pavyzdyje. Atkreipkite dėmesį, kad " Setforeground" langas yra naudojamas perkelti dėmesį nuo "Excel", kad būtų galima užregistruoti jo einamus objektus.

//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();

Nuorodos

Jei reikia daugiau informacijos, spustelėkite toliau pateiktus straipsnio numerius ir peržiūrėkite straipsnius "Microsoft" žinių bazėje:

192919 Kaip automatizuoti saugią "Access" duomenų bazę naudojant "Visual Basic"

237338 Klaidos pranešimas naudojant "WordMail": "Šis metodas arba ypatybė neprieinama"

240794 Kaip nustatyti "Office" taikomosios programos kelią

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.

Ar ši informacija buvo naudinga?

Ar esate patenkinti kalbos kokybe?
Kas turėjo įtakos jūsų įspūdžiams?
Paspaudus mygtuką Pateikti, jūsų atsiliepimai bus naudojami tobulinant „Microsoft“ produktus ir paslaugas. Jūsų IT administratorius galės rinkti šiuos duomenis. Privatumo patvirtinimas.

Dėkojame už jūsų atsiliepimą!

×