Bỏ qua để tới nội dung chính
Đăng nhập với Microsoft
Đăng nhập hoặc tạo một tài khoản.
Xin chào,
Chọn một tài khoản khác.
Bạn có nhiều tài khoản
Chọn tài khoản bạn muốn đăng nhập.

Triệu chứng

Khi bạn tìm cách sử dụng GetObject (Microsoft Visual Basic) hoặc gethuật ngữ (Microsoft Visual C++) để tự động hóa ứng dụng Microsoft Office, bạn sẽ nhận được một trong các thông báo lỗi sau đây, mặc dù ứng dụng Office đang chạy:

Thông báo lỗi 1

Lỗi thời gian chạy ' 429 ': cấu phần ActiveX không thể tạo đối tượng

Thông báo lỗi 2

Lỗi: 0x800401e3 "chiến dịch không sẵn dùng"

Nguyên nhân

Mặc dù ứng dụng Office đang chạy, có thể nó không được đăng ký trong bảng đối tượng chạy (ROT). Phiên bản chạy của một ứng dụng Office phải được đăng ký ở THỐI trước khi có thể được đính kèm để dùng GetObject (Visual Basic) hoặc gethuật ngữ (Visual C++). Khi ứng dụng Office bắt đầu, nó không ngay lập tức đăng ký đối tượng đang chạy. Điều này sẽ tối ưu hóa quy trình khởi động ứng dụng. Thay vì đăng ký lúc khởi động, ứng dụng Office sẽ đăng ký các đối tượng đang chạy trong THỐI sau khi nó mất tập trung. Vì vậy, nếu bạn tìm cách sử dụng GetObject hoặc gec đối tượng để đính kèm vào một thể hiện của một ứng dụng Office trước khi ứng dụng đã mất tập trung, bạn có thể nhận được một trong các lỗi bên trên.

Giải pháp

Sử dụng mã, bạn có thể thay đổi tiêu điểm từ ứng dụng Office đến ứng dụng của riêng bạn (hoặc một số ứng dụng khác) để cho phép đăng ký chính nó trong ROT. Ngoài ra, nếu mã của bạn đang khởi chạy tệp exe của ứng dụng Office, bạn có thể phải đợi ứng dụng Office để hoàn tất việc tải trước khi tìm cách đính kèm vào phiên bản đang chạy. Mẫu mã được cung cấp như một giải pháp thay thế trong phần "thông tin thêm".

Trạng thái

Hành vi này là do thiết kế.

Thông tin Bổ sung

Trong hầu hết các tình huống, các nhà phát triển muốn tự động hóa ứng dụng Office cần sử dụng CreateObject (Visual Basic) hoặc CoCreateInstance (Visual C++) để khởi động một phiên bản mới của ứng dụng Office. Tuy nhiên, có những trường hợp bạn có thể muốn tự động hóa ứng dụng Office vốn đang chạy: ví dụ, nếu người dùng trước đó đã bắt đầu ứng dụng Office. Hoặc, nếu bạn khởi động ứng dụng ứng dụng Office bằng cách sử dụng mã để bạn có thể xác định khóa chuyển dòng lệnh cho ứng dụng. Để tự động hóa ứng dụng Office đang chạy, bạn phải sử dụng GetObject hoặc Gethuật _ đối tượng.

Các bước để tái tạo hành vi

  1. Khởi động Microsoft Visual Basic và tạo một dự án EXE tiêu chuẩn mới. Form1 được tạo theo mặc định.

  2. Thêm điều khiển nút commando vào Form1.

  3. Thêm mã sau đây vào mô-đun mã của biểu mẫu.

    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. Hãy đảm bảo rằng vị trí của Excel. exe chính xác trong mẫu mã.

  5. Thoát khỏi Microsoft Excel nếu nó đang chạy.

  6. Nhấn F5 để chạy dự án, rồi bấm vào command1.

Cách giải quyết

Để giải quyết vấn đề, bạn có thể:

  • Cung cấp tiêu điểm cho ứng dụng Office bằng cách thay đổi đối số thứ hai của hàm Shell thành tiêu điểm Vbthu Zed,tiêu điểm Vbmaximizedhoặcvbnormaltiêu điểm.

  • Cung cấp cho biểu mẫu hình ảnh cơ bản của bạn tiêu điểm.

  • Thử GetObject trong khi tính toán thời gian tải của ứng dụng Office.

Mã được sửa đổi sau đây minh họa giải pháp thay thế này.

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

Giải pháp thay thế cho C++

Nếu bạn đang lập trình bằng C++, mẫu mã sau đây thể hiện một giải pháp thay thế tương tự như hiển thị trong mẫu hình ảnh cơ bản ở trên. Lưu ý rằng cửa sổ tăng thêm được sử dụng để di chuyển tiêu điểm ra khỏi Excel, cho phép đăng ký các đối tượng đang chạy.

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

Tham khảo

Để biết thêm thông tin, bấm số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:

192919 Cách tự động hóa cơ sở dữ liệu Access có thể sử dụng Visual Basic

237338 Thông báo lỗi bằng WordMail: "phương pháp hoặc thuộc tính này không sẵn dùng"

240794 Cách xác định đường dẫn cho một ứng dụng Office

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.

Cộng đồng giúp bạn đặt và trả lời các câu hỏi, cung cấp phản hồi và lắng nghe ý kiến từ các chuyên gia có kiến thức phong phú.

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?
Khi nhấn gửi, phản hồi của bạn sẽ được sử dụng để cải thiện các sản phẩm và dịch vụ của Microsoft. Người quản trị CNTT của bạn sẽ có thể thu thập dữ liệu này. Điều khoản về quyền riêng tư.

Cảm ơn phản hồi của bạn!

×