복붙노트

[SQL] 어떻게 엑셀 VBA에서 두 개의 서로 다른 데이터 소스에서 생성 된 두 개의 레코드를 가입

SQL

어떻게 엑셀 VBA에서 두 개의 서로 다른 데이터 소스에서 생성 된 두 개의 레코드를 가입

내 시나리오입니다 - 나는 1 개 .xls 파일의 데이터 세트와 오라클 데이터베이스 테이블에있는 데이터의 또 다른 세트가있다. 둘 다 다음 조인 (같은 SQL)을 수행 엑셀 VBA를 사용하여 데이터 마지막으로 일부 통합 문서의 데이터 저장을 가져 오기합니다.

문제 - 나는 VBA에서 데이터의 서로 다른 두 세트를 가져온 다음에 가입을 수행하는 방법을 모르겠어요. 닷넷에서 우리가 가져온 데이터를 저장하고 내가이 작업을 수행 할 수있는 방법이 있지만 VBA에 어떤 쿼리를 수행 할 수있는 DataSet 개체가?

해결법

  1. ==============================

    1.ADO를 사용하여 아래의 예를 생각해 보자. 코드는 하나의 SQL 쿼리 (제트 SQL) 내에서 여러 데이터 소스에서 데이터를 얻을 수 있습니다, 특히 .XLSX 파일에서 노동 조합을 만들고, 워크 시트에 넣어 결과 레코드. 오라클 ODBC 드라이버를 통해 (다른 데이터베이스 등) ADO와 오라클에 직접 연결할 수 있지만 불행하게도, 난, 테스트 측은 오라클 데이터 소스를 가지고있다.

    ADO를 사용하여 아래의 예를 생각해 보자. 코드는 하나의 SQL 쿼리 (제트 SQL) 내에서 여러 데이터 소스에서 데이터를 얻을 수 있습니다, 특히 .XLSX 파일에서 노동 조합을 만들고, 워크 시트에 넣어 결과 레코드. 오라클 ODBC 드라이버를 통해 (다른 데이터베이스 등) ADO와 오라클에 직접 연결할 수 있지만 불행하게도, 난, 테스트 측은 오라클 데이터 소스를 가지고있다.

    코드는 Query.xlsm에 배치됩니다 :

    Option Explicit
    
    Sub SqlUnionTest()
    
        Dim strConnection As String
        Dim strQuery As String
        Dim objConnection As Object
        Dim objRecordSet As Object
    
        strConnection = _
            "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "User ID=Admin;" & _
            "Data Source='" & ThisWorkbook.FullName & "';" & _
            "Mode=Read;" & _
            "Extended Properties=""Excel 12.0 Macro;"";"
    
        strQuery = _
            "SELECT * FROM [Sheet1$] " & _
            "IN '" & ThisWorkbook.Path & "\Source1.xlsx' " & _
            "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
            "UNION " & _
            "SELECT * FROM [Sheet1$] " & _
            "IN '" & ThisWorkbook.Path & "\Source2.xlsx' " & _
            "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
            "UNION " & _
            "SELECT * FROM [Sheet1$] " & _
            "IN '" & ThisWorkbook.Path & "\Source3.xlsx' " & _
            "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
            "ORDER BY ContactName;"
    
        Set objConnection = CreateObject("ADODB.Connection")
        objConnection.Open strConnection
        Set objRecordSet = objConnection.Execute(strQuery)
        RecordSetToWorksheet Sheets(1), objRecordSet
        objConnection.Close
    
    End Sub
    
    Sub RecordSetToWorksheet(objSheet As Worksheet, objRecordSet As Object)
    
        Dim i As Long
    
        With objSheet
            .Cells.Delete
            For i = 1 To objRecordSet.Fields.Count
                .Cells(1, i).Value = objRecordSet.Fields(i - 1).Name
            Next
            .Cells(2, 1).CopyFromRecordset objRecordSet
            .Cells.Columns.AutoFit
        End With
    
    End Sub
    

    참고 ThisWorkbook.Path 경로 내에서 '포함 할 수 없습니다. 그렇지 않으면 ''와 '대체하여 이스케이프해야합니다.

    또한 Query.xlsm과 같은 폴더에 세 개의 데이터 소스 파일이 있습니다.

    Source1.xlsx :

    Source2.xlsx :

    Source3.xlsx :

    다음과 같이 결과 워크 시트는 다음과 같습니다

    그것은 나를 위해 64 비트 버전의 Excel 2013을 사용할 수 있습니다. .XLS 및 Excel 2003 (공급자 ACE.OLEDB.12.0가 설치되지 않은 경우) 당신이 공급자를 교체해야와 호환되도록하려면 = Microsoft.ACE.OLEDB.12.0; 확장 특성 또한 제공자 = Microsoft.Jet.OLEDB.4.0, 및 엑셀 매크로 12.0; / 엑셀 12.0; 엑셀 8.0 ;. 당신은 쉽게 쿼리에 WHERE 절 및 기타 SQL 물건을 추가 할 수 있습니다. 실제로 연결 개체에 대한 데이터 소스 코드에 배치 유일한 Query.xlsm 파일을 한정되는 것은 아니다. 그것은 가능한 업체 중 하나, 하나의 파일 기반 또는 서버 기반과 호환 다른 데이터 소스를 수 있습니다. http://www.connectionstrings.com/에 데이터 소스에 대한 더 연결 문자열 찾기

  2. from https://stackoverflow.com/questions/34294382/how-to-join-two-recordset-created-from-two-different-data-source-in-excel-vba by cc-by-sa and MIT license