2013-12-11 15 views
9

Có chức năng "Đăng ký" hoặc "Biên dịch lại" trước khi sử dụng các hàm được lập trình không?Làm cách nào để sử dụng chức năng bảng tính được tạo lập trình trong VBA

Khi tôi thêm hàm vào trang tính, tôi không thể sử dụng hàm cho đến khi sau khi điều khiển được trả về trang tính.

Ví dụ: Nếu mã của tôi thêm hàm vào trang tính, sau đó cố gắng sử dụng nó, tôi nhận được lỗi sau: Lỗi thời gian chạy 438 - Đối tượng không hỗ trợ thuộc tính hoặc phương pháp này Khi tôi xem mã các bảng tính các hàm có sẵn và nếu tôi chạy mã chỉ sử dụng các hàm đã tạo, không có lỗi.

Làm cách nào để sử dụng các chức năng ngay sau khi tạo chúng mà không dừng trước?

Dưới đây là ví dụ về mã - Tôi gặp lỗi khi chạy TestWorkSheetFunctions nhưng không phải khi tôi chạy TestWorkSheetFunction sau khi các hàm được tạo.

Ví dụ giả định một workbook mới với ít nhất hai tấm (sheet1 và Sheet2)

Option Explicit 

Public Sub TestingWorksheetFunction() 

    AddWorkSheetFunction 

    TestWorkSheetFunction 

End Sub 

Public Sub AddWorkSheetFunction() 

    'Sheet1's Function 
    Dim strFunctionCode As String 
     strFunctionCode = _ 
      "Public Function HelloWorld() as string" & vbCrLf & _ 
      vbCrLf & _ 
      vbTab & "HelloWorld = ""Hello World from Sheet 1""" & vbCrLf & _ 
      vbCrLf & _ 
      "End Function" 
    ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Sheets("Sheet1").CodeName).CodeModule.AddFromString strFunctionCode 

    'Sheet2's Function 
    strFunctionCode = _ 
     "Public Function HelloWorld() as string" & vbCrLf & _ 
     vbCrLf & _ 
     vbTab & "HelloWorld = ""Hello World from Sheet 2""" & vbCrLf & _ 
     vbCrLf & _ 
     "End Function" 
    ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Sheets("Sheet2").CodeName).CodeModule.AddFromString strFunctionCode 

End Sub 

Public Sub TestWorkSheetFunction() 

    Dim wsWorksheet1 As Object 
    Set wsWorksheet1 = ThisWorkbook.Sheets("Sheet1") 
    Dim wsWorksheet2 As Object 
    Set wsWorksheet2 = ThisWorkbook.Sheets("Sheet2") 

    MsgBox wsWorksheet1.HelloWorld() 
    MsgBox wsWorksheet2.HelloWorld() 

End Sub 
+0

Cảm ơn Người qua đường vì đã sửa mã mẫu của tôi. – LastDavid

Trả lời

2

Tôi nghĩ vấn đề ở đây là VBA của bạn sẽ được thêm vào bảng tính và không được biên dịch, do đó khi phần còn lại mã của bạn cố gắng truy cập các chức năng này, chúng được viết, nhưng không phải là một phần của chương trình. Điều này có thể được nhìn thấy khi bạn chạy lại mã và mọi thứ hoạt động tốt.

Hãy cố gắng để chuyển mã mà bạn có trong các thủ tục sau đây để:

Public Sub TestingWorksheetFunction() 

    AddWorkSheetFunction 
    Application.OnTime Now, "TestWorkSheetFunction" 

End Sub 

Bằng cách này, VBA sẽ chạy phần đầu tiên của mã và giải phóng quá trình này, và sau đó là thủ tục "TestWorkSheetFunction" sẽ được gọi ngay lập tức. Quan trọng: Đây là một giải pháp cho vấn đề của bạn, đây có thể không phải là giải pháp tốt nhất, nhưng nó có thể làm việc cho trường hợp cụ thể của bạn.

+1

Câu trả lời hay: điều này phù hợp với tôi. Lý do mã ban đầu không hoạt động là vì khi VBA bắt đầu chạy một thủ tục, các mô-đun mã được biên dịch tại thời điểm đó. Vì vậy, bất kỳ văn bản nào được thêm vào các mô-đun mã trong quá trình chạy sẽ không tự động được biên dịch lại. Giải pháp của Abe đảm bảo rằng một quá trình riêng biệt được bắt đầu cho phần thứ hai của hàm, có nghĩa là mã thực sự được biên dịch lại. –

0

Excel không thể gọi thói quen "phụ" trong công thức ô. Bạn cần phải tạo chúng bằng cách sử dụng một thủ tục hàm dưới một mô-đun để đảm bảo rằng nó có sẵn trên toàn bộ tài liệu.

Public Function testFunc() 

    Code here 

End Function 

Bây giờ bạn có thể sử dụng chức năng trong trang tính hoặc các quy trình khác.

Chức năng của bạn có thể gọi các thủ tục loại phụ và chức năng khác trong khối mã của nó.

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