虽然我是一位经验丰富的VBA开发人员,但我没有必要使用类模块或集合,但认为这可能是我扩展知识的机会。
在一个应用程序中,我有许多形式都具有相同的功能,我现在需要增加该功能。为此,我试图在类模块中重新排序集合,但得到错误91 - 对象变量或未设置块。当我将事件分配给控件时,将创建该集合。我从这里获得的原始代码(非常感谢mwolfe)VBA - getting name of the label in mousemove event
并已适应Access。事件的分配运作良好,并且所有事件都可以正常工作提供我只使用该控件执行某些操作,例如更改表单上的背景颜色,更改大小或位置。
当我想在集合中重新排序时,问题出现了 - 以便对表单中的位置产生影响。但是我首先无法访问该集合。
以下是我最近的尝试,错误发生在collcount中由星号表示(位于代码块的底部)。我使用Count作为测试。一旦我理解了我做错了什么,我就应该能够根据需要进行操作。
mLabelColl在离开LabelsToTrack函数之前返回正确的计数,但在任何其他函数中都找不到。
正如您将从注释掉的调试语句中看到的那样,我尝试在顶级声明中使用mLabelColl Private和Dim,使用' Debug.Print mLabelColl.Count'在mousedown事件中并尝试创建一个不同的类来存储标签列表。
我觉得我错过了一些非常简单的事情,但我不知道是什么 - 有人可以把我从痛苦中解救出来
Option Compare Database
Option Explicit
'weMouseMove class module:
Private WithEvents mLbl As Access.Label
Public mLabelColl As Collection
'Dim LblList as clLabels
Function LabelsToTrack(ParamArray labels() As Variant)
Set mLabelColl = New Collection 'assign a pointer
Dim i As Integer
For i = LBound(labels) To UBound(labels)
'Set mLabelColl = New Collection events not assigned if set here
Dim LblToTrack As weMouseMove 'needs to be declared here - why?
Set LblToTrack = New weMouseMove 'assign a pointer
Dim lbl As Access.Label
Set lbl = labels(i)
LblToTrack.TrackLabel lbl
mLabelColl.Add LblToTrack 'add to mlabelcoll collection
'Set LblList as New clLabels
'LblList.addLabel lbl
Next i
Debug.Print mLabelColl.Count 'returns correct number
Debug.Print dsform.countcoll '1 - incorrect
End Function
Sub TrackLabel(lbl As Access.Label)
Set mLbl = lbl
End Sub
Private Sub mLbl_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
Dim tLbl As Access.Label
'Debug.Print LblList.Count 'Compile error - Expected function or variable (Despite Count being an option
'Debug.Print mLabelColl.Count 'error 91
'Debug.Print LblList.CountLbls 'error 91
Debug.Print collCount
End Sub
Property Get collCount() As Integer
*collCount = mLabelColl.Count* 'error 91
End Property
答案 0 :(得分:0)
为了让所有weMouseMove
个对象在mLabelColl
指针中引用相同的集合,单行可以实现它:
LblToTrack.TrackLabel lbl
mLabelColl.Add LblToTrack
Set LblToTrack.mLabelColl = mLabelColl ' <-- Add this line.
但是请注意,这会导致集合及其包含的对象之间的循环引用,这个问题已知是内存泄漏的来源,但在这种情况下这不应该是一个重要的问题。