エクセルVBA100本ノック。11本目:セル結合の警告
1 今回のお題
11…同じ数字が並んでいる、これは結合したのか、、、
画像のようにシートにはところどころにセル結合があります。
これは放置しておく訳にはいきません。
セル結合されているセルには、メモ(旧コメント)で警告文を出しましょう。
※シートは任意、警告文はご随意に
2 今回のお題の意図
結合されているセルに警告文を表示し、解除してもらうもしくは自分で結合セルを探す際に、可視的に確認できる。
セルの修正をやりやすくする。
3 回答
正直、今回のお題はまったく回答が浮かびませんでした。
なので、みなさんの回答を参考にしつつ勉強させてもらいます。
私の最初の回答
Sub ノック11本目_1() Dim ws As Worksheet: Set ws = Worksheets("sheet1") For k_union = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row If ws.Cells(k_union, 3).MergeCells Then If ws.Cells(k_union, 3).Comment Is Nothing Then ws.Cells(k_union, 3).AddComment "セル結合ダメ!" ws.Cells(k_union, 3).Comment.Visible = True End If End If Next End Sub
ws.Cells(k_union, 3).Comment.Visible = True、この部分でエラーとなってしまいます。
セルが結合されているかどうかを探す場合は、CellsよりもRangeを使って探す方がよいということが分かりました。
4 サイトの模範解答
Sub VBA100_11_01() Dim ws As Worksheet Set ws = ActiveSheet Dim rng As Range For Each rng In ws.Range("A1").CurrentRegion If rng.MergeCells Then If rng.Address = rng.MergeArea(1).Address Then If Not rng.Comment Is Nothing Then rng.ClearComments End If rng.AddComment "セル結合ダメ!" rng.Comment.Shape.TextFrame.AutoSize = True rng.Comment.Visible = True End If End If Next End Sub
処理する範囲を選択する際「For Each rng In ws.Range("A1").CurrentRegion」と記述されています。つまり、Rangeで結合されているのか探すのですね。
セルが結合されているかどうか判断する。
If rng.MergeCells Then
結合セルのアドレスが、一番頭のセルかどうか判断する。
If rng.Address = rng.MergeArea(1).Address Then
コメントがすでに入っていたら、コメントを削除する。
If Not rng.Comment Is Nothing Then
rng.ClearComments
End If
コメントを入れる。かつ、コメントの表示
rng.AddComment "セル結合ダメ!"
rng.Comment.Shape.TextFrame.AutoSize = True
rng.Comment.Visible = True
セルにコメントを入れる。
コメントのテキストサイズに合わせて、コメントFrameのサイズを自動調整する。
コメントを可視化する。
非常に、勉強になりました。
自分では結合セルは作らないようにしているのですが、他人が作ったものならいざ知らず作成されているものですよね(;^ω^)。
一つ一つ探すのも大変ですから、こういう処理を知っておくと非常に便利ですね。相手に、「コメントの入ってる部分は結合解いて再提出」と指摘もしやすいです。
5 一言
今回は、完全にお勉強会となってしまいました。
しかし、過去に4000品目のデータで結合しているエグいデータをもらったことがあるので、知っておくと便利でしょう。
勉強になりました。