Excel vba セル結合時に各セルのデータも結合させる方法

Excelワークシートでは、複数セルにそれぞれ違うデータがあるセルを結合する場合、左上端のデータだけ残る仕様となっています。

でも、どのセルのデータも取込んで表示したい場合が結構あると思います。そこで、セル結合の際にそれぞれのセルの値を取込んで表示できるようにする方法をVBAで設定してみたいと思います。

くるみこ
くるみこ

はい! 前回は結合セルを操作するマクロの「解除編」でした。
さて、今回は「結合編」です。ただし、単なる結合じゃなくてセルの文字も結合する方法を考えます。

これも「結合セル」のあるあるですね!
結合する時に片方が消えちゃうのが困る時って結構ありますよ(^^;
「結合編」楽しみです。よろしくお願いしますm(_ _)m

【この記事でわかること
・セルを結合する際に各セルの文字データもマージする方法
・文字データをマージする際に区切り文字を入れる方法

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

くるみこ
くるみこ

前回記事は、セル結合の「解除編」です。セルの結合を解除した場合、空白セルができてしまいますが、空白セルに同一データを代入してしまうExcel VBA マクロの記事でした。よかったら覗いてみてね(^^)/

セル結合時に各セルのデータも結合させる方法

まずは、動作方法を検討しましょう。

動作方法の検討

【基本動作】
・結合するセル範囲から、あらかじめそれぞれのセルの値を変数に保存しておきます。
・セルを結合する。
・結合したセルに保存しておいた変数の値を代入する。

【考慮したいこと】
・結合時のメッセージを出さないようにする(Application.DisplayAlerts = False)
・代入する値のつなぎ方を検討する。
 (単につなぐか?改行させるか?連結文字を入れる?)
・同じ文字だった場合は連結しないようにする。
・空白のセルがあった場合は改行しない。
・結合後の書式は?(中央に配置させる?)
・縦方向の場合は「改行文字」で問題なさそうです。
挙動として複数列と複数行を選択している場合、横方向が先に処理されるので処理する順番を考える必要があります。

・セル結合時のメッセージはこれです。これは表示を止める必要がありますね。

こんな感じです(^^) これで少しイメージができてきましたのでコーディングしてみます。

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

・検討したVBAコードがこちらです。

'結合時に各セルデータを改行文字でつなぐ
Sub MergeCellsCrLf()
    Dim rng As Range, sRng As Range
    Dim txt As String, str As String
    Dim i 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 Each rng In sRng
        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
    Next
    Application.DisplayAlerts = False 'アラートを中止
    With sRng
        .MergeCells = True  'セル範囲を結合する
        .Value = txt        '値を代入する
        .HorizontalAlignment = xlHAlignCenter '横中央
        .VerticalAlignment = xlVAlignCenter   '縦中央
    End With
    Application.DisplayAlerts = True 'アラート再開
End Sub

・セル範囲はApplication.InputBoxを使って選択できるようにしています。
・コード内にコメントを書いていますので参照してください。
考慮したいことの最後に書いた、「複数列と複数行を選択」した時の挙動は考慮していません。

・上の画像が動作させてみたGIF画像です。

・左側の「列」は問題ありません。右側の「複数列と複数行を選択」挙動はダメですね!
列だけの結合ならとりあえずは使えそうです(^^;
・次回記事で改善を検討したいと思います!

セルを結合する場合の注意点

・セル結合はすごく便利ですよね(^^;
・「セルを結合して中央揃え」(セルの区切りを無くす書式)すごく便利です!
・セル結合は書式の一つです。正しく使えば決して悪いものではありません。
・データシートと成形用のシートに分ける等の対応をするのがよいと思います。
・成形用のシートのデータは「データシート」から取得して使う設定にします。

例えば、プレゼン用の資料を作成する場合など、見た目をよくする必要がある場合にはセル結合を使っても良いでしょう。

セル結合が許される例

・タイトルや見出しの装飾として使う場合
・帳票として使う場合
・図形描画として使う場合

セル結合をしてもよい場所は、データ入力をしない部分(表の中身でない部分)に限られます。例えば、表のヘッダー部分や見出しに使うのであれば差し支えありません。

セル結合はしない方が良い例

「One Fact in One Place」 を壊してしまうようなところ!
 (DBなどデータを整理するとき同じデータは一か所に格納するべきということです)
・「分かりにくいから」と言ってデータの途中で結合するのはやめましょう!

前回記事は「結合セル」の解除ですから、なぜ解除しなければならないのかについても触れていますので、参考に是非ご覧ください(^^)/

スポンサーリンク

まとめ(おわりに)

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

まとめと感想など

くるみこ
くるみこ

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

前回とは正反対の「結合セル」をつくる処理でした。
でも、「列」だけで使う感じですね(^^;

はい! よくわかりました(^^)
その都度、実際に動かして検証していくのが大事すよね。次回でまた、今回できなかった部分の改善を検討するのがすごく楽しみです(^^)/

くるみこ
くるみこ

今回新たにわかった「複数列と複数行を選択」した場合の挙動について、次回絶対に改善していきましょう(^^)/

【今回分かったことは】
・セルを結合する際に各セルの文字データもマージする方法
 (1) 結合するセル範囲のそれぞれのセルの値を変数に保存しておきます
 (2) セルを結合する
   (3) 結合したセルに保存しておいた変数の値を代入する
・文字データをマージする際に区切り文字を入れる方法


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

今後の記事について

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

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

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

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

スポンサーリンク

スポンサーリンク