エクセルで様々な計算式の入った表などを作った時に、見栄えの問題でやむを得ずセルの結合をしていることありませんか?
本来ならエクセルVBAを使っていつ時はセルの結合をしない方が理想なんですけどね。
表と言えば、ボウリングのリーグ戦での成績表も同じように、スコアーを入力すると自動的に計算をして成績一覧表が出来上がるように作っています。
そして個人成績表とチーム成績表では成績表に表示する内容が微妙に異なるので、セルを結合して見栄えを整えています。
当然ながら成績表なので、成績順位順に並び替えを行いますが、マクロがエラーになったことありませんか?
なぜなら、並び替えはセルの結合をしていると並び替えができずエラーになるのです。
と、いうことで、簡単な解決法がありますのでご紹介します。
MergeとUnMergeを使う
VBAでセルの結合・解除は、Mergeメソッドを使います。
基本的なVBAセルの結合
Rangeを使ってセルA1とセルB1を結合する
Rangeを使ってセル範囲A1:C2を結合する
Cellsを使ってセルA1とセルB1を結合する
Cellsを使ってセル範囲A1:C2を結合する
基本的なVBAセルの結合解除
Rangeを使ってセルA1とセルB1を結合解除する
Rangeを使ってセル範囲A1:C2を結合解除する
Cellsを使ってセルA1とセルB1を結合解除する
Cellsを使ってセル範囲A1:C2を結合解除する
VBAセル範囲を行単位で結合
最初にお話しした通り、表を使っていれば見栄えなどでセルの結合を繰り返し行単位で行うので、この方法が簡単にできます。
Mergeメソッドの引数AcrossをTrueに設定すると、選択範囲のセルを行単位で結合します。
Rangeを使ってセル範囲A1:B10を行単位で結合する
これでA1とB1が結合A2とB2が結合・・・A10とB10が結合と行単位結合の完成です。
※引数Trueを入れ忘れるとA1からB10が全て結合されるので注意!
ちなみに行単位で結合したセルを結合解除する方法は、基本的なセル結合解除と一緒です。
セル結合のある表の並び替え
では実際に、ボウリングのリーグ戦での成績表でも使用しているので、実用例をご紹介します。
ユーザーフォームに配置されたコマンドボタン(成績表)を押すと、抜粋して並び替えの部分を書き出しました。
Application.ScreenUpdating = False
ActiveSheet.Unprotect
Range(“N47:Q62,S47:T62”).UnMerge
Range(“B47:U62”).Sort KEY1:=Range(“J46”), ORDER1:=xlDescending, KEY2:=Range(“L46”), ORDER2:=xlDescending
Range(“N47:Q62,S47:T62”).Merge True
ActiveSheet.Protect
Application.ScreenUpdating = True
End Sub
- コマンドボタン13をクリックすると
- 画面の移動を停止(ちらつき防止)
- シートの保護を解除
- セル範囲N47:Q62とS47:T62を結合解除
- セル範囲B47:U62を並び替える(最優先J46・大きい順、第2優先L46・大きい順)
- セル範囲N47:Q62とS47:T62を行単位で結合
- シートの保護
- 画面移動停止解除
- マクロ記述終了
並び替えエラーを防ぐためにこのような順でVBAコード記述すれば、エラーが出なくなります。
もちろん順番を間違えるとエラーになりますよ。
参考までに
画面移動停止をしないと、結合セルの処理の時に画面が移動してしまいます。
せっかくの表なのだから表の途中へ画面切り替わらないようにするためのVBAコードです。

また、誤って表の中の数式を消されないようにするために、シートの保護は必須です。
ただし保護をかけていると並び替えもセルの結合もできないので、解除が必要なのでVBAコードを使いしています。


Excel-VBAを使えば数分かかる作業がたったの1秒で終了しますよ!