2009-07-13 4 views
23

내가 나를 어떻게 엑셀 시트로 SQL 쿼리의 결과 (2007 엑셀) 잡아 보여줍니다 MSDN에서 VBA의 코드 복사하고 : 이미 마이크로 소프트를 추가 한액세스 SQL 데이터베이스

Sub GetDataFromADO() 

    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from myTable" 
     objMyCmd.CommandType = adCmdText 
     objMyCmd.Execute 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open objMyCmd 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 

을 ActiveX Data Objects 2.1 라이브러리를 참조하십시오. 그리고이 데이터베이스는 접근 가능합니다. 나는이 서브 루틴을 실행할 때

지금, 그것은 오류가 있습니다

런타임 오류 3704 : 개체를 닫을 때 작업이 허용되지 않습니다. 문에

:

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

어떤 생각을 왜?

감사합니다.

+0

도움말을! 같은 오류가 발생하지만 아래의 솔루션을 도움이되지 않았다 : http://stackoverflow.com/questions/1682717/vba-adodb-run-time-error-3704 – Steven

답변

20

연결 문자열에 초기 카탈로그를 추가했습니다. 나는 또한 ADODB를 폐기했다. 간단히 말해서 자신의 SQL 문을 만들고 해당 변수에 대한 레코드 세트를 여는 것을 선호한다.

희망이 도움이됩니다.

Sub GetDataFromADO() 
    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyRecordset = New ADODB.Recordset 
     Dim strSQL As String 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     strSQL = "select * from myTable" 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open strSQL    

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 
+2

그것은 나를 위해, 감사, 기억을 추가 할 기억 해요. Microsoft ActiveX Data Objects 2.1에 대한 참조, 나는 2.6 버전을 추가했다. 또한 마지막에 연결을 닫을 필요가 없습니까? objMyRecordset.Close처럼? –

0

올바른 연결 문자열입니까?
SQL Server 인스턴스의 위치는 어디입니까?

위에서 지정한 연결 문자열을 사용하여 SQL Server에 연결할 수 있는지 확인해야합니다.

EDIT : 레코드 집합의 State 속성이 Open인지 확인하십시오.
또한 레코드 집합을 열기 전에 CursorLocation 속성을 adUseClient로 변경하십시오.

1

나는 관련 소프트웨어 비트가없는 컴퓨터에 앉아 있지만 메모리에서는 코드가 잘못 보입니다. 명령을 실행하고 있지만 RecordSet을 삭제하면 objMyCommand.Execute이 반환됩니다.

Set objMyRecordset = objMyCommand.Execute 

을 ... 다음 "공개 레코드"부분을 잃게 :

내가 할 거라고.

15

제안 된 변경 : 명령이의이 방법을 실행 객체를 호출하지 마십시오

  • ;
  • Recordset 개체의 Source 속성을 Command 개체로 설정하십시오.
  • 매개 변수없이 Recordset 개체의 Open 메서드를 호출하십시오.
  • CopyFromRecordset 호출에서 Recordset 개체 주위의 괄호를 제거하십시오.
  • 사실 선언하여 변수 :

개정 코드 : (당신은 SQL Server에서 인 경우)

Sub GetDataFromADO() 

    'Declare variables' 
     Dim objMyConn As ADODB.Connection 
     Dim objMyCmd As ADODB.Command 
     Dim objMyRecordset As ADODB.Recordset 

     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"  
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from mytable" 
     objMyCmd.CommandType = adCmdText 

    'Open Recordset' 
     Set objMyRecordset.Source = objMyCmd 
     objMyRecordset.Open 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset 

End Sub 
+0

+1은 괄호를 제거합니다. 객체 참조와 결합 된 불필요한 괄호가 이상한 VBA 오류를 일으키는 것 같습니다 – barrowc

+0

이 예제는 저에게 효과적이었습니다! – nekomatic

+0

이 코드는 오래된 스레드라는 것을 알고 있지만 위의 코드를 수정하여 테이블 헤더를 검색하는 방법이 있는지 궁금합니다. – firedrawndagger

0

가 저장된 프로 시저의 시작 부분에 set nocount on를 추가합니다. 방금 내 작업에서이 문제를 해결했으며 "1203 Rows Affected"과 같은 중간 결과가 발생하여 Recordset에로드하려고했습니다.

0

@firedrawndagger : 필드 이름을 나열 할 수는/열 머리글은 레코드 필드 컬렉션을 반복하고 이름을 삽입합니다

Dim myRS as ADODB.Recordset 
Dim fld as Field 
Dim strFieldName as String 

For Each fld in myRS.Fields 
    Activesheet.Selection = fld.Name 
    [Some code that moves to next column] 
Next 
관련 문제