5

私のExcelVBAには、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

また、転置ワークシート機能を使用することもできますが、入力データがすでに転置されていることを期待して、これを直接行う方法は今のところよくわかりません。

これは、このトピックに関する優れた公式の例と詳細情報です。自動化を使用してADORecordsetからExcelにデータを転送する方法

特に「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

(これは、で配列ベースを変更しておらずOPTION BASE、ご使用のバージョンのExcelで変更されてRange.Resizeおり、oResultsがゼロになることはないことを前提としています)

これに関する1つの調整は、これを関数にして、正しいサイズの範囲を返すことです。これは、結果セットをカバーするために名前付き範囲のサイズを変更する場合に便利です。

もう1つの考えられる微調整は、オプションで、最初の列に追加するフィールド名をユーザーに要求できるようにすることです。私はこれ以上良いものは何も見つかりませんでした:

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に組み込まれているトランスポーズを使用します。1つのステートメントで転置できます。ループは必要ありません。テストおよび検証済み。

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

このコードは、実際の例から直接コピーされています。

これはワークシート関数であるため、ワークシートの列数までのサイズの配列でのみ機能することを期待してください。シートあたりの列数はExcelのバージョンによって異なると思います。そのため、Excelのバージョンに基づいて転置制限を決定するのが安全です。

「最新バージョンのExcelでは、これは16,384列の列XFDです。古いバージョンのExcel(2003以前)では、最後の列は256列のIVでした。」 https://officemastery.com/_how-many-rows-and-columns-in-excel/

于 2021-10-03T19:57:10.603 に答える
-2

私の提案は、VBAをまったく使用しないことです。Microsoftは、データベースからデータをインポートする機能をすでに提供しています。

Data -> Import External Data

次に、シート内にQueryTableが作成され、右クリックして定期的に更新できます。もう1つのボーナスは、厄介なマクロ警告が表示されないことです。QueryTableは、テーブル、クエリ、またはストアドプロシージャです。

それを試してみてください!

于 2012-10-31T03:26:33.430 に答える