2014-10-01 30 views
1

我们有一个自定义的类库,它从头开始构建,可以执行业务模型所需的各种功能。我们还使用VBA来自动化标准Microsoft软件包和SolidWorks的一些数据插入。到目前为止,我们已经基本上重写了VBA应用程序宏中的代码,但现在正在将类库包含到VBA引用中。我们已经注册了COM interop的类库,并确保它是COM可见的。该文件是可引用的,我们在每个公共类上添加了<ClassInterface(ClassInterfaceType.AutoDual)> _标签,以便智能感知“有效”。VBA - 使用.NET类库

就这样说,现在出现了这个问题 - 当我们引用类库时,对于这个实例我们称之为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线。它也失败了​​类中的另一个函数,该函数返回SQL格式的日期(因此与数据库的连接没有任何关系)。

任何人都可以协助什么可能会导致此错误?我搜索了几个小时无济于事,并且愿意尽一切努力来实现这一目标。

干杯。

编辑:(在.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 
+0

您需要显示'.SQLNumber()'方法的代码以及可能的'.SQLCalls'类。 – 2014-10-01 07:27:37

+0

我可以在'.SQLNumber()'方法中输入,但是整个类本身就超过1000行。 – DeeKayy90 2014-10-01 07:33:53

+0

与我们分享'.SQLNumber()',因为我相信它可能至关重要。 – 2014-10-01 07:35:14

回答

0

随着vba4all的帮助下,我们成功地权钻研下到问题。

当我试图创建一个使用Dim x as new Test_Object.SQLCalls对象的新实例,我完全没有注意到这样的事实,我没有再进入这个关键行: <ClassInterface(ClassInterfaceType.None)> _

之前这样做,我在其中的类部分 enter image description here

别急既有ISQLCalls和SQLCalls我的对象资源管理器有这个,ISQLCalls不是类,它是一个接口!

通过在SQLCalls类进入<ClassInterface(ClassInterfaceType.None)> _回来,对象资源管理器看起来好一点:

enter image description here

和低你看,我现在可以创建类的新实例,和方法被暴露。

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

非常感谢vba4all,他无私地致力于帮助解决这个问题。

+0

感谢您的编辑,没有注意到链接已经失效。问题的答案在于身体,所以不需要链接到旧页面。 – DeeKayy90 2016-05-12 02:20:38