2012-10-30 67 views
2

我在Excel VBA中将以下代码复制到SQL中的表中。该数据被水平地插入开始在C2单元格,但我想它垂直于柱C.转置CopyFromRecordset Excel VBA

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 

回答

2

我目前还不能对此进行测试,但你可以:

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 

你也可以使用转置工作表函数 - 但是,我现在还没有完全看到直接做这件事的方法,期望你的输入数据已经转置了。

编辑:

这里是一个很好的例子官员和有关此主题的进一步信息: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

+0

我打算这样做,如果我没有其他的想法,但事情是在插入数据(C2:W2)或结束列的任何地方,我可能有E2上的数据。所以我希望它可以马上粘贴。我现在正在测试转换工作表函数,看看它是否有效。否则我会切换一些东西,所以我可以复制这些值并粘贴它们。谢谢:) – Kristina

+0

嗯..我预计这是一个问题。你介意如何创建rsPubs吗?在这个过程中可能有办法做到这一点。 – Jook

+0

检查编辑。 – Kristina

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 
-1

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

Data -> Import External Data 

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

试试吧!

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 

(这assummes,你有没有与改变阵列基地OPTION BASE和您的Excel版本具有Range.Resize和oResults决不是Nothing)

在这方面的一个好办法就是让这个函数,返回正确的尺寸范围内 - 如果你想调整命名范围覆盖效果有用组。

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

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

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