VBA – 使用.NET类库

我们有一个自定义的类库,它是从头开始构build的,它执行业务模型所需的各种function。 我们还使用VBA来自动化标准Microsoft软件包和SolidWorks的一些数据插入。

迄今为止,我们已经基本上重写了VBA应用程序macros中的代码,但是现在正在将类库包含到VBA引用中。 我们已经注册了COM interop的类库,并且确保它是COM可见的。 该文件是可引用的,我们在每个公共类上添加了<ClassInterface(ClassInterfaceType.AutoDual)> _标签,以便intellisense“有效”。

就这样说,现在出现了问题 – 当我们引用类库时,对于这个实例,我们称之为Test_Object ,它被拾取并且似乎工作得很好。 所以我们继续尝试一个小样本,以确保它使用公共函数并返回期望的值:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim test As New Test_Object.Formatting Dim t As String t = test.extractNumber("abc12g3y45") Target.Value = t End Sub 

这按预期工作,返回12345在选定的单元格中。

但是,当我尝试不同的类,按照完全相同的过程,我得到一个错误( Object variable or With block variable not set )。 代码如下:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim test As New Test_Object.SQLCalls Dim t As String t = test.SQLNumber("SELECT TOP 1 ID from testdb.dbo.TESTTABLE") 'where the string literal in the parentheses is a parameter that is passed. Target.Value = t End Sub 

这在t = test.SQLNumber行失败。 它也失败了SQLCalls类中的另一个函数,该函数返回SQL格式的date(所以与连接数据库没有任何关系)。

任何人都可以协助什么可能导致这个错误? 我GOOGLE了几个小时无济于事,我愿意尝试所需的一切来实现这个工作。

干杯。

编辑:(在.SQLNumber()方法中添加)

 Function SQLNumber(query As String) As Double Dim tno As Double Try Using SQLConnection As SqlConnection = New SqlConnection(Connection_String_Current) SQLConnection.Open() SQLCommand = New SqlCommand(query, SQLConnection) tno = SQLCommand.ExecuteScalar End Using Catch ex As System.Exception MsgBox(ex.Message) End Try Return tno End Function 

为了比较, extractNumber()方法:

 Function extractNumber(extstr As String) As Double Dim i As Integer = 1 Dim tempstr As String Dim extno As String = "" Do Until i > Len(extstr) tempstr = Mid(extstr, i, 1) If tempstr = "0" Or tempstr = "1" Or tempstr = "2" Or tempstr = "3" Or tempstr = "4" Or tempstr = "5" Or tempstr = "6" Or tempstr = "7" Or tempstr = "8" Or tempstr = "9" Or tempstr = "." Then extno = extno & tempstr End If i = i + 1 Loop If IsNumeric(extno) Then Return CDbl(extno) Else Return 0 End If End Function 

在vba4all的帮助下,我们设法正确地解决了这个问题。

当我尝试使用Dim x as new Test_Object.SQLCalls创build对象的新实例时,我完全没有意识到我没有重新input这个关键的行: <ClassInterface(ClassInterfaceType.None)> _

在这之前,我在对象资源pipe理器中有这个,这个对象资源pipe理器在Classes部分中有ISQLCalls和SQLCalls 在这里输入图像说明

但是等等,ISQLCalls不是一个类,它是一个接口!

通过在SQLCalls类中input<ClassInterface(ClassInterfaceType.None)> _ ,对象浏览器看起来好一点:

在这里输入图像说明

现在我可以创build一个新的类实例,并且暴露了方法。

tldr:我需要显式声明接口,并在接口上使用<InterfaceType(ComInterfaceType.InterfaceIsDual)>在类上使用<ClassInterface(ClassInterfaceType.None)>

非常感谢vba4all,他们无私地投入了时间来协助解决这个问题。