こんにちは!Lenocoです。本日も見てくださりありがとうございます。
今日は「選択範囲内で中央」の範囲を取得してみましょう!
「選択範囲内で中央」の範囲を取得する
「選択範囲内で中央」、使用したことがありますか?
セル範囲を選択、「セルの書式設定」で「配置」タブ内で「文字位置」を
「選択範囲内で中央」を選択することで、まるで
「セルを結合して中央揃え」と同じ見た目になるけれど、セル結合はされていない状態になります。
セル結合がされてしまうと、並び替えやフィルターの際に不都合が出てしまいますが、
「選択範囲内で中央」にすることでそれが解決されます。
詳しくはこちらをご覧ください
ただ、マクロでその「選択範囲内で中央」のセル範囲を取得するとき、
セル結合であれば、
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