2014-10-01 97 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