セルが結合されている場合は、結合範囲で処理

先日は、指定セルの中に良い感じで線矢印を作成することに挑戦した。
infoment.hatenablog.com

ところで、この機能を用いて連続的に矢印を作成したところ、困ったことになった。線矢印の描画対象セル。
f:id:Infoment:20190715070852p:plain

ご覧のとおり、B2とC2が結合されている。この状態で、↓ のマクロを実行すると、このようになる。

Sub test_1()
    Dim r As Range
        For Each r In Range("B2:G2")
            SetArrow r
        Next
End Sub

【結 果】
f:id:Infoment:20190715071139p:plain

B2~C2で1本の線矢印としたいのに、2本作成されている。
【予 定】
f:id:Infoment:20190715071301p:plain

そこで今回は、この解決に挑戦する。
f:id:Infoment:20190715071907p:plain

【今回の作戦】

  1. 対象セル毎に、そのセルが結合されているか否か確認
  2. 結合されていなければ、線矢印描画
  3. 結合されている場合、結合範囲の一番左上セルである場合に限り、結合範囲全体に対して線矢印を描画

まず、対象セルが結合されているか否かについては、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)ことが分かる。
f:id:Infoment:20190715072457p:plain

それでは、選択したセルが結合セル内の一つ目(=一番左上)であることは、どのようにして確認するか。今回は、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であることが分かった。
f:id:Infoment:20190715073011p:plain

以上のことから、最初の作戦に沿ってマクロを作成してみた。

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

結果は、↓ 以下のとおり。
f:id:Infoment:20190715073322g:plain

意図した処理を実現できた。どうやら、上手くいったようだ。

なお、今回の方法が最適解かどうかは、また別のお話。
(もっとスマートな方法が無いか、引き続き探してみます)。

参考まで。