我的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
答案 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可以是表,查询或存储过程。
试试吧!