gpt4 book ai didi

excel - 在VBA中创建可循环容器类

转载 作者:行者123 更新时间:2023-12-02 09:55:15 24 4
gpt4 key购买 nike

我一直在尝试清理我的代码,使其更类似于 Excel 对象模型,我想知道是否可以在 VBA 中创建一个“可循环”容器类,例如类似于您可以执行的操作:

Dim Sheet As Worksheet
For Each Sheet In ThisWorkbook.Worksheets
' ...
Next Sheet

我想为我自己的容器提供此功能。

假设我创建了自己的名为 Container 的类,其中包含某个类 ItemType 的项目(对于本例来说,这可以只是一个空类):

' Class Container
' The container contains items of a class I will call ItemType

Private Type MContainer
Items As Collection ' Could also be implemented in terms of an array
End Type

Private This As MContainer

Public Property Get Item(ByVal Index As Long) As ItemType
Attribute Item.VB_UserMemId = 0 'Makes it so I can access elements like a Collection
Set Item = This.Items(Index)
End Property

Public Function Add() As ItemType
This.Items.Add
Set Add = This.Items(This.Items.Count)
End Function

Private Sub Class_Initialize()
Set This.Items = New Collection
End Sub

然后我想使用 For Each... 循环遍历容器中的项目,但这不起作用。请参阅以下示例,了解我理想中希望它如何工作:

Public Sub MyMethod()

Dim Stuff As New Container
Stuff.Add

Dim Element As ItemType
For Each Element In Stuff ' <- This will not work
' Do something
Next Element

End Sub

最后的 For 循环是我正在寻找的工作。这可能吗?基本上问题是我无法在我的 Container 类上调用 For Each ,类似于您可以使用的方式,例如Excel.Sheets 类。这可以用VBA实现吗?

最佳答案

For Each 迭代需要特殊的成员属性值才能工作,以及返回 IUnknownNewEnum 属性或函数。

每个可以使用 For Each 循环迭代的集合类都有一个隐藏的 [_NewEnum] 成员(访问隐藏成员需要方括号,因为下划线前缀对于 VBA 中的标识符是非法的。

无法直接在 VBE 中调整模块和成员属性,因此您需要删除/导出模块,并在例如Notepad++,保存更改,然后将其重新导入到您的项目中。

或者,有Rubberduck (免责声明:我为这个开源项目做出了贡献)使用注释(又名“神奇注释”)为您做这件事:

'@Enumerator
'@Description("Gets an enumerator that iterates through the internal object collection.")
Public Property Get NewEnum() As IUnknown
Set NewEnum = this.Items.[_NewEnum]
End Function

'@DefaultMember
'@Description("Gets/sets the element at the specified index.")
Public Property Get Item(ByVal index As Long) As ItemType
Set Item = this.Items(index)
End Property

然后解析项目 (Ctrl+`) 并调出检查结果工具窗口 (Ctrl+ Shift+i) - “Rubberduck Opportunities”下应该有许多“Missing Attribute”结果:

inspection results

点击底部 Pane 中的“修复模块中的所有事件”,将隐藏属性与注释注释同步。

如果您有“缺少注释”结果,Rubberduck 已确定模块/成员的给定属性具有非默认值,并且能够类似地添加注释注释,通过注释来显示/记录它。

代码资源管理器 (Ctrl+R)、Rubberduck 工具栏和 VBE 自己的对象浏览器 (F2) 将显示 VB_Description 属性的内容,因此 @Description 注释对于任何公共(public)过程都特别有用。

对象浏览器:

Object Browser showing member description

代码浏览器:

Code Explorer showing member description

Rubberduck 工具栏:

RD toolbar showing member description

关于excel - 在VBA中创建可循环容器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55402347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com