📊 Excel VBA Top100
🔄

TransposeData

データ処理

選択範囲を転置(行列を入れ替え)してコピーします

選択したデータ範囲の行と列を入れ替えて別のセルに貼り付けるマクロです。Excelの「形式を選択して貼り付け→行列を入れ替える」機能をVBAで自動化しており、大きなデータ範囲でも一瞬で転置できます。行方向に並んでいるデータを列方向に変換したり、縦長のデータを横長に変えたりする場合に使用します。元データは保持され、転置したデータは指定した場所に新しく作成されます。貼り付け時に行列を入れ替える標準機能を利用しており、大量データでも確実に転置できます。関数のTRANSPOSEと違い、結果が通常の値として貼り付くため、その後の編集・並び替え・書式設定も自由に行えます。集計表のレイアウト変更・グラフ用データの向き調整・システム取込形式への変換など、「表の向きが合わない」あらゆる場面で頼れる一本です。同じDataProcessingカテゴリのSortDataやCalculateSubtotalsと組み合わせれば、データの整形から集計までを一連の流れで自動化できます。

TransposeData デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 転置したい範囲を選択してから TransposeData を実行します

🎯 活用シーン

  • ✓月ごとに行として入力した売上データを、月を列として横方向に並べた比較表に変換したいとき
  • ✓アンケート結果で質問が行、回答者が列になっているデータを、回答者が行・質問が列の形式に変換したいとき
  • ✓横長のデータを縦長に変換して、フィルタリングやソートがしやすい形式に整えたいとき
  • ✓システム取込フォーマットが「項目が列」形式のため、縦持ちで管理しているデータを横持ちに変換したいとき
  • ✓担当者ごとに横に並べた予定表を、リスト形式(縦持ち)に変換してフィルター管理できるようにしたいとき

💡 実装のヒント

  • ▸転置先のセル範囲に既存のデータがある場合は上書きされます。転置先が空であることを確認してから実行してください。
  • ▸元のデータに数式が含まれている場合、転置後は数式ではなく値として貼り付けられます。数式のまま転置したい場合はマクロの修正が必要です。
  • ▸非常に大きな範囲を転置すると処理時間がかかる場合があります。数千行×数百列を超えるデータは処理時間を考慮して実行してください。
  • ▸グラフの系列と項目を入れ替えたい場合、グラフ設定を触るよりデータ自体を転置した方が早いことがよくあります。
  • ▸転置結果は値貼り付けのため、元データを更新しても自動反映はされません。更新時はマクロを再実行してください。

💻 VBAコード

' TransposeData
' -----------------
' Macro Name: TransposeData
' Description: 選択範囲を転置(行列を入れ替え)してコピーします
' Parameters: なし
' Returns: なし
' Usage: 転置したい範囲を選択してから TransposeData を実行します
' -----------------

Sub TransposeData()
    On Error GoTo ErrorHandler

    Dim srcRange As Range
    Dim destCell As Range
    Dim destAddr As String

    If TypeName(Selection) <> "Range" Then
        MsgBox "セル範囲を選択してから実行してください", vbCritical, "エラー"
        Exit Sub
    End If

    Set srcRange = Selection

    destAddr = InputBox("転置先の先頭セルアドレスを入力してください(例: C1)", "転置先指定", "C1")
    If destAddr = "" Then Exit Sub

    On Error Resume Next
    Set destCell = ActiveSheet.Range(destAddr)
    On Error GoTo ErrorHandler

    If destCell Is Nothing Then
        MsgBox "無効なセルアドレスです", vbCritical, "エラー"
        Exit Sub
    End If

    srcRange.Copy
    destCell.PasteSpecial Paste:=xlPasteAll, Transpose:=True
    Application.CutCopyMode = False

    MsgBox "転置が完了しました", vbInformation, "完了"

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical, "エラー"
End Sub