Excel VBA

【Excel VBA】【マクロ】【Tips】「選択範囲内で中央」の範囲を取得する

こんにちは!Lenocoです。本日も見てくださりありがとうございます。

今日は「選択範囲内で中央」の範囲を取得してみましょう!

「選択範囲内で中央」の範囲を取得する

「選択範囲内で中央」、使用したことがありますか?
セル範囲を選択、「セルの書式設定」で「配置」タブ内で「文字位置」を
「選択範囲内で中央」を選択することで、まるで
「セルを結合して中央揃え」と同じ見た目になるけれど、セル結合はされていない状態になります。

セル結合がされてしまうと、並び替えやフィルターの際に不都合が出てしまいますが、
「選択範囲内で中央」にすることでそれが解決されます。
詳しくはこちらをご覧ください

【Excel VBA】【マクロ】【Tips】結合せずに文字を中央に!「選択範囲内で中央」の使い方とVBA活用こんにちは!Lenocoです。本日も見てくださりありがとうございます。 今日はちょっとニッチだけど便利なExcelの機能、「選択範囲内...

ただ、マクロでその「選択範囲内で中央」のセル範囲を取得するとき、
セル結合であれば、
MergeAreaプロパティのMergeArea.Addressを使えば、
「A1:C4」のように範囲をすぐに取得することができますが、
「選択範囲内で中央」の場合、このようなプロパティがありません。

「選択範囲内で中央」が設定されている先頭セルがわかっているときに、
そのセルからどのセルまでが設定されている範囲なのか
調べるマクロを作りました!

コード

Sub Main()
    
    Dim rg As Range
    
    Set rg = 選択範囲内で中央の範囲取得(Range("A1"))
    
    If rg.Address = Range("A1").Address Then
        MsgBox "A1セルには「選択範囲内で中央」が設定されていません。"
    Else
        MsgBox "A1セルから" & rg.Address(False, False) & "セルまで「選択範囲内で中央」が設定されています。"
    End If

End Sub
Public Function 選択範囲内で中央の範囲取得(targetRg As Range) As Range
    
    Dim adjust As Long
    If targetRg.HorizontalAlignment = xlCenterAcrossSelection Then
        '「選択範囲内で中央」が設定されている場合は基準のセル位置を右にずらしてく
        adjust = 1
        Do While targetRg.Offset(, adjust).HorizontalAlignment = xlCenterAcrossSelection And targetRg.Offset(, adjust) = ""
            adjust = adjust + 1
        Loop
        Set 選択範囲内で中央の範囲取得 = targetRg.Offset(, adjust - 1)
    Else
        Set 選択範囲内で中央の範囲取得 = targetRg
    End If

End Function

コードの説明

Mainプロシージャでセル A1 に「選択範囲内で中央」が設定されているかを確認しています。
「選択範囲内で中央の範囲取得」という関数で、A1セルから右にどこまで「選択範囲内で中央」が続いている&空白であるかを判定し、
対象範囲の右端のセルを Range として返します。
設定がされていれば、『A1セルから〇〇セルまで「選択範囲内で中央」が設定されています。』というメッセージで表示し、
されていなければ、『A1セルには「選択範囲内で中央」が設定されていません。』というメッセージを表示します。

ポイント

「選択範囲内で中央」がどこまで続いているかの判定条件ですが、
「選択範囲内で中央」が設定されている(HorizontalAlignment = xlCenterAcrossSelection)かつ、
セルが空白である、となっています。
なぜこれで最終セルが取得できるのかというと、
「選択範囲内で中央」の設定条件が以下となっているからです。
・文字列が入っているのは最初のセルのみ
・複数行にまたがる範囲では使えない

そのため、右方向のセルのみ確認すれば良く、「選択範囲内で中央」が設定されているが空白でないセルがあった場合は、
その直前の空白セルが設定範囲の最終セル、ということになります。

さいごに

左から右だけでなく、複数行対応したい場合には Rows をループ処理にすれば対応可能です!
必要に応じて修正して使用してくださいね!

Lenoco

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です