우리는 처음부터 비즈니스 모델에 필요한 다양한 기능을 수행하는 사용자 정의 클래스 라이브러리를 구축했습니다. 또한 표준 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
'.SQLNumber()'메소드와 아마도'.SQLCalls' 클래스에 대한 코드를 보여줄 필요가 있습니다. –
'.SQLNumber()'메쏘드에 입력 할 수 있지만, 전체 클래스 자체는 1000 라인을 넘습니다. – DeeKayy90
은'.SQLNumber()'를 공유해 주시길 바랍니다. –