VBA를 통해 Excel 시트를 로컬 Access 데이터베이스에 연결하려고하는데 이전 디버그에서 Access 데이터베이스가 잠기는 문제가 발생하여 시도 할 때 오류 3704 또는 3709 (아래 참조)가 발생합니다. 디버그.
이제 VBA를 처음 사용하므로 데이터베이스에 올바르게 연결하지 못할 가능성이 높습니다. 데이터베이스를 강제로 닫는 방법이 있습니까?
다음은 연결 코드입니다.
Dim objAccess As Object
Dim strFile, strConnection As String
strFile = "Address of SampleDB.accdb"
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase(strFile)
'get the connection string
strConnection = objAccess.CurrentProject.Connection.ConnectionString
objAccess.Quit
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = strConnection
따라서 상태가 열려 있는지 확인하기 위해 if 블록을 작성하여 확인했지만 cn.CloseConnection 줄에 "런타임 오류 3074 : 개체가 닫힐 때 작업이 허용되지 않음"이 표시됩니다.
If cn.State = adStateOpen Then
cn.Close
Else
MsgBox "The connection is already open."
End If
그래서 위의 코드를 주석 처리하고 다음으로 대체했지만 "런타임 오류 3079 :이 작업을 수행하는 데 연결을 사용할 수 없습니다.이 컨텍스트에서 닫혔거나 유효하지 않습니다."라는 메시지가 표시됩니다. Set rs.ActiveConnection = cn 줄에 있습니다. (cn.State And adStateOpen) = adStateOpen이 먼저 true 부분으로 이동합니다.
If (cn.State And adStateOpen) = adStateOpen Then
MsgBox "cn Connection is already open."
Else
cn.Open strConnection
MsgBox "Connection is now open"
End If
Set rs = Nothing
Set rs = CreateObject("ADODB.Recordset")
Set rs.ActiveConnection = cn
마지막에 cn.Close 및 Set cn = Nothing을 사용하여 연결을 정리합니다. 그러나 코드가 그 지점에 도달하기 전에 중지되어 이제 Access 데이터베이스에서 나를 잠급니다. 내가 실행 한 쿼리는 변수가있는 기본 select 문이었습니다.
Dim iArea As String
Dim strSQL As String
Dim dId As Integer
iArea = "Sales"
strSQL = "SELECT [deptID] FROM [tblDept] WHERE [deptArea]='" & iArea & "'"
rs.Open
Set rs = cn.Execute(strSQL)
dId = rs.Fields(0)
MsgBox dId
rs.Close
Set rs = Nothing
SQL에 변수를 배치하는 구문이 잘못되어 코드가 원래 중지되었습니다. 다시 디버깅 할 수있는 유일한 방법은 컴퓨터를 다시 시작하는 것입니다. 어떤 조언이라도 대단히 감사하겠습니다.
문제는 ADO가 아니라 코드에서 오류 처리가 부족하기 때문이라고 생각합니다. 반드시 읽어야합니다.
달리 지정하지 않는 한, 오류 처리의 기본 모드는 메시지 상자를 표시하고 종료를 클릭하면 중지 된 줄에서 루틴을 종료합니다. On Error Goto를 살펴보고 오류를 처리 한 후 실행되는 블록을 만듭니다. 오류 여부에 관계없이 매번 실행되는 코드 블록을 설정하여 연결을 닫고 개체 할당을 취소 할 수 있습니다. 이것이 연결을 닫는 코드가 실패없이 실행되도록하여 연결을 강제로 닫는 방법입니다. 기본 셸은 다음과 같습니다.
Sub MySub()
On Error Goto MySub_ErrorHandler
'...Code here...
'1. If error happens, goto 2.
ExitMe:
'4. Clean up and run the code which needs to definitely run here. Close connections, deallocate your objects, etc.
'5. Finally, exit the routine with all loose ends tied up.
Exit Sub
MySub_ErrorHandler:
'2. Handle the error here...
'3. Then go to ExitMe...
Goto ExitMe
End Sub
ExitMe에 코드를 넣어 오류가 발생할 위험이 있습니다. 이 경우 코드 실행은 다시 MySub_ErrorHandler로 이동하고 무한 루프에 들어갈 수 있습니다. 따라서 ExitMe에서 코드를 테스트하는 데주의하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다