スポンサーリンク

VBAセルの結合・解除を繰り返し処理する方法(行単位)

VBAセルの結合解除繰り返しExcel-VBA

エクセルで様々な計算式の入った表などを作った時に、見栄えの問題でやむを得ずセルの結合をしていることありませんか

波乗りアヒル
波乗りアヒル

本来ならエクセルVBAを使っていつ時はセルの結合をしない方が理想なんですけどね。

表と言えば、ボウリングのリーグ戦での成績表も同じように、スコアーを入力すると自動的に計算をして成績一覧表が出来上がるように作っています。

そして個人成績表とチーム成績表では成績表に表示する内容が微妙に異なるので、セルを結合して見栄えを整えています。

当然ながら成績表なので、成績順位順に並び替えを行いますが、マクロがエラーになったことありませんか?

なぜなら、並び替えはセルの結合をしていると並び替えができずエラーになるのです。

と、いうことで、簡単な解決法がありますのでご紹介します。

スポンサーリンク

MergeとUnMergeを使う

VBAでセルの結合・解除は、Mergeメソッドを使います。

エラーを防ぐには、結合・解除するセルの範囲の左上端の入力値がセルに表示されます。その為にその他のセル入力値は削除されるので注意してください。

基本的なVBAセルの結合

Rangeを使ってセルA1とセルB1を結合する

Range(“A1:B1”).Merge

Rangeを使ってセル範囲A1:C2を結合する

Range(“A1:C2”).Merge

Cellsを使ってセルA1とセルB1を結合する

Range(Cells(1, 1), Cells(1,2)).Merge

Cellsを使ってセル範囲A1:C2を結合する

Range(Cells(1, 1), Cells(3,2)).Merge

基本的なVBAセルの結合解除

Rangeを使ってセルA1とセルB1を結合解除する

Range(“A1:B1”).UnMerge

Rangeを使ってセル範囲A1:C2を結合解除する

Range(“A1:C2”).UnMerge

Cellsを使ってセルA1とセルB1を結合解除する

Range(Cells(1, 1), Cells(1,2)).UnMerge

Cellsを使ってセル範囲A1:C2を結合解除する

Range(Cells(1, 1), Cells(3,2)).UnMerge

VBAセル範囲を行単位で結合

最初にお話しした通り、表を使っていれば見栄えなどでセルの結合を繰り返し行単位で行うので、この方法が簡単にできます。

Mergeメソッドの引数AcrossをTrueに設定すると、選択範囲のセルを行単位で結合します。

Rangeを使ってセル範囲A1:B10を行単位で結合する

Range(“A1:B10”).Merge True

これでA1とB1が結合A2とB2が結合・・・A10とB10が結合と行単位結合の完成です。

※引数Trueを入れ忘れるとA1からB10が全て結合されるので注意!

ちなみに行単位で結合したセルを結合解除する方法は、基本的なセル結合解除と一緒です。

セル結合のある表の並び替え

では実際に、ボウリングのリーグ戦での成績表でも使用しているので、実用例をご紹介します。

ユーザーフォームに配置されたコマンドボタン(成績表)を押すと、抜粋して並び替えの部分を書き出しました。

Private Sub CommandButton13_Click()
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
  1. コマンドボタン13をクリックすると
  2. 画面の移動を停止(ちらつき防止)
  3. シートの保護を解除
  4. セル範囲N47:Q62とS47:T62を結合解除
  5. セル範囲B47:U62を並び替える(最優先J46・大きい順、第2優先L46・大きい順)
  6. セル範囲N47:Q62とS47:T62を行単位で結合
  7. シートの保護
  8. 画面移動停止解除
  9. マクロ記述終了

並び替えエラーを防ぐためにこのような順でVBAコード記述すれば、エラーが出なくなります。

もちろん順番を間違えるとエラーになりますよ。

参考までに

画面移動停止をしないと、結合セルの処理の時に画面が移動してしまいます。

せっかくの表なのだから表の途中へ画面切り替わらないようにするためのVBAコードです。

VBAの画面のちらつきがたった1行で解決して処理高速化も
エクセルVBAでセルの移動の時に無駄に画面が動いてちらついて見えます。ついでに処理も遅くなるので無駄な表示を止めるApplication.ScreenUpdatingを使いましょう。

また、誤って表の中の数式を消されないようにするために、シートの保護は必須です。

ただし保護をかけていると並び替えもセルの結合もできないので、解除が必要なのでVBAコードを使いしています。

VBAシートの保護したらマクロエラーになった時の対処法
さっきまで使えていたマクロがシートの保護を設定したらエラーになった経験ありませんか?でも慌てずに、コマンドボタンにプロテクトを書き加えれば解決します。

Excel-VBAもくじへ

コメント