このサイトはCocoonを使っています。現在「ミックスブルー [作者: y.hiroaki氏]」スキンを適用中です(^^)/

Excel vba セル範囲結合時に各セルの値も結合させる方法

スポンサーリンク

この記事では、前回記事でクリアできなかった「複数列と複数行を選択」した場合の結合時の挙動の改善に挑戦します。

くるみこ
くるみこ

はい! 前回は結合セルを操作するマクロの「結合編」でしたが、「列」の結合に対してはうまく機能しましたが、横方向「行」の結合ではうまく機能しませんでした。今回はその部分を改善する「結合機能向上編」です。

ヨコ方向の結合も結構使うと思うので「結合機能向上編」すごく楽しみにしていました(^^) よろしくお願いしますm(_ _)m

【この記事でわかること
・縦方向と横方向のセル結合が混在していても各セルの値も結合させる方法
・文字データをマージする際の区切り文字を任意に設定する方法

・行毎のヨコ方向に結合するRange.Mergeメソッドの引数「Across」の紹介

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は、セル結合の「結合編」の初回です。ただし縦の「列」方向の結合にはうまく機能している記事です。参考に是非覗いてみてね(^^)/

スポンサーリンク

複数範囲に対応できるセルの値を結合させる方法

【前回得られた主な改善すべき問題点】
・「複数列と複数行を選択」した場合の挙動を考える
・処理順は横方向が先に処理されるので横方向の結合を方法考える
・横方向の結合にはデータマージは改行文字ではダメ→「/」や「・」等にした方がよい

それでは今回は、まず最初にコードを紹介します。

結合時に各セルデータを改行文字でつなぐコード

'複数の選択セル範囲の結合に各セルの値もマージする
Sub MergeCellsImprove()
    Dim rng As Range, sRng As Range
    Dim txt As String, str As String
    Dim i As Long, ac As Long, col As Long
    
    On Error Resume Next
    Set sRng = Application.InputBox( _
                Prompt:="対象セル範囲を選択指定してください!" _
                , Title:="範囲選択", Type:=8)
    On Error GoTo 0
    If sRng Is Nothing Then Exit Sub
    
    '選択セル範囲毎に処理する。列数が複数ある場合列は別処理にする
    For ac = 1 To sRng.Areas.Count
        txt = "": str = "": i = 0 '変数初期化
        For Each rng In sRng.Areas(ac)
            '選択エリアの最初の列番号
            col = sRng.Areas(ac).Column
            '対象セルの列番号を比較して動作を分ける
            If col < rng.Column Then    '列が2番目以降の場合
                '列が2番目以降の場合の処理("/"でつなぐ)
                If rng.Text <> "" And rng.Text <> str Then
                    str = rng.Text
                    txt = txt & "/" & str
                End If
            Else
                i = i + 1       'カウンター
                If i = 1 Then   '初回だけ
                    txt = rng.Text
                    str = txt
                Else
                    '前回と同一でない場合だけ処理(改行文字でつなぐ)
                    If rng.Text <> "" And rng.Text <> str Then
                        str = rng.Text
                        txt = txt & vbCrLf & str
                    End If
                End If
            End If
        Next
        Application.DisplayAlerts = False 'アラートを中止
        With sRng.Areas(ac)
            .MergeCells = True  'セル範囲を結合する
            .Value = txt        '値を代入する
            .HorizontalAlignment = xlHAlignCenter '横中央
            .VerticalAlignment = xlVAlignCenter   '縦中央
        End With
        Application.DisplayAlerts = True 'アラート再開
    Next
End Sub

コード内容を解説します

選択範囲ごとに範囲の状況を把握して処理していく必要があります。
・15行目「.Areas.Count」で、取得できる数(Item=範囲数)分のループ処理を入れます。
・16行目、使用する変数「txt」「str」「i」を初期化します。
・17行目、Range.Areas(Item)で、Range.Areas.Countが1より大きければ複数です。
・17、19行目の「.Areas」は、Rangeオブジェクトのプロパティです。
 選択範囲の1つづつをItemとして持ち、コレクションオブジェクトとしてのRangeを返します。
・19行目、選択エリアの最初の列番号を取得しています。
選択範囲の列数が複数ある場合、列と行は別々に処理していくように分岐させます
・21行目、選択エリアの最初の列番号と処理セルの列番号を比較します。
・処理列番号が最初の列番号だった場合は、行の処理(27行目から)に進みます。
・処理列番号が2番目からの処理は、行ごとに列順(ヨコ方向)の処理としてセルの値を変数に区切り文字「/」付で追加していきます。
・34行目の2行目からの処理では「改行文字(vbCrLf)」を付けて変数に代入します。
・以上の処理を範囲内のタテヨコのセル数分繰り返していきます。
・41行目以降の処理でセル範囲の結合を実施し、変数の値を代入します。
・以上の処理を範囲数の数だけ繰り返して完了です。

実行したGIF画像を前回と比較してみます

・前回記事の実行GIF画像がこちらです。

・今回コードの実行GIF画像がこちらです。同時に二つの範囲を選択して実行しています。

・左側の「列」はどちらも同じ動作で問題ありません。
右側の「複数列と複数行を選択」挙動の比較では、違いがはっきり出ました!
前回は「改行文字」で全部をつないでいたので明らかにおかしい(-_-;)
今回のコードでは、ヨコ方向は「/」で並列につなぎ、タテ方向は「vbCrLf」でつないでいます。いい感じなんじゃないですか(^^♪

セルを横方向に1行づつ結合するには

・先ほどのサンプルコードでは、セル範囲の全部のセルを結合する処理でした。
・ヨコ方向の結合では、1行ごとに結合させたい場合に便利な方法があるので紹介します。

Range.Mergeメソッド引数 Across

・「Across」はRange.Mergeメソッドで使用できる引数です。
・Range.Mergeメソッドは引数を指定していない場合は、デフォルトで引数の「Across」は「False」が指定されたのと同じ動きをしています。

【構文例】
 Range(“A1”, “D4”).Merge Across:=True
・「True」が指定されると、行ごとに結合されます。

・ただし、各行ごとに値を代入していくことはできません。
・一括で各行ごとにセル値を結合して代入したい場合は別の処理方法を取る必要があります。

引数「Across」を使用したサンプルコード

'横方向のマージを行ごとに行うコード
Sub MergeCellsAcross()
    Dim sRng As Range
    
    On Error Resume Next
    Set sRng = Application.InputBox( _
                Prompt:="対象セル範囲を選択指定してください!" _
                , Title:="範囲選択", Type:=8)
    On Error GoTo 0
    If sRng Is Nothing Then Exit Sub
                
    Application.DisplayAlerts = False 'アラートを中止
    With sRng
        .Merge across:=True 'セル範囲を行ごとに結合する
        .HorizontalAlignment = xlHAlignCenter '横中央
        .VerticalAlignment = xlVAlignCenter   '縦中央
    End With
    Application.DisplayAlerts = True 'アラート再開
End Sub

・実行したGIF画像がこちらです。

・一番左のセル値が残る感じです。
・中央配置にしています。

「結合セル」の解除方法も解説しています。参考に是非ご覧ください(^^)/

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
「いつも汎用でだれでも使えて活用できるように考えてvbaを使う」というポリシーを念頭に今回の記事も書いたつもりです。
実行例のイメージが掴みづらいので「GIF画像」を配置しました
サンプルファイルを用意していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

今回の解説はいかがでしたか? 

前回の問題点はクリアできたと思います(^^)

はい! よくわかりました(^^)
ヨコ方向の結合で改行は使っちゃダメなのがよくわかりました。
引数「Across」も簡単なので使いやすそうです。

くるみこ
くるみこ

次回もセル結合で、隣接するセルが同じ値の場合に、自動で結合しちゃうコードを検討したいと思います(^^)/

【今回分かったことは】
・複数のセル範囲を範囲毎に処理していく方法
・行(ヨコ)と列(タテ)の処理方法の使い分け
・ヨコ方向の結合を方法は「改行文字」ではダメ
・ヨコ方向の結合時の区切文字は「/」や「・」等にした方がよい


ブログランキングに参加しています(^^) 応援よろしくお願いしますm(_ _)m

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてvbaを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください

スポンサーリンク

スポンサーリンク