转置CopyFromRecordset Excel VBA

时间:2012-10-30 14:53:18

标签: excel vba excel-vba

我的Excel VBA中有以下代码,用于将SQL中的表中的数据复制到Excel中。此数据从单元格C2开始水平插入,但我希望它垂直插入C列。

Sheets("Control").Range("C2").CopyFromRecorset rsPubs

rsPubs是我的ADO连接。

基本上,我只想转换这些数据。这样做的有效方法是什么?任何帮助将不胜感激!

编辑: 这就是rsPubs的创建方式(连接工作正常,因为我实际上是在获取数据):

' Create a recordset object.
Dim rsPubs As ADODB.Recordset
Set rsPubs = New ADODB.Recordset

With rsPubs
    ' Assign the Connection object.
    .ActiveConnection = cnPubs
    ' Extract the required records.
    .Open "SELECT * FROM Analytics.dbo.XBodoffFinalAllocation"
    ' Copy the records into cell B3 on Sheet1.
    Sheets("Control").Range("C2").CopyFromRecordset rsPubs
    ' Tidy up
    .Close
End With

cnPubs.Close
Set rsPubs = Nothing
Set cnPubs = Nothing

4 个答案:

答案 0 :(得分:3)

我目前无法测试,但您可以:

Sheets("Control").Range("C2").CopyFromRecorset rsPubs 'copy your data
Sheets("Control").Range("C2").Copy 'copy the data into clipboard
Sheets("Control").Range("C2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, True, True

此外,您可以使用Transpose Worksheet函数 - 但是,我现在还没有看到直接执行此操作的方法,期望您的输入数据已经转置。

编辑:

这是一个很好的官方示例和有关此主题的更多信息:http://support.microsoft.com/kb/246335/en-us

尤其是“使用GetRows”部分。

EDIT2:

这应该做

Dim resultset As Variant
Dim result As Variant
resultset = rsPubs.GetRows
result = Application.WorksheetFunction.Transpose(resultset)
Sheets("Control").Range("C2").Resize(UBound(result, 1), UBound(result, 2)) = result

http://www.teachexcel.com/excel-help/excel-how-to.php?i=147811

答案 1 :(得分:0)

未测试:

Sub CopyTransposed(rng As Range, rs As ADODB.Recordset)
    Dim x As Long, y As Long
    x = 0
    Do While Not rs.EOF
        For y = 0 To rs.Fields.Count - 1
            rng.Offset(y, x).Value = rs.Fields(y).Value
        Next y
        x = x + 1
        rs.MoveNext
    Loop
End Sub

答案 2 :(得分:0)

在接受的答案中编辑2对我不起作用,但以下情况(请参阅http://www.mrexcel.com/forum/excel-questions/513845-copyfromrecordset-transpose.html我的来源):

Public Sub PlaceTransposedResults(oResults As ADODB.Recordset, rTarget As Range)
Dim vTransposed As Variant

If Not oResults.EOF Then
    vTransposed = oResults.GetRows
    rTarget.Resize(UBound(vTransposed, 1) + 1, UBound(vTransposed, 2) + 1) = vTransposed
End If
End Sub

(这是因为您没有使用OPTION BASE更改数组库,并且您的Excel版本已Range.Resize且oResults永远不会是任何内容)

对此进行一次调整是使其成为一个函数并返回正确大小的范围 - 如果要调整命名范围的大小以覆盖结果集,则非常有用。

另一个可能的调整是,您可能希望允许用户要求将字段名称添加为第一列中的字段名称。我发现没有比以下更好的了:

Dim ix As Integer
For ix = 0 To oResults.Fields.Count - 1
    rTarget.Offset(ix, 0) = oResults.Fields(ix).Name
Next ix

(当然,在这种情况下,你必须将主要结果偏移1列。)

答案 3 :(得分:-2)

我的建议是不要使用VBA。 Microsoft已经为您提供了从数据库导入数据的功能。

Data -> Import External Data

然后,它将在工作表内创建一个QueryTable,您可以在其中右键单击并定期刷新。另一个好处是你没有得到令人讨厌的宏观警告。 QueryTable可以是表,查询或存储过程。

试试吧!