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

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(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