2012-10-30 96 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列)。