Tôi có mười trình đơn thả xuống trên một trang tính mỗi trong số đó sẽ phản hồi giống với sự kiện GotFocus()
.Làm thế nào để gán một sự kiện cho nhiều đối tượng với excel vba?
Tôi đã viết đoạn mã sau nhưng tôi nhận được một lỗi thời gian chạy (459) - "Object hoặc lớp không hỗ trợ các thiết lập nếu sự kiện"
Trong một lớp được gọi là clsPDRinput
Tôi đã điều sau đây:
Public WithEvents inputObj As OLEObject
Public Property Set myInput(obj As OLEObject)
Set inputObj = obj
End Property
Public Sub tbPDRInput_GotFocus()
//Do some stuff...
End Sub
tôi sau đó chạy đoạn mã sau đó là sản xuất các lỗi:
Dim tbCollection As Collection
Public Sub InitializePDRInput()
Dim myObj As OLEObject
Dim obj As clsPDRInput
Set tbCollection = New Collection
For Each myObj In Worksheets("1. PDR Documentation").OLEObjects
If TypeName(myObj.Object) = "ComboBox" Then
Set obj = New clsPDRInput
Set obj.myInput = myObj <-- **THIS LINE THROWS ERROR**
tbCollection.Add obj
End If
Next myObj
Set obj = Nothing
End Sub
tôi không chắc chắn điều gì gây ra lỗi này. Mặc dù tôi có là OLEObject
quá chung chung và không phải mọi sự kiện OLEObject
đều hỗ trợ sự kiện GotFocus()
và đó là lý do mã này đưa ra thông báo lỗi?
Tôi đã thử thay thế OLEObject
bằng MSForms.ComboBox
nhưng điều đó không giải quyết được sự cố.
Bất kỳ ý tưởng - có googled cho hai tiếng đồng hồ bây giờ và đưa ra trống ...
EDIT - Cập nhật về những gì tôi nghĩ rằng vấn đề là ...
tôi đã điều tra hơn và đây là những gì vấn đề là xa như tôi có thể nói.
- Nếu bạn khai báo một biến như
OLEObject
(như trong...inputObj as OLEObject
) thì chỉ sự kiện tiếp xúc làGotFocus()
vàLostFocus()
. - Nếu bạn khai báo một biến như
MSForms.ComboBox
(như trong...inputObj as MSForms.ComboBox
) sau đó một loạt các sự kiện được tiếp xúc (ví dụChange()
,Click()
,DblClick()
) nhưng sự kiệnGotFocus()
vàLostFocus()
là không tiếp xúc
điểm 1 và 2 phù hợp với mô hình đối tượng trong excel. Do đó, khi tôi cố chỉ định một số ComboBox
cho lớp học của mình, tôi gặp lỗi (xem bài đăng gốc) vì ComboBox
không hỗ trợ các sự kiện GotFocus()
và LostFocus
.
Bây giờ cho câu đố. Nếu tôi thêm một ComboBox vào một bảng tính (bằng cách sử dụng Control ToolBox
) và tôi nhấp đúp vào ComboBox để nhận được mã sau đó tất cả các sự kiện được tiếp xúc, bao gồm GotFocus()
và LostFocus()
!
'Đối với mỗi myObj' ...' Đầu vào tiếp theoObj' không nhất quán và sẽ không biên dịch, tôi nghĩ vậy. Đây có phải là mã thực của bạn không? –
Ngoài ra, 'Dim tbCollection As Collection' nằm trong lớp của bạn, nhưng bạn sử dụng' tbCollection' trong 'Sub InitializePDRInput', mà tôi đoán là trong một mô-đun. Những gì đang xảy ra ở đây? –
@ Jean-Francois Corbett - Về điểm đầu tiên của bạn, đây là phiên bản cắt mã. Vấn đề 'For each..' bạn chỉ là một lỗi đánh máy (tôi sẽ sửa bài viết). Đối với điểm 2, một lần nữa, typo - 'Dim tbCollection ...' nằm trong một mô-đun –