VBAサンプル集
シート内に散在する複数表の縦結合

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2025-09-29 最終更新日:2025-09-29

シート内に散在する複数表の縦結合


このVBAマクロは、一つのシート内に散在している「表」と見なされる連続したデータ範囲を抽出し、新しいシートにそれらを一つに縦結合して貼り付けることを目的としています。


シート内に散在する複数表の縦結合

シート内に散在する複数表の縦結合


シート内に散在する複数表の縦結合するVBA

Sub AggregateTables()
  Dim wsSource As Worksheet    '元データがあるシート(アクティブシート)
  Dim wsDest As Worksheet     'データを結合して貼り付ける新しいシート
  Set wsSource = ActiveSheet   'アクティブなシートを元シートに設定
  Set wsDest = Worksheets.Add   '新しいワークシートを追加し、結合先シートに設定
  
  Dim dictRegions As Object    '検出した表のアドレスを格納し、重複を避けるためのDictionaryオブジェクト
  Set dictRegions = CreateObject("Scripting.Dictionary")
  
  On Error Resume Next
  Dim rngData As Range      '元シートでデータが入力されているセル全体
  'UsedRange内の定数セル範囲を取得
  Set rngData = wsSource.UsedRange.SpecialCells(xlCellTypeConstants)
  '定数セル範囲と、UsedRange内の数式セル範囲を結合
  Set rngData = Union(rngData, wsSource.UsedRange.SpecialCells(xlCellTypeFormulas))
  On Error GoTo 0
  
  Dim rngCell As Range      'データ範囲を検出するための単一セル
  Dim rngRegion As Range     '連続したデータ範囲(表)
  Dim Key As Variant       'Dictionaryのキー(表のセル範囲アドレス)
  Dim lngRow As Long       '結合先シートの次に行を書き込む開始行番号
  lngRow = 1
  
  'データの結合処理
  lngRow = 1
  If Not rngData Is Nothing Then
    '元シートから独立した表(rngRegion)を抽出する
    For Each rngCell In rngData.Cells
      Set rngRegion = rngCell.CurrentRegion
      '取得した表のアドレスがDictionaryに存在しない場合に追加
      If Not dictRegions.Exists(rngRegion.Address) Then
        dictRegions.Add rngRegion.Address, rngRegion
      End If
    Next rngCell

    '抽出した表を結合先シートに貼り付ける
    For Each Key In dictRegions.Keys
      'Key(アドレス)を使って、対応する表のセル範囲オブジェクトを取得
      Set rngRegion = dictRegions(Key)
      rngRegion.Copy

      '結合先シートの現在行(lngRow)に貼り付け
      With wsDest.Cells(lngRow, 1)
        .PasteSpecial xlPasteValues
        .PasteSpecial xlPasteFormats
      End With

      lngRow = lngRow + rngRegion.Rows.count
    Next Key
  End If
  
  Application.CutCopyMode = False
End Sub


シート内に散在する複数表の縦結合するVBAの解説

このVBAマクロは、一つのシート内にランダムに配置されている複数の表を、新しいシートに上から順に連結(縦結合)する処理を行います。

1. 処理対象の特定(どのセルにデータがあるか)
シートの隅から隅まで見るのではなく、データが入力されているセルだけを対象にします。
UsedRange.SpecialCells(...) を基点に、以下の2種類のセルだけを抽出しています。

xlCellTypeConstants:
定数が入力されているセルを抽出します。
これは、キーボードから直接入力されたテキストや数値など、手動で設定された値を持つセルを意味します。
xlCellTypeFormulas
数式が入力されているセルを抽出します。
これは、=SUM(A1:A10)や=TODAY()などの計算式の結果を表示しているセルを意味します。
このように、Unionメソッドを使ってこの2つを結合することで、書式設定だけが施された空白セルなどを避け、真のデータが入っているセルだけを効率的に処理対象とします。

2. 独立した表(テーブル)の検出
取得したデータセルを一つずつ調べ、それぞれのセルがどの表に属しているかを特定します。
CurrentRegion プロパティがこの処理の核です。
あるセルを基準に、空白の行・列で囲まれるまでの連続したデータ範囲(つまり一つの独立した表)全体を自動で検出します。

3. 表の重複排除と管理(Dictionaryの活用)
一つの表には複数のセルがあるため、全てのセルからCurrentRegionを取得すると、同じ表が何度も検出されてしまいます。
Dictionary オブジェクトを使用し、検出した表のアドレス(例: "A1:C10")をキーとして登録します。
これにより、同じ表を何度も処理することなく、シート内の全ての独立した表を漏れなく、かつ重複なくリストアップできます。

4. 新しいシートへの結合
リストアップされた表を新しいシートに順番に貼り付けます。

.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats

この2つをを連続して実行します。
これにより、元の表の値だけでなく、罫線やセルの塗りつぶしなどの書式も保持したまま貼り付けが行われます。
貼り付け後、次の表が前の表の直下に来るよう、貼り付け先の行番号を貼り付けた表の行数分だけ進めることで、表を縦に連結していきます。


サイト内の参考ページ

連続セル範囲の選択
・End(xlToRight).End(xlDown) ・CurrentRegion.Offset(1, 0) ・CurrentRegion.Offset(1, 0).Resize ・CurrentRegion.Item + CurrentRegion.Count ・End(xlUp).Row + End(xlToLeft) ・Rowsで行全体を対象に ・UsedRange + UsedRange.Count ・SpecialCells(xlLastCell) ・Intersect + CurrentRegion.Offset(1, 0) ・連続セル範囲の選択のまとめ
第59回.コレクション処理(For Each)
・For Each の構文 ・Exit For ・For Each の使用例 ・RangeオブジェクトのFor Each ・For Each サイト内の参考ページ
第135回.ジャンプの選択オプション(SpecialCells)
・ジャンプの選択オプションとは ・RangeオブジェクトのSpecialCellsメソッド ・SpecialCellsの使用例
第103回.UnionメソッドとAreasプロパティ
・Unionメソッド ・Areasプロパティ ・Unionメソッドで連結した結果のRangeオブジェクトの状態について ・Unionメソッドの使用例 ・Unionメソッドの実践例
Dictionary(ディクショナリー)連想配列の使い方について
・Dictionaryを使って重複を除く ・Dictionaryの使い方その2 ・Dictionaryの使い方その3 ・Dictionaryの使い方サンプル ・サイト内のDictionary関連記事
第41回.セルのコピー&値の貼り付け(PasteSpecial)
・PasteSpecialメソッド ・値の貼り付け ・いろいろなコピーのVBAの書き方 ・PasteSpecialの使用例 ・最後に




同じテーマ「マクロVBAサンプル集」の記事

数式の参照しているセルを取得する
増殖した条件付き書式を整理統合する
条件付き書式で変更された書式を取得する
セル結合/解除でセル値を退避/回復
セル結合なんて絶対に許さないんだからね
セルの数式をネスト色分けしてコメント表示
セル結合して表を見やすくする(非推奨)
シートを削除:不定数のシート名に対応
セル番地でバラバラに指定されたセルの削除
シート内に散在する複数表の縦結合
スピル範囲の自動色付け(強調表示)


新着記事NEW ・・・新着記事一覧を見る

最長連続出現数(ランレングス)の算出|エクセル練習問題(2025-11-15)
SQL基礎問題11:連続期間の開始月と終了月を抽出|SQL入門(2025-11-14)
セル数式における「再帰」の必要性|エクセル雑感(2025-11-10)
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算|エクセル関数応用(2025-11-10)
配列を自在に回転させる数式|エクセル関数応用(2025-11-09)
非正規化(カンマ区切り)の結合と集計:最適な手法は?|エクセル雑感(2025-11-06)
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計|SQL入門(2025-11-06)
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)


アクセスランキング ・・・ ランキング一覧を見る

1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ