2012-02-28 17 views
13

Nếu tôi có bảng tính mà tôi đã tham chiếu Thư viện đối tượng MS Outlook 14.0 từ trình soạn thảo VBA và người dùng chỉ cài đặt MS Outlook 12.0 thì khi người dùng đó mở bảng tính, họ sẽ gặp lỗi biên dịch trên dòng này:Ngăn ngừa lỗi biên dịch Excel VBA do người dùng có phiên bản MS Office cũ hơn (MS Outlook) được cài đặt?

Range("export_date") = Date - 1 

Nếu họ đi vào Tools, tài liệu tham khảo, trong danh sách tài liệu tham khảo, có lỗi này:

MISSING: MS Outlook 14.0 Object Library 

Nếu họ bỏ chọn thư viện mà, và thay vào đó chọn

MS Outlook 12.0 Object Library

... mã sau đó biên dịch chính xác và bảng tính hoạt động tốt cho chúng.

Tôi không thực sự hiểu tại sao nó không thành công trên hàm Date(), vì đó là hàm VBA, không phải là hàm Outlook. Nhưng quan trọng hơn, có cách nào để tránh tình trạng này không? Điều duy nhất tôi có thể nghĩ đến là không đặt tham chiếu và chỉ sử dụng các biến kiểu Object và khởi tạo qua CreateObject ("Outlook.Application"), v.v ... nhưng tôi ghét từ bỏ việc nhập mạnh, v.v.

Có thể bất cứ ai đề nghị một cách vượt trội để xử lý vấn đề này tương thích ngược với các phiên bản cũ của MS Office?

Trả lời

22

đường trục, những gì bạn gọi là Nhập mạnh được gọi là "Liên kết sớm".

Thật không may là một trong những hạn chế với sự ràng buộc sớm là nếu người dùng cuối không có cùng phiên bản với bạn thì bạn sẽ gặp phải những lỗi đó.

Nếu bạn hỏi tôi, tôi thích Late Binding (nơi bạn không tạo ra tài liệu tham khảo và sử dụng CreateObject để tạo ra một ví dụ)

Một thú đọc.

Chủ đề: Sử dụng đầu ràng buộc và ràng buộc muộn trong Automation

Liên kết: http://support.microsoft.com/kb/245115

Đề nghị của tôi

Đừng bỏ cuộc sớm Binding nếu bạn thích nó vì intellisense. Tuy nhiên trước khi bạn phân phối ứng dụng của mình, hãy thay đổi mã thành Latebinding. Không có nhiều sự khác biệt trong cách bạn viết mã trong Binding sớm và Late Binding.

Dưới đây là một ví dụ

sớm Binding

'~~> Set reference to Excel Object Library 
Sub Sample() 
    Dim oXLApp As Excel.Application 
    Dim oXLBook As Excel.Workbook 
    Dim oXLSheet As Excel.Worksheet 

    '~~> Create a new instance of Excel 
    Set oXLApp = New Excel.Application 
    '~~> Add a new workbook 
    Set oXLBook = oXLApp.Workbooks.Add 
    Set oXLSheet = oXLBook.Worksheets(1) 

    ' 
    '~~> Rest of the code 
    ' 
End Sub 

Late Binding

'~~> Doesn't require a reference to Excel Object Library 
Sub Sample() 
    Dim oXLApp As Object 
    Dim oXLBook As Object 
    Dim oXLSheet As Object 

    '~~> Create a new instance of Excel 
    Set oXLApp = CreateObject("Excel.Application") 
    '~~> Add a new workbook 
    Set oXLBook = oXLApp.Workbooks.Add 
    Set oXLSheet = oXLBook.Worksheets(1) 
    ' 
    '~~> Rest of the code 
    ' 
End Sub 

HTH

Sid

+1

Chết tiệt, câu trả lời của bạn là điều tôi sợ sẽ xảy ra. "... trước khi bạn phân phối ứng dụng của mình, hãy thay đổi mã thành Latebinding". - Nói dễ hơn là xong !!!! :) Sử dụng một thư viện kiểu cũ sẽ là thích hợp hơn nếu một người đã làm rất nhiều điều này, nhưng đối với trường hợp của tôi, tôi sẽ chỉ sử dụng Binding sớm tôi đoán. – tbone

+1

@tbone: tin tôi đi. Nó rất dễ dàng để chuyển đổi một ràng buộc sớm đến một ràng buộc muộn :) –

+2

@tbone trong khi bạn cou \ ld cố gắng thêm tài liệu tham khảo cho các phiên bản khác nhau trong thời gian chạy, tôi sẽ đi với lời khuyên của Sid về điều này. +1 – brettdj

Các vấn đề liên quan