我有一个 Excel VBA 模块,它使用 .NET 3.5
Hashtable
中的 SortedList
和 mscorlib DLL
。我可以毫无问题地使用这些课程。当我尝试使用 StringBuilder
类时,我遇到了自动化错误。以下是 Excel VBA 模块中的完整函数:
Function StringBuilderTest() As String
Dim sb As StringBuilder
Dim i as Integer
On Error GoTo ErrorLabel
Set sb = New StringBuilder
For i = 1 to 100
sb.Append "text"
Next i
StringBuilderTest = sb.ToString
Exit Function
ErrorLabel:
Debug.Print Err.Description
Debug.Print Err.Number
Debug.Print Err.Source
StringBuilderTest = "Error"
Exit Function
End Function
代码在
.Append
方法调用时崩溃。错误处理输出以下内容:
Class does not support Automation or does not support expected interface
430
VBAProject
这是我的Excel参考设置:
这是我的 Windows 功能设置:
为什么我会收到此错误?这是一个谜,因为来自同一个库的 Hashtable 和 SortedList 工作得很好。
更新:
我在
For/Next
方法调用周围添加了一个 Append
循环,以更准确地表示我的意图。请注意,这是简化的代码(实际上并非来自我的 Excel 项目),用于说明我遇到的自动化问题。
我认为您遇到的问题是因为 .NET Framework 中的 StringBuilder 类无法在 VBA 中直接访问。 VBA 不提供对使用 .NET 类的本机支持。
但是,您可以使用其他方法:
Function StringBuilderTest() As String
Dim sb As String
On Error GoTo ErrorLabel
sb = "text"
StringBuilderTest = sb
Exit Function
ErrorLabel:
Debug.Print Err.Description
Debug.Print Err.Number
Debug.Print Err.Source
StringBuilderTest = "Error"
Exit Function
End Function
您的问题与 COM 对象成员不能重载有关。
StringBuilder.Append 有许多重载。
因此,类型库编译器会为每个重载附加一个下划线,后跟一个数字。
例如。 Append(Char, Int32) 这可能是尝试访问并导致自动化错误的成员,因为 VBA 不支持 Char 数据类型。
Append_2(Char[], Int32, Int32)
Append_3(System.String) 是您所需要的。 等等..
枚举 StringBuilder 的成员,如下所示,Append(System.String) 是列出的第三个重载,因此它的 COM 对象成员名称是 Append_3,它已针对您的示例进行了测试并且有效。即
sb.Append_3 "text"
...
System.Text.StringBuilder Append(Char, Int32)
System.Text.StringBuilder Append(Char[], Int32, Int32)
System.Text.StringBuilder Append(System.String)
System.Text.StringBuilder Append(System.String, Int32, Int32)
等等
StringBuilder 的成员列表是从以下代码中获取的:
Public Sub DisplayStringBuilderMembers()
Dim sb As mscorlib.StringBuilder
Set sb = New mscorlib.StringBuilder
Dim stringBuilderType As mscorlib.Type
Set stringBuilderType = sb.GetType()
Debug.Print stringBuilderType.FullName; " members"
Debug.Print
Dim members() As mscorlib.MemberInfo
members = stringBuilderType.GetMembers_2
Dim i As Long
For i = 0 To UBound(members)
Dim pvtMemberInfo As mscorlib.MemberInfo
Set pvtMemberInfo = members(i)
Debug.Print pvtMemberInfo.ToString
Next i
End Sub