访问VBA列出类模块中的集合项

时间:2016-12-16 02:41:26

标签: vba class collections access

虽然我是一位经验丰富的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

1 个答案:

答案 0 :(得分:0)

为了让所有weMouseMove个对象在mLabelColl指针中引用相同的集合,单行可以实现它:

LblToTrack.TrackLabel lbl
mLabelColl.Add LblToTrack
Set LblToTrack.mLabelColl = mLabelColl ' <-- Add this line.

但是请注意,这会导致集合及其包含的对象之间的循环引用,这个问题已知是内存泄漏的来源,但在这种情况下这不应该是一个重要的问题。