エクセルのセル結合は、データベースの観点からはあまりおすすめできることではありません。しかし、印刷をする際には、セルが結合されたデータの方が格段に見やすいという現実があります。そして、セルの結合が好きな人が多いのもまた事実。
そこで、今回紹介するVBAコードは、セルの結合に関わる課題に対処しました。
参考・セルの結合が1列のみ:VBAでセルの結合~フィルターで正しい抽出ができる方法
通常、セルを結合した一覧では、通常の抽出機能が期待通りに機能しづらいことがあります。しかし、この記事で紹介するVBAコードは、抽出機能も有効にサポート。
目次
複数列の結合の例
結合前のデータです。
結合後のデータです。
抽出した場合でも、正しくすべて抽出可能。
抽出後
複数列の結合と抽出機能を有効にしたコード
Sub sample() Dim wh As Worksheet Dim i As Long Dim c As Long Const cSaki As Long = 5 Const cHani As Long = 2 Dim sName As String: sName = "都道府県一覧" Dim T As Double: T = Timer With Application .ScreenUpdating = False .DisplayAlerts = False End With Set wh = ActiveWorkbook.Worksheets(sName) Dim LR As Long: LR = wh.Cells(wh.Rows.Count, 1).End(xlUp).Row wh.Range(wh.Columns(1), wh.Columns(cHani)).Copy wh.Range(wh.Columns(cSaki), wh.Columns(cSaki + cHani)) For i = 2 To LR If wh.Cells(i, cSaki) = wh.Cells(i + 1, cSaki) Then For c = 1 To cHani wh.Range(wh.Cells(i, c), wh.Cells(i + 1, c)).Merge Next c End If Next i wh.Range(wh.Columns(cSaki), wh.Columns(cSaki + cHani - 1)).Copy wh.Range(wh.Columns(1), wh.Columns(cHani)).PasteSpecial Paste:=xlPasteFormulas wh.Range(wh.Columns(cSaki), wh.Columns(cSaki + cHani)).Delete With Application .Goto Reference:=wh.Range("A1"), Scroll:=True .ScreenUpdating = True .DisplayAlerts = True .CutCopyMode = False End With MsgBox "処理時間:" & Timer - T & " 秒" End Sub
説明
- 5行目:一時的なコピー先の列番号
- 6行目:結合する列の最終列番号
- 7行目:対象のワークシート名
- 9行目:処理時間計測のための変数、計測はなくても問題ありません。
- 11~14行目:画面の更新を無効にし、警告メッセージを非表示にします。これにより、処理が高速化されます。
- 18行目:ワークシートの最終行を取得します。
- 20行目:指定した列を一時的なコピー先にコピーします。
- 22~28行目:隣接する行の特定の列の値が同じ場合、それらの行の対応するセルを結合します。
- 30~31行目:抽出機能を正しく行うための設定です。
- 33行目:不要になった一時的なコピー列を削除します。
- 35~40行目:データの最上位を表示、画面の更新を有効にし、警告メッセージを再表示します。
- 42行目:メッセージボックスを表示して処理時間を表示します。