VBA从SQL Recordset复制整个列

时间:2017-07-11 13:58:33

标签: sql excel-vba vba excel

我在SQL中查询了6行的固定数据集。我想将此查询中的数据传输到Excel中。我的问题分为两部分:

1 - 我可以一次退回多列,还是必须逐列?我有17列和6行。当这被转移到我的Excel模板中时,我希望将其分解为三分之一,因此第1列到第7列在另一部分中的一个空格8到11中以及在Excel中的另一部分中的12到17中。

2 - 使用我当前的代码:

Range("F2").Value = rst.Fields("ACCOUNT") 

我只撤回一行,是否可以获取整列(全部6行)或者我是否必须循环所有6行以获得完整列?

提前致谢

1 个答案:

答案 0 :(得分:0)

使用.GetRows() method,它允许设置要检索的记录数,要开始的第一个记录,单个字段名称或序号位置,或字段名称或序号位置数组。

以下示例显示如何将外部Excel工作簿中的数据导入记录集,将指定字段检索到数组中,以及将结果数组粘贴到工作表中。

Option Explicit

Sub Test()

    Dim sConnection As String
    Dim sQuery As String
    Dim oConnection As Object
    Dim oRecordset As Object
    Dim aData()

    sConnection = _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "User ID=Admin;" & _
        "Data Source='" & ThisWorkbook.FullName & "';" & _
        "Mode=Read;" & _
        "Extended Properties=""Excel 12.0 Macro;"";"

    sQuery = _
        "SELECT * FROM [Sheet1$] " & _
        "IN '" & ThisWorkbook.Path & "\Src1.xlsx' " & _
        "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
        "WHERE Country='UK';"

    Set oConnection = CreateObject("ADODB.Connection")
    oConnection.Open sConnection
    Set oRecordset = oConnection.Execute(sQuery)
    oRecordset.MoveFirst
    aData = oRecordset.GetRows(, , Array("CustomerID", "ContactName"))
    With ThisWorkbook.Sheets(1)
        .Cells.Delete
        Output2DArray .Cells(1, 1), WorksheetFunction.Transpose(aData)
        .Cells.EntireColumn.AutoFit
    End With
    oConnection.Close

End Sub

Sub Output2DArray(oDstRng As Range, aCells As Variant)

    With oDstRng
        .Parent.Select
        With .Resize( _
                UBound(aCells, 1) - LBound(aCells, 1) + 1, _
                UBound(aCells, 2) - LBound(aCells, 2) + 1)
            .NumberFormat = "@"
            .Value = aCells
        End With
    End With

End Sub

此外,Src1.xlsx工作簿中包含Customers作为与此工作簿位于同一文件夹中的数据源:

src1

生成的工作表如下,您只能看到CustomerIDContactName字段:

result