和風スパゲティのレシピ

日本語でコーディングするExcelVBA

11本目:セル結合の警告

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:セル結合の警告

#VBA100本ノック 11本目
11…同じ数字が並んでいる、これは結合したのか、、、

画像のようにシートにはところどころにセル結合があります。
これは放置しておく訳にはいきません。
セル結合されているセルには、メモ(旧コメント)で警告文を出しましょう。
※シートは任意、警告文はご随意に

セル結合禁止コメント

◇ 出題ページはこちら

ソースコード

メインモジュール

Option Explicit

' 100本ノック011:セル結合の警告
Sub 結合セルに警告コメントを挿入する()
    
    ' データ全行をループ
    Dim セル As Range
    For Each セル In WSデータ.Range("A1").CurrentRegion
        
        ' 結合先頭セルに対して処理
        If Is結合先頭セル(セル) Then
        
            ' 元のコメントは削除
            If セル.Comment Is Nothing Then
                セル.ClearComments
            End If
            
            ' 警告コメントを挿入
            セル.AddComment "!!セル結合は禁止です!!"
            セル.Comment.Shape.TextFrame.AutoSize = True
            セル.Comment.Visible = True
            
        End If
    Next
    
End Sub

汎用関数モジュール

Option Explicit

' 結合セル判定
' 参考:https://www.limecode.jp/entry/syntax/check-mergecells-mergearea
Function Is結合先頭セル(判定セル As Range) As Boolean
    Is結合先頭セル = (判定セル.MergeCells And 判定セル.Address = 判定セル.MergeArea.Cells(1, 1).Address)
End Function
Function Is結合内部セル(判定セル As Range) As Boolean
    Is結合内部セル = (判定セル.MergeCells And 判定セル.Address <> 判定セル.MergeArea.Cells(1, 1).Address)
End Function
Function Is結合セル全体(判定エリア As Range) As Boolean
    Is結合セル全体 = (判定エリア.MergeCells And 判定エリア.Address = 判定エリア.Cells(1, 1).MergeArea.Address)
End Function

解説

セル結合を検知して警告する問題でした。

コメントの挿入についてはストレートなコードですので、
ソースコードをご覧ください。


肝心のセル結合の判定ですが、
セルの結合状況の取得にはMergeCells/MergeAreaを組み合わせて使用する必要があります。


これらのコードはいちいち書くのは面倒ですので、
解答のように汎用関数にしておくのが便利です。

特に「Is結合先頭セル」は使い勝手がとても良いので、
是非とも使用してみてください。


詳しくはこちらの記事をどうぞ。
www.limecode.jp