2013-04-10 4 views
0

ADO liblary를 사용하여 SQL 문과 함께 작동하는 매크로를 만들려고 시도하지만 실제로는 6559 개의 레코드 만 반환하는 반면 내 테이블에는 72k 개의 레코드가 있습니다. 왜?ADO VBA 코드가 6559 레코드 만 반환하는 이유는 무엇입니까?

최근에 나는 실제로 코드가 6559를 반환하지 않지만 행 번호는 65537이라고 알았습니다. 따라서 시트의 행 수를 72092로 줄이면 더 적은 행 (6550)을 얻게됩니다.

또 다른 주목할 점은 rs.RecordCount가 "-1"을 반환한다는 것입니다.

다음은 내 하위 프로 용 코드입니다. SQL 문 (sqlstmt), 대상 시트 이름 (sheet_name) 및 대상 범위 (destination1)의 세 가지 매개 변수가 있습니다. 난 당신이 엑셀 2003 또는 워크 시트가 65,536 최대 행이있는 경우에는 이전 버전을 사용하는 추측하고있어 도움

+1

ADO는 강제로 사용하지 않는 한 항상 레코드 세트를로드하지 않습니다. 모든 레코드를 읽으려면 rs.Open 뒤에 rs.MoveLast를 추가하십시오. –

+0

감사하지만 실제로는 도움이되지 않습니다. ( – PtrZlnk

답변

0

에 대한

'subprocedure that execute sql statements and save resault in given worksheet 
    Public Sub sql_query(ByVal sqlstmt As String, ByVal sheet_name As String, ByVal destination1 As String) 

     Dim conn As ADODB.Connection 
     Dim rs As ADODB.Recordset 
     Dim connstring As String 
     Dim qt As QueryTable 
     Dim tw_path As String 
     Dim is_name As Boolean 
     Dim sh As Worksheet 

     '''making sheet if it doesn't exist 
     is_name = False 
     For Each sh In ThisWorkbook.Worksheets 
      If sh.Name = sheet_name Then is_name = True 
     Next 
     If is_name = False Then ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).Name = sheet_name 

     ''' connection 
     tw_path = ThisWorkbook.path & "\" & ThisWorkbook.Name 
     connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & tw_path & ";Extended Properties=Excel 8.0;Persist Security Info=False" 

     Set conn = New ADODB.Connection 
     conn.ConnectionString = connstring 
     conn.Open 

     '''executing statement 
     Set rs = New ADODB.Recordset 
     rs.Source = sqlstmt 
     rs.ActiveConnection = conn 
     rs.Open 

     '''saving records 
     ThisWorkbook.Worksheets(sheet_name).Activate 
     Set qt = Worksheets(sheet_name).QueryTables.Add(Connection:=rs, Destination:=Range(destination1)) 
     qt.Refresh 

     '''end 
     If rs.State <> adStateClosed Then rs.Close 
     conn.Close 
     If Not rs Is Nothing Then Set rs = Nothing 
     If Not conn Is Nothing Then Set conn = Nothing 
     Set qt = Nothing 

     End Sub 

감사합니다. 나는 대답 대신에 주석에 넣었을 것이다. 그러나 나는 1 주일에 논평 할 수 없다. :(죄송합니다.

+0

답변을 주셔서 감사합니다. 실제로 Excel 2007 및 ADO 6.0 라이브러리를 사용하고 있으며 내 시트 중 하나에 실제로 가지고 있습니다. 72 k rows :) 그러나이 시트를 두 개의 작은 시트로 나누었을 때 SQL UNION 명령을 올바르게 사용하면 65536 개 이상의 행이있는 테이블을 사용할 수 있습니다. – PtrZlnk

+0

@PtrZlnk 굉장 해요! 너는 그것을 작동시켰다! – KacireeSoftware