2016-06-21 26 views
18

Tôi đã trả lời this câu hỏi, rõ ràng cho sự hài lòng của OP, nhưng vẫn thấy câu hỏi của họ khó hiểu. Câu hỏi của họ liên quan đến một biểu thức trong đó một đối tượng sổ làm việc được nối với một chuỗi, kích hoạt Run-time Error '438': Object doesn't support this property or method. Bạn có thể tạo lại loại lỗi này bằng cách chỉ cần nhậpTại sao loại này không phù hợp?

?"Hello, " & ThisWorkbook 

Trong cửa sổ ngay lập tức.

Câu hỏi của tôi là - tại sao điều này tăng lỗi, thay vì lỗi 13 loại không phù hợp? Một dự đoán hợp lý là VBA cố gắng tìm một thuộc tính mặc định cho một đối tượng sổ làm việc và rằng một thuộc tính mặc định không tồn tại. Tuy nhiên, nếu có, tôi hy vọng nó sẽ là lỗi sau đây từ danh sách các mã lỗi Visual Basic 6.0 của Microsoft: Automation object doesn't have a default value (Error 443).

Đó là phần lớn quan tâm học tập, nhưng nếu kết quả của việc ghép một đối tượng không có thuộc tính mặc định bằng chuỗi luôn là Lỗi 438 và đó là cách duy nhất kích hoạt Lỗi 438 thay vì có thể xảy ra lỗi khi ghép nối chuỗi với một đối tượng, sau đó mã sau đây có thể được sử dụng:

Function HasDefault(O As Variant) As Boolean 
    Dim i As Long 
    If Not IsObject(O) Then Exit Function 
    On Error Resume Next 
    i = Len("Hello, " & O) 
    If Err.Number = 438 Then 
     HasDefault = False 
    Else 
     HasDefault = True 
    End If 
End Function 

tôi đã thử nghiệm này trên một loạt các đối tượng, và đối với những người tôi đã thử nghiệm nó trên nó đã trở lại False chính xác khi nào _Default không hiển thị như một thành viên (ẩn) của đối tượng khi được xem trong Trình duyệt đối tượng. Tuy nhiên, tôi không hoàn toàn tin tưởng vào chức năng này và vẫn còn bối rối bởi những gì đang diễn ra ở đây.

+0

Câu trả lời bạn đã trao cho mình có vẻ hoàn toàn ổn với tôi. :) –

Trả lời

9

VBA sẽ thử và chuyển đổi các biểu thức ở mỗi bên của toán tử & thành giá trị dữ liệu. Spec ngôn ngữ nói rằng:

  • Nếu kiểu giá trị của biến mục tiêu của biểu thức là một lớp:
  • Nếu kiểu tuyên bố của mục tiêu là Variant, lỗi runtime 9
    (subscript ra khỏi phạm vi) là nâng lên.
  • Nếu loại được khai báo của mục tiêu không phải là Biến thể và mục tiêu có Thuộc tính mặc định công khai Nhận hoặc hàm, giá trị của giá trị dữ liệu là kết quả của việc gọi thành viên mặc định này cho mục tiêu này với danh sách đối số này. Điều này tiêu thụ danh sách đối số.
  • Nếu không, lỗi thời gian chạy 438 (Đối tượng không hỗ trợ thuộc tính này hoặc phương pháp ) được nâng lên.

Liên quan đến chức năng của bạn, tôi muốn chỉ cần sử dụng:

callbyname(O, "_Default", VbGet) 

mà sẽ nâng cao một lỗi 438 cho phù hợp.

+0

Câu trả lời hay, tôi đã tìm kiếm tài liệu một chút (đó là cách tôi tìm thấy lỗi tối nghĩa 443), nhưng dường như không phải với các từ khóa phù hợp. –

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