迭代通过的目浏览器在VBA
题
我想迭代成员的任何类在引用的图书馆就像是使用对象浏览器。怎么可以这样做使用VBA?
解决方案 2
我发现了一个 KB从中让我做到这一点微软。它还覆盖了会员细节迭代以及
Private Sub ListClassesInAccess()
Dim TypeLibrary As TypeLibInfo
Dim ClassList As CoClasses
Dim i As Integer
Dim Path As String
Path = "C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB"
Set TypeLibrary = TypeLibInfoFromFile(Path)
Set ClassList = TypeLibrary.CoClasses
For i = 1 To ClassList.Count
MsgBox ClassList.Item(i).Name
Next
Set TypeLibrary = Nothing
Set ClassList = Nothing
End Sub
其他提示
其实,怎么做,这是无证的,但也是可能的。如果您希望实现对集合的语法for..Each,那么你就可以做到以下几点:
Option Compare Database
Option Explicit
Public colT As New Collection
Public Function NewEnum() As IUnknown
Set NewEnum = colT.[_NewEnum]
End Function
Public Property Get NextItem() As IUnknown
Attribute NextItem.VB_UserMemId = -4
Attribute NextItem.VB_MemberFlags = "40"
Set NextItem = colT.[_NewEnum]
End Property
请注意在上述的属性的设置。你必须在记事本中使用SaveAsText和编辑代码如上。然后,重新导入在调试命令行中使用loadfromText的代码。一旦你做到上面,那么你可以去:
Dim n As clstest1
Dim v As Variant
Set n = New clstest1
[ code here that adds to collection]
For Each v In n
Debug.Print v
Next
而且,如果你不打算使用......对于每一个集合,你可以/也可以设置通过去类的默认属性:
Public Property Get Item(Optional ndx As Integer = 1) As Variant
Attribute Item.VB_UserMemId = 0
Select Case ndx
Case 1: Item = Me.s1
Case 2: Item = Me.s2
Case 3: Item = Me.s3
End Select
End Property
Public Property Get count() As Integer
count = 3
End Property
然后,你可以去:
Dim n As clstest1
Dim i As Integer
Set n = New clstest1
For i = 1 To n.count
Debug.Print n(i)
Next
然而,我不知道如何可以自动的类的每一个方法/成员添加到内置的对象集合自动(没有办法与编译选项序列化此,但我所看到的每一个具有属性程序代码Item.VB_UserMemId = 1,则2然后3)。也许有人有更多的知识,可以跳过)。
然而,如上述所示,可以实现用于集合一for..each。如果你创建一个自定义项目属性可以实现为每个属性/方法的指数。而且,正如上面显示,你甚至可以设置创建为默认该项目属性。我把在“可选的”,并因此甚至:
debug.print n
将工作,或者
debug.print n.Item(1)
不幸的是,访问VBA不支持的反思。你可以尝试创建自己的抽象层次结构将检查财产价值等。对于你。你可能会开始像这样的东西:
http://msdn.microsoft.com/en-us/library/aa663065%28office.11%29.aspx
如果您已经安装VB6 - 那么你可以尝试tlbinf32.dll。 AFAIR - 如果有班级数量得到任何类型库的信息 请参阅 http://support.microsoft.com/kb/224331