セルが結合されている場合は、結合範囲で処理
先日は、指定セルの中に良い感じで線矢印を作成することに挑戦した。
infoment.hatenablog.com
ところで、この機能を用いて連続的に矢印を作成したところ、困ったことになった。線矢印の描画対象セル。
ご覧のとおり、B2とC2が結合されている。この状態で、↓ のマクロを実行すると、このようになる。
Sub test_1() Dim r As Range For Each r In Range("B2:G2") SetArrow r Next End Sub
【結 果】
B2~C2で1本の線矢印としたいのに、2本作成されている。
【予 定】
そこで今回は、この解決に挑戦する。
【今回の作戦】
- 対象セル毎に、そのセルが結合されているか否か確認
- 結合されていなければ、線矢印描画
- 結合されている場合、結合範囲の一番左上セルである場合に限り、結合範囲全体に対して線矢印を描画
まず、対象セルが結合されているか否かについては、MergeCellsプロパティで確認する。
docs.microsoft.com
実際に、先程のtestマクロを少し書き換えて確認してみよう。
Sub test_2() Dim r As Range For Each r In Range("B2:G2") Debug.Print r.MergeCells Next End Sub
結果、最初の二つのセルが結合されている(True)ことが分かる。
それでは、選択したセルが結合セル内の一つ目(=一番左上)であることは、どのようにして確認するか。今回は、MeargeAreaプロパティで取得してみる。
docs.microsoft.com
以下のマクロで確認してみよう。
Sub test_3() Dim r As Range For Each r In Range("B2:G2") If r.MergeCells Then Debug.Print r.MergeArea.Cells(1, 1).Address End If Next End Sub
結果、結合されたセルは二つであり、結合セル内の一つ目のセルがB2であることが分かった。
以上のことから、最初の作戦に沿ってマクロを作成してみた。
Sub test_4() Dim r As Range For Each r In Range("B2:G2") If r.MergeCells Then If r.Address = r.MergeArea.Cells(1, 1).Address Then SetArrow r.MergeArea End If Else SetArrow r End If Next End Sub
結果は、↓ 以下のとおり。
意図した処理を実現できた。どうやら、上手くいったようだ。
なお、今回の方法が最適解かどうかは、また別のお話。
(もっとスマートな方法が無いか、引き続き探してみます)。
参考まで。