Excel VBAで複数列のセル結合を自動化 | 抽出機能も有効

エクセルのセル結合は、データベースの観点からはあまりおすすめできることではありません。しかし、印刷をする際には、セルが結合されたデータの方が格段に見やすいという現実があります。そして、セルの結合が好きな人が多いのもまた事実。

そこで、今回紹介する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行目:メッセージボックスを表示して処理時間を表示します。
目次