5

我的 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

5 回答 5

5

我目前无法对此进行测试,但您可以:

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

您也可以使用转置工作表功能 - 但是,我现在还没有看到直接执行此操作的方法,希望您的输入数据已经转置。

这是一个很好的官方示例和有关此主题的更多信息:How to transfer data from an ADO Recordset to Excel with automation

特别是“使用 GetRows”部分。

这应该这样做:

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

于 2012-10-30T15:23:52.973 回答
1

已接受答案中的编辑 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

(这假设您没有使用 the 更改数组基数,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 列)。

于 2016-05-23T16:46:07.117 回答
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
于 2012-10-30T15:45:35.020 回答
0

这真的很简单。它使用 Excel 的内置转置。可以在单个语句中转置。不需要循环。经过测试和验证。

Dim vRecs, vRecsX
vRecs = rsPubs.GetRows
vRecsX = Application.Transpose(vRecs)
Sheets("Control").Range("C2").Resize(rsPubs.RecordCount, rsPubs.Fields.Count) = vRecsX

此代码直接从一个工作示例中复制而来。

请注意,由于这是一个工作表函数,因此预计它只能处理大小不超过工作表列数的数组。我相信每张表格的列数在不同版本的 Excel 之间有所不同,因此可以根据您的 Excel 版本确定转置限制。

“在现代版本的 Excel 中,这是 XFD 列,有 16,384 列。在旧版本的 Excel(2003 及更早版本)中,最后一列是 IV,即 256 列。” https://officemastery.com/_how-many-rows-and-columns-in-excel/

于 2021-10-03T19:57:10.603 回答
-2

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

Data -> Import External Data

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

试试看!

于 2012-10-31T03:26:33.430 回答