【问题标题】:Access VBA listing collection items in a class module访问类模块中的 VBA 列表集合项
【发布时间】:2016-12-16 02:41:25
【问题描述】:

虽然我是经验丰富的 VBA 开发人员,但我不需要使用类模块或集合,但我认为这可能是我扩展知识的机会。

在一个应用程序中,我有许多具有相同功能的表单,我现在需要增加该功能。为此,我试图重新排序类模块中的集合,但收到错误 91 - 对象变量或未设置块。当我将事件分配给控件时,将创建该集合。我从这里获得的原始代码(非常感谢 mwolfe)VBA - getting name of the label in mousemove event

并已适应 Access。事件的分配运行良好,并且所有事件都运行只要我只使用该控件进行操作,例如更改背景颜色、更改窗体上的大小或位置。

当我想在集合中对其重新排序时,问题就出现了 - 以对表单中的位置产生影响。但是我一开始就无法访问集合本身。

以下是我最近的尝试,错误发生在由星号指示的 collcount Get 中(就在代码块的底部)。我正在使用 Count 作为测试。一旦我明白我做错了什么,我应该能够根据需要进行操作。

mLabelColl 在离开 LabelsToTrack 函数之前返回正确的计数,但随后在任何其他函数中都找不到。

正如您从注释掉的调试语句中看到的那样,我尝试在顶部声明中将 mLabelColl 设为 Private 和 Dim,在 mousedown 事件中使用“Debug.Print mLabelColl.Count”并尝试创建一个不同的类来存储标签列表。

我觉得我错过了一些非常简单的东西,但我不知道什么 - 有人可以让我摆脱痛苦

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

【问题讨论】:

  • 不确定我理解您所说的“对表单中的位置有影响”是什么意思。上面的代码与控件定位没有任何关系——那是在控件属性本身中。

标签: vba class ms-access collections


【解决方案1】:

为了让所有weMouseMove 对象在它们的mLabelColl 指针中引用同一个集合,只需一行即可实现:

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

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

【讨论】:

  • 非常感谢您的回复。@Comintern。这个例子只是一个测试
  • @CJ_London 我想知道这是否解决了当前问题(访问集合和计数)。请尽可能提供反馈,谢谢。
  • 非常感谢您的回复。@Comintern。这个例子只是一个测试。一旦我可以访问该集合,我就可以引用该集合。因此,例如,单击事件可能用于更新内部选项卡顺序,或重新定位其他控件。 @A.S.H,不幸的是,添加该行会产生另一个错误 91。我尝试更改为 LblToTrack.mLabelColl.Add mLabelColl,但得到相同的错误。我试图了解集合是如何创建的,并且觉得我正在为尝试这个和那个而苦苦挣扎,以了解什么是有效的,而没有真正理解为什么。我对使用表单集合非常熟悉。
  • 抱歉 A.S.H - 在我完成评论之前按错了按钮!
  • 啊,对不起! Set 丢失,请使用编辑重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
相关资源
最近更新 更多