2014-10-01 5 views
1

У нас есть специальная библиотека классов, которая была построена с нуля, которая выполняет множество функций, необходимых для бизнес-модели. Мы также используем 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 
+0

Вам нужно показать код метода '.SQLNumber()' и, возможно, класса '.SQLCalls'. – 2014-10-01 07:27:37

+0

Я могу ввести метод '.SQLNumber()', но весь класс сам по себе имеет более 1000 строк. – DeeKayy90

+0

share '.SQLNumber()' с нами, пожалуйста, поскольку я считаю, что это может быть важно. – 2014-10-01 07:35:14

ответ

0

С помощью vba4all, нам удалось углубиться вниз прямо к вопрос.

Когда я попытался создать новый экземпляр объекта с помощью Dim x as new Test_Object.SQLCalls, я был совершенно не обращая внимания на то, что я не вновь вошел в эту критическую линию: <ClassInterface(ClassInterfaceType.None)> _.

До делать это, я имел в моем объекте исследователя, который имеет как ISQLCalls и SQLCalls в разделе Классы enter image description here

Но ждать, ISQLCalls это не класс, это интерфейс!

Введя <ClassInterface(ClassInterfaceType.None)> _ назад в классе SQLCalls, объект исследователь выглядел немного лучше:

enter image description here

И низкий, и вот, теперь я мог создать новый экземпляр класса, и методы были выставлены.

tldr: Мне нужно было явно объявить интерфейс и использовать <InterfaceType(ComInterfaceType.InterfaceIsDual)> на интерфейсе и <ClassInterface(ClassInterfaceType.None)> на классе.

Огромное спасибо vba4all, который самоотверженно посвятил свое время, чтобы помочь в этом вопросе.

+0

Спасибо за редактирование, не заметили, что ссылка не работает. Ответ на вопрос находится в теле, поэтому нет необходимости в ссылке на старую страницу. – DeeKayy90

Смежные вопросы