由于工作的需要,我希望将长长的Case取消掉,但是CallbyName在层次和集合对象上的处理十分头疼,为了解决这个问题只能想别的办法了,唯一的办法是重新包装Callbyname,代码如下:

CallByName的深入研究'ClassName :ParaseTier
CallByName的深入研究

CallByName的深入研究
'缺陷没有考虑错误处理
CallByName的深入研究

CallByName的深入研究
Public Event onError()
CallByName的深入研究
CallByName的深入研究
'根据字符串得到具体的属性值
CallByName的深入研究
Public Function GetAttributeValue(Object As Object, ByVal AttributeName As String)
CallByName的深入研究    GetAttributeValue 
= VBA.Interaction.CallByName(GetObject(Object, AttributeName), Trim(AttributeName), VbGet)
CallByName的深入研究
End Function
CallByName的深入研究
CallByName的深入研究
'根据字符串得到具体的对象
CallByName的深入研究'
AttributeIsObject = 0,表示当AttributeName表示的是属性名称
CallByName的深入研究'
AttributeIsObject = 1,表示当AttributeName表示的是对象名称
CallByName的深入研究
Public Function GetObject(ByVal Object As Object, ByRef AtrributeName As String, Optional AttributeIsObject = 0As Object
CallByName的深入研究    
Dim parseProcName() As String
CallByName的深入研究    parseProcName 
= Split(AtrributeName, ".")
CallByName的深入研究    
Dim i As Integer
CallByName的深入研究    
Set GetObject = Object
CallByName的深入研究    
For i = 0 To UBound(parseProcName) - 1
CallByName的深入研究       
If IsCollectionAttribute(parseProcName(i)) Then
CallByName的深入研究            
Set GetObject = GetItemObject(GetObject, parseProcName(i))
CallByName的深入研究       
Else
CallByName的深入研究            
If IsObject(VBA.Interaction.CallByName(GetObject, parseProcName(i), VbGet)) Then
CallByName的深入研究                
Set GetObject = VBA.Interaction.CallByName(GetObject, parseProcName(i), VbGet)
CallByName的深入研究            
End If
CallByName的深入研究       
End If
CallByName的深入研究    
Next
CallByName的深入研究    
CallByName的深入研究    
'处理需要单独返回对象的属性
CallByName的深入研究
    If AttributeIsObject = 1 Then
CallByName的深入研究        
If IsObject(VBA.Interaction.CallByName(GetObject, parseProcName(0), VbGet)) Then
CallByName的深入研究            
Set GetObject = VBA.Interaction.CallByName(GetObject, parseProcName(0), VbGet)
CallByName的深入研究        
End If
CallByName的深入研究    
End If
CallByName的深入研究    
CallByName的深入研究    AtrributeName 
= parseProcName(UBound(parseProcName))
CallByName的深入研究    
Erase parseProcName
CallByName的深入研究
End Function
CallByName的深入研究
CallByName的深入研究
'解析集合类对象
CallByName的深入研究'
用来解释如“Sections(1)”格式的集合对象
CallByName的深入研究'
要求集合对象必须包含Item方法
CallByName的深入研究'
字符串不允许包含类似Item(1)的方法
CallByName的深入研究
Public Function GetItemObject(ByVal Object As Object, ByVal AttributeName As StringAs Object
CallByName的深入研究    
Dim parseProcName() As String
CallByName的深入研究    parseProcName 
= Split(AttributeName, "(")
CallByName的深入研究    AttributeName 
= Trim(parseProcName(0))
CallByName的深入研究    
Dim Index As Integer
CallByName的深入研究    Index 
= Trim(Replace(parseProcName(1), ")"""))
CallByName的深入研究    
Set GetItemObject = GetObject(Object, AttributeName, 1)
CallByName的深入研究    
Set GetItemObject = GetItemObject.Item(Index)
CallByName的深入研究    
Erase parseProcName
CallByName的深入研究
End Function
CallByName的深入研究
CallByName的深入研究
'判断当前的对象是否为集合对象
CallByName的深入研究
Private Function IsCollectionAttribute(ByVal AttributeName As StringAs Boolean
CallByName的深入研究    IsCollectionAttribute 
= (InStr(1, AttributeName, "("> 0)
CallByName的深入研究
End Function
CallByName的深入研究

相关测试类:
CallByName的深入研究'ClassName :Student
CallByName的深入研究
Public Name As String
CallByName的深入研究
Public Sex As String
CallByName的深入研究

测试模块:

CallByName的深入研究
CallByName的深入研究
Public Sub Test1()
CallByName的深入研究    
Dim pt As New ParaseTier
CallByName的深入研究    
Dim o As Object
CallByName的深入研究    
Set o = Word.Application.ActiveDocument
CallByName的深入研究    
CallByName的深入研究    
'Demo 使用字符串获得属性
CallByName的深入研究
    Debug.Print pt.GetAttributeValue(o, "Paragraphs(1).Range.Font.Name")
CallByName的深入研究    
CallByName的深入研究    
'Demo 使用字符串获得集合对象属性
CallByName的深入研究
    Debug.Print pt.GetItemObject(o, "Paragraphs(1)").Range.Font.Name
CallByName的深入研究    
CallByName的深入研究    
'Demo 使用字符串获得对象
CallByName的深入研究
    Debug.Print pt.GetObject(o, "Paragraphs"1).Count
CallByName的深入研究    
CallByName的深入研究    
Set o = Nothing
CallByName的深入研究    
Set pt = Nothing
CallByName的深入研究
End Sub
CallByName的深入研究
CallByName的深入研究
CallByName的深入研究
Public Sub Test2()
CallByName的深入研究    
Dim pt As New ParaseTier
CallByName的深入研究    
Dim o As Object
CallByName的深入研究    
Set o = Word.Application.ActiveDocument
CallByName的深入研究    
'Demo 使用字符串获得属性
CallByName的深入研究
    Debug.Print pt.GetAttributeValue(o, "Paragraphs(1).Range.Font.Name")
CallByName的深入研究    
'Demo 使用字符串获得集合对象属性
CallByName的深入研究
    Debug.Print pt.GetItemObject(o, "Sections(1)").Index
CallByName的深入研究    
'Demo 使用字符串获得对象
CallByName的深入研究
    Debug.Print pt.GetObject(o, "Paragraphs"1).Count
CallByName的深入研究    
Set o = Nothing
CallByName的深入研究    
Set pt = Nothing
CallByName的深入研究
End Sub
CallByName的深入研究
CallByName的深入研究
Public Sub test3()
CallByName的深入研究    
Dim s As New Student
CallByName的深入研究    s.Name 
= "Duiker"
CallByName的深入研究
    s.Sex = "男"
CallByName的深入研究
    Dim ss As String
CallByName的深入研究    ss 
= InputBox("请输入需要获得的属性名称""Name")
CallByName的深入研究    
CallByName的深入研究    
Select Case ss
CallByName的深入研究        
Case "Name"
CallByName的深入研究
            Debug.Print s.Name
CallByName的深入研究        
Case "Sex"
CallByName的深入研究
            Debug.Print s.Sex
CallByName的深入研究    
End Select
CallByName的深入研究    
CallByName的深入研究    
Set s = Nothing
CallByName的深入研究
End Sub
CallByName的深入研究
CallByName的深入研究
Public Sub test4()
CallByName的深入研究    
Dim s As New Student
CallByName的深入研究    s.Name 
= "Duiker"
CallByName的深入研究
    s.Sex = "男"
CallByName的深入研究
    Dim ss As String
CallByName的深入研究    ss 
= InputBox("请输入需要获得的属性名称""Name")
CallByName的深入研究    
Dim pt As New ParaseTier
CallByName的深入研究    Debug.Print pt.GetAttributeValue(s, ss)
CallByName的深入研究    
Set s = Nothing
CallByName的深入研究
End Sub
CallByName的深入研究

这只是一个简易的框架,自己用来玩玩还行,主要的好处就是通过字符串可以快速的生成对象,或者获取属性的值,而且支持多层次的属性字符串,也支持类似于Item格式的对象集合。

参考文章:

1:vb6框架设计-对象导航
2:CallByName的一些缺陷

相关文章: