У нас есть специальная библиотека классов, которая была построена с нуля, которая выполняет множество функций, необходимых для бизнес-модели. Мы также используем VBA для автоматизации ввода некоторых данных из стандартных пакетов Microsoft и из SolidWorks.VBA - Использование библиотеки классов .NET
На сегодняшний день мы в основном переписали код в макросах приложения VBA, но теперь переходим к включению библиотеки классов в ссылки VBA. Мы зарегистрировали библиотеку классов для COM-взаимодействия и убедились, что это 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 (так что это не имеет ничего общего с подключением к базе данных).
Может ли кто-нибудь помочь в том, что может быть причиной этой ошибки? Я работаю в течение многих часов безрезультатно, и я готов попробовать все, что нужно, чтобы это работало.
Cheers.
EDIT: (добавлено в методе .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
Вам нужно показать код метода '.SQLNumber()' и, возможно, класса '.SQLCalls'. – 2014-10-01 07:27:37
Я могу ввести метод '.SQLNumber()', но весь класс сам по себе имеет более 1000 строк. – DeeKayy90
share '.SQLNumber()' с нами, пожалуйста, поскольку я считаю, что это может быть важно. – 2014-10-01 07:35:14