Excel VBA - 使用 .NET 3.5 中的 StringBuilder 类出现自动化错误 (430)

问题描述 投票:0回答:2

我有一个 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 项目),用于说明我遇到的自动化问题。

excel vba .net-3.5 office-interop
2个回答
0
投票

我认为您遇到的问题是因为 .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

0
投票

您的问题与 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
© www.soinside.com 2019 - 2024. All rights reserved.