以下のように、連続した値を含む範囲を選択して、今回紹介する機能を実行するだけで、セルの結合をすることができる、もしくは、その逆をすることもできます。

※こちらで作成したファイルは、記事の最後にて配布しています。
このような、複数範囲に対して、セルの結合(解除)を瞬時に行うことができる機能の作り方を紹介していきます。
1. 開発準備
機能を加えたいファイルを立ち上げ、[開発]タブから[マクロ]を選択します。

表示される以下の画面に、作成する機能の名前を入力し、[作成]を選択します。
こちらでは「ToggleMerge」と入力しています。

次に表示される以下の画面の「Sub ○○」から「End Sub」の間にコードを記述します。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

こちらで作成した機能を保存するには、マクロ有効ブック(拡張子「xlsm」)にする必要があります。
2. コードの記述
以下のコードを記述します。
Sub ToggleMerge()
Dim s As Variant: Set s = Selection
If TypeName(s) <> "Range" Then Exit Sub
If s.Columns.Count <> 1 Then Exit Sub
If s.Count > 10000 Then Exit Sub
Application.DisplayAlerts = False
Dim i As Long, r As Range
For i = 1 To s.Cells.Count
If s.Cells(i).MergeCells Then
With s.Cells(i).MergeArea
.UnMerge
.Value = s.Cells(i).Value
i = i + .Count - 1
Set r = Nothing
End With
Else
If Not r Is Nothing Then
If r.Value = s.Cells(i).Value Then
Range(r, s.Cells(i)).Merge
Else
Set r = s.Cells(i)
End If
Else
Set r = s.Cells(i)
End If
End If
Next i
Application.DisplayAlerts = True
End Sub
では、コードについて解説していきます。
Dim s As Variant: Set s = Selection
If TypeName(s) <> "Range" Then Exit Sub
If s.Columns.Count <> 1 Then Exit Sub
If s.Count > 10000 Then Exit Sub
選択している範囲の情報を変数(s)に割り当て、その範囲が以下の条件を満たしているときに処理を終了します。(上から順番に確認)
| ・セル以外(Rangeではない:図形など) ・(セルの場合で)セルが1列以外(複数列) ・(セルが1列の場合で)セルの数が10000より多い |
こちらは、処理する範囲が正しくないときにエラーになってしまうことや、範囲が膨大で処理が重たくなってしまうことを防ぐための対策です。
Application.DisplayAlerts = False
'省略
Application.DisplayAlerts = True
セルを結合するときに、以下のような警告メッセージが表示されることがあるため、このような警告メッセージの表示を一時的に無効にしています。

Dim i As Long, r As Range
For i = 1 To s.Cells.Count
If s.Cells(i).MergeCells Then
'省略
Else
'省略
End If
Next i
変数(i)は繰り返し処理(For i = 1 … Next i)でセルの位置情報を格納する用、変数(r)は1つ前のセルの情報を格納する用として用意しています。
選択されているセルを先頭から1つずつ確認し、そのセルが「結合されている場合」と「結合されていない場合」で処理を分岐しています。
With s.Cells(i).MergeArea
.UnMerge
.Value = s.Cells(i).Value
i = i + .Count - 1
Set r = Nothing
End With
セルが結合されている場合の処理で、まずは結合されているセルの範囲をWithで指定しています。
その次に、その範囲の結合を解除し、結合されていた範囲全体に、その範囲の先頭のセルの値を入力しています。
そして、セルの位置情報を格納している変数(i)に、結合されていた範囲のセルの数から1を引いた数を加えて、その範囲の末尾のセルの位置情報に上書きしています。
最後に、1つ前のセルの情報を格納する用の変数(r)を未割当にしています。
If Not r Is Nothing Then
'省略
Else
Set r = s.Cells(i)
End If
セルが結合されていない場合の処理で、1つ前のセルの情報を格納する用の変数(r)が未割当でない場合と、未割当の場合で処理を分岐しています。
未割当の場合は、現在確認しているセルの情報を変数(r)に割り当てています。
If r.Value = s.Cells(i).Value Then
Range(r, s.Cells(i)).Merge
Else
Set r = s.Cells(i)
End If
変数(r)が未割当でない場合は、その変数(r)が指すセルの値と現在の値が一致しているかどうかで処理を分岐しています。(1つ前の値と同じかどうか)
一致している場合は、変数(r)が指すセルから現在のセルまでの範囲を結合し、一致していない場合は、変数(r)に現在のセルを割り当てています。
3. ショートカットの割り当て
コードが完成したら、実行用のショートカットを割り当てます。
[開発]タブから[マクロ]を選択し、表示される画面から作成した機能を選択して、[オプション]を選択します。

表示される以下の画面にて、ショートカットを割り当てるキーを指定します。
こちらでは、Merge(結合)の略で「m」と入力し、「Ctrl + M」に機能を割り当てています。

以上の設定で確定して、設定画面を閉じます。
4. 完成
以上の手順で完成です。
セル結合したい、もしくはセル結合を解除したい範囲を選択して、「Ctrl + M」のショートカットを実行することで、以下のように切り替えることができます。

セルの結合を解除するときに、一部の罫線の設定が取り消されることがあります。
▼サンプルファイル▼












































































