2016-12-09 4 views
1

VBA를 사용하여 텍스트 파일의 데이터 하위 집합을 제공하기 위해 Excel 쿼리 테이블을 만들려고합니다. Jet OLEDB 연결 문자열을 쿼리 테이블 Connection으로 사용하고 싶습니다. 왜 이것이 실패할까요?텍스트 파일 원본의 Excel QueryTable이 Jet OLEDB에서 실패 함 연결 문자열

다음은 절차입니다. 내가 ADO 레코드를 만든 다음 쿼리 테이블 Connection로 그 레코드를 사용하도록 사용하는 경우

Sub OledbTest1() 'FAILS. 
'Create querytable with oledb connect string. 
    Const strConn = _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=C:\Users\RSJCB\Desktop\;" & _ 
     "Extended Properties=""text;HDR=Yes;FMT=Delimited""" 
    Dim wsht As Worksheet 
    Set wsht = ThisWorkbook.Worksheets.Add() 
    With wsht 
     'The next line errors with 1004: Application-defined of object-defined error 
     .QueryTables.Add strConn, .Range("A1"), "SELECT TOP 10 * FROM [TestFile.csv]" 
     .QueryTables(1).Refresh 
    End With 
    Set wsht = Nothing 
End Sub 

연결 문자열은 작동합니다. 내가 쿼리 테이블 Connection로 마이크로 소프트 텍스트 ODBC 드라이버 연결 문자열을 사용하는 경우

Sub OledbTest2() 'SUCCEEDS. 
'Create querytable with ado recordset opened using oledb connect string. 
    Const strConn = _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=C:\Users\RSJCB\Desktop\;" & _ 
     "Extended Properties=""text;HDR=Yes;FMT=Delimited""" 
    Const strSql = "SELECT TOP 10 * FROM [TestFile.csv]" 
    Dim wsht As Worksheet 
    Dim rst As New ADODB.Recordset 
    rst.Open strSql, strConn 
    Set wsht = ThisWorkbook.Worksheets.Add() 
    With wsht 
     'The next line errors with 1004: Application-defined of object-defined error 
     .QueryTables.Add rst, .Range("A1") 
     .QueryTables(1).Refresh 
    End With 
    Set wsht = Nothing 
    Set rst = Nothing 
End Sub 

는 또한 작동합니다. 그러나 이것은 약간 느리게 작동하는 것으로 보이며 실제 코드에서 700K 레코드를 읽습니다. 또한 OLEDB를 쿼리 테이블에 연결할 수 없었으며이를 수행하는 방법을 알고 싶습니다.

Sub OdbcTestQtbl() 'SUCCEEDS. 
'Create querytable with odbc connect string. 
    Const strConn = _ 
     "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ 
     "Dbq=C:\Users\RSJCB\Desktop\;" & _ 
     "Extensions=asc,csv,tab,txt;" 
    Dim wsht As Worksheet 
    Set wsht = ThisWorkbook.Worksheets.Add() 
    With wsht 
     .QueryTables.Add "ODBC;" & strConn, .Range("A1"), "SELECT TOP 10 * FROM [TestFile.csv]" 
     .QueryTables(1).Refresh 
    End With 
    Set wsht = Nothing 
End Sub 

대단히 감사합니다.

답변

2

Excel에 드라이버가 OLEDB 드라이버임을 알릴 필요가 있습니다. 그냥 연결 문자열의 시작 부분에 (분명히 문서화되지 않은) 제공자 지정자를 추가하십시오.

.QueryTables.Add "OLEDB;" & strConn, .Range("A1"), "SELECT TOP 10 * FROM [TestFile.csv]" 
+0

그래, 작동합니다. 나는 그것을 시도하지 않았다는 것을 믿을 수 없다. [documentation] (https://msdn.microsoft.com/en-us/library/office/ff837764.aspx)은 "ODBC;"에 대한 요구 사항을 지정합니다. ODBC 연결 문자열의 시작 부분에 있지만 OLEDB에 대해서는 지정하지 않습니다. 고마워요! – JBStovers

+0

@JBS 돌입 - 솔직히 말해서 어둠 속에서 "이것이 효과가 있을지 궁금하다." – Comintern