📊 Excel VBA Top100
🔄

MergeCellContents

データ処理

選択した複数セルの内容を区切り文字で結合し、先頭セルに出力します

複数のセルの内容を指定した区切り文字で連結し、一つのセルにまとめるマクロです。CONCATENATE関数やTEXTJOIN関数と同様の処理をVBAで実現しており、連結対象のセル範囲と区切り文字をダイアログで指定するだけで使えます。姓と名を「姓名」にまとめる・住所の都道府県・市区町村・番地を一行にする・複数の商品コードを連結してユニークキーを作成するなど、データ加工の場面で幅広く活用できます。結合結果は数式ではなく値として出力されるため、元の列を後から削除しても結果が壊れません。TEXTJOIN関数は新しいバージョンのExcelでしか使えませんが、このマクロは古いバージョンでも同じ結果を得られます。SplitCellDataと対になる関係で、「分割して整形→必要な形に再結合」という流れを覚えると、住所・氏名・コード類の加工がほぼすべてこの2つで完結します。

MergeCellContents デモ

📖 使い方

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

🎯 活用シーン

  • ✓苗字と名前が別々のセルに入っているデータを「氏名」として一つのセルに結合して名簿を作成したいとき
  • ✓郵便番号・都道府県・市区町村・番地が別列に入っている住所データを一つのセルに連結したいとき
  • ✓複数の識別コードを組み合わせてユニークなキーを生成し、データの照合に使いたいとき
  • ✓システム登録用に「姓+名+部署」を1つの表示名フィールドにまとめたデータを作成したいとき
  • ✓複数列に分かれた品番・色・サイズを連結して、ECサイト用のSKUコードを一括生成したいとき

💡 実装のヒント

  • ▸区切り文字には空白・カンマ・ハイフンなど任意の文字列を指定できます。区切りが不要な場合は空文字を指定してください。
  • ▸空白セルが含まれる場合、空白セルの部分は区切り文字が連続するので注意してください。TrimSpacesや空白除去と組み合わせると整形しやすくなります。
  • ▸連結結果は値として貼り付けられるため、後から数式を参照する場合はコピー後に「値のみ貼り付け」を行ってください。
  • ▸結合前の元データを残したい場合は、範囲を別の列にコピーしてから実行してください。
  • ▸日付セルを結合するとシリアル値(数字)になる場合があります。日付は事前にTEXT関数などで文字列化しておくと意図した表記で結合できます。

💻 VBAコード

' MergeCellContents
' -----------------
' Macro Name: MergeCellContents
' Description: 選択した複数セルの内容を区切り文字で結合し、先頭セルに出力します
' Parameters: なし
' Returns: なし
' Usage: 結合したいセル範囲を選択してから MergeCellContents を実行します
' -----------------

Sub MergeCellContents()
    On Error GoTo ErrorHandler

    Dim rng As Range
    Dim cell As Range
    Dim delimiter As String
    Dim result As String
    Dim isFirst As Boolean

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

    Set rng = Selection

    delimiter = InputBox("区切り文字を入力してください(例: , またはスペース)", "区切り文字", ", ")

    isFirst = True
    For Each cell In rng
        If Not IsEmpty(cell) Then
            If isFirst Then
                result = CStr(cell.Value)
                isFirst = False
            Else
                result = result & delimiter & CStr(cell.Value)
            End If
        End If
    Next cell

    rng.Cells(1, 1).Value = result

    MsgBox "セルの内容を結合しました", vbInformation, "完了"

    Exit Sub

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