2014-10-01 5 views
1

우리는 처음부터 비즈니스 모델에 필요한 다양한 기능을 수행하는 사용자 정의 클래스 라이브러리를 구축했습니다. 또한 표준 Microsoft 패키지 및 SolidWorks에서 일부 데이터 삽입을 자동화하기 위해 VBA를 사용합니다.VBA - .NET 클래스 라이브러리 사용

지금까지 우리는 VBA 응용 프로그램 매크로에서 코드를 다시 작성했지만 현재는 VBA 참조에 클래스 라이브러리를 포함하려고합니다. 우리는 COM interop 용 클래스 라이브러리를 등록하고 COM이 표시되는지 확인했습니다. 파일을 참조 할 수 있으며 각 공개 클래스 위에 <ClassInterface(ClassInterfaceType.AutoDual)> _ 태그가 추가되어 인텔리 센스가 작동합니다.

이 문제는 이제 발생합니다. 클래스 라이브러리를 참조 할 때이 인스턴스에 대해 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 선택한 셀/S에.

그러나 동일한 절차를 수행하여 다른 클래스를 시도하면 오류 (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 형식으로 날짜를 반환하는 함수이므로 데이터베이스 연결과 관련이 없습니다.

누구든지이 오류의 원인이 될 수있는 도움을 줄 수 있습니까? 나는 아무 쓸모없는 시간 동안 googled하고, 그것이 일하는 것을 얻는 무엇이든지 시도하게 기꺼이한다.

건배.

편집 :합니다 (.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() 방법 : vba4all의 도움으로

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' 클래스에 대한 코드를 보여줄 필요가 있습니다. –

+0

'.SQLNumber()'메쏘드에 입력 할 수 있지만, 전체 클래스 자체는 1000 라인을 넘습니다. – DeeKayy90

+0

은'.SQLNumber()'를 공유해 주시길 바랍니다. –

답변

0

, 우리는 바로 아래로 파고 관리 발행물. <ClassInterface(ClassInterfaceType.None)> _ :

내가 Dim x as new Test_Object.SQLCalls를 사용하여 개체의 새 인스턴스를 만들려고

, 나는이 중요한 선을 다시 입력하지했다는 사실을 완전히 망각했다. 이 일에

전에, 나는 클래스 섹션 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

관련 문제