Excelでは、VBAを使って「列のアルファベット」「開始行」「終了行」を入力し、そのセル範囲に合わせたオートシェイプの右中かっこを自動配置できます。例えばC列・3行目・6行目と指定すれば、C3:C6の高さに合わせて右中かっこを作成するといった処理が可能です。
さらに、右中かっこの中央にある突起部分は通常だと図形全体の中央付近にありますが、ExcelのShapeオブジェクトには図形によってAdjustmentsという調整値が用意されています。これを利用すると、突起部分の位置もVBAから変更できます。
ポイントは、C3:C6のセル範囲からLeft・Top・Width・Heightを取得し、Shapes.AddShapeで右中かっこを作成したあと、Adjustmentsを使って突起の位置を開始行の中央へ移動することです。この記事では、その考え方と実際に使えるVBAコードを順番に解説します。
- Excel VBAではセルの位置に合わせてオートシェイプを配置できる
- 完成形のVBAコード
- C列・3行目~6行目ならどのように計算される?
- 開始行の中央は「Top+Height÷2」で求められる
- 右中かっこの突起位置はAdjustmentsで変更する
- もしAdjustments(1)で突起が思った位置に来ない場合
- 右中かっこをC列の中に置くか右側に置くかは変更できる
- 図形をセルの中に配置したい場合
- 行の高さがバラバラでも対応できる
- 入力ミスを考慮したエラーチェックも重要
- InputBoxでキャンセルした場合にも終了させる
- 列名は小文字で入力しても処理できる
- 作成した図形をセルと一緒に動かす設定
- 同じ場所へ何度も実行すると図形が増える点に注意
- マクロを実行するまでの手順
- 今回の処理で重要になるVBAの要素
- まとめ|指定した列・行範囲への右中かっこ配置はVBAで自動化できる
Excel VBAではセルの位置に合わせてオートシェイプを配置できる
Excel VBAにはワークシート上へオートシェイプを追加するShapes.AddShapeメソッドがあります。Microsoftの公式ドキュメントによると、Type、Left、Top、Width、Heightを指定して新しいShapeオブジェクトを作成できます。Microsoft公式ドキュメント[参照]
LeftとTopは図形の左上位置、WidthとHeightは図形の幅と高さです。ExcelのセルにもLeft、Top、Width、Heightがあるため、セルの座標をそのまま図形配置の基準として利用できます。
例えばC3からC6までを囲う右中かっこなら、図形の上端をC3の上端、下端をC6の下端に合わせます。これなら行の高さが標準値でなくても、実際のセルサイズから自動計算できます。
完成形のVBAコード
次のマクロでは、列を「C」、開始行を「3」、終了行を「6」のようにInputBoxへ入力すると、その範囲に合わせて右中かっこを配置します。さらに突起部分が開始行の中央付近になるようAdjustmentを計算します。
Option Explicit
Sub InsertRightBrace()
Dim ws As Worksheet
Dim colText As String
Dim startText As String
Dim endText As String
Dim startRow As Long
Dim endRow As Long
Dim targetRange As Range
Dim firstCell As Range
Dim shp As Shape
Dim shpLeft As Double
Dim shpTop As Double
Dim shpWidth As Double
Dim shpHeight As Double
Dim centerY As Double
Dim adj As Double
Set ws = ActiveSheet
colText = Trim(InputBox("列のアルファベットを入力してください。例:C"))
If colText = "" Then Exit Sub
startText = Trim(InputBox("開始する行番号を入力してください。例:3"))
If startText = "" Then Exit Sub
If Not IsNumeric(startText) Then
MsgBox "開始行は数字で入力してください。", vbExclamation
Exit Sub
End If
endText = Trim(InputBox("終了する行番号を入力してください。例:6"))
If endText = "" Then Exit Sub
If Not IsNumeric(endText) Then
MsgBox "終了行は数字で入力してください。", vbExclamation
Exit Sub
End If
startRow = CLng(startText)
endRow = CLng(endText)
If startRow < 1 Or endRow < startRow Or endRow > ws.Rows.Count Then
MsgBox "行番号の指定が正しくありません。", vbExclamation
Exit Sub
End If
On Error Resume Next
Set targetRange = ws.Range(UCase(colText) & startRow & ":" & UCase(colText) & endRow)
On Error GoTo 0
If targetRange Is Nothing Then
MsgBox "列の指定が正しくありません。", vbExclamation
Exit Sub
End If
Set firstCell = targetRange.Cells(1, 1)
shpTop = targetRange.Top
shpHeight = targetRange.Height
'右中かっこをセルの右側に配置
shpWidth = 20
shpLeft = targetRange.Left + targetRange.Width + 2
Set shp = ws.Shapes.AddShape( _
Type:=msoShapeRightBrace, _
Left:=shpLeft, _
Top:=shpTop, _
Width:=shpWidth, _
Height:=shpHeight)
'開始行の中央位置を図形全体に対する割合へ変換
centerY = firstCell.Top + firstCell.Height / 2
adj = (centerY - shpTop) / shpHeight
'右中かっこの突起位置を調整
If shp.Adjustments.Count >= 1 Then
shp.Adjustments.Item(1) = adj
End If
'塗りつぶしなし
shp.Fill.Visible = msoFalse
'セルと一緒に移動・サイズ変更
shp.Placement = xlMoveAndSize
End Sub
このコードを標準モジュールへ貼り付けて実行します。なお、Excelのバージョンや右中かっこの図形仕様によってAdjustmentの挙動を確認する必要があるため、突起位置が意図した方向へ動かない場合については後述します。
C列・3行目~6行目ならどのように計算される?
例えばInputBoxへ「C」「3」「6」と入力すると、マクロはC3:C6をtargetRangeとして取得します。
図形の上端はC3の上端です。そして図形の高さにはC3:C6全体のHeightを使います。そのため、3~6行目の高さがすべて同じである必要はありません。
例えば3行目が10ポイント、4行目が20ポイント、5行目が15ポイント、6行目が25ポイントなら、単純に「4行×標準行高」と計算するのではなく、実際の範囲の高さに合わせて右中かっこが作られます。
開始行の中央は「Top+Height÷2」で求められる
今回の重要な条件が、右中かっこの突起を「指定した最初の行の中心」に配置することです。
開始セルの縦方向中央は次の式で計算できます。
centerY = firstCell.Top + firstCell.Height / 2
例えば3行目の高さが10ポイントなら、3行目の上端から5ポイント下がった位置が中央です。つまり「セルの高さが10なら5の位置」という条件を、そのまま計算式にできます。
ただしShapeのAdjustmentsへ渡す値は、セル上の絶対座標そのものではありません。そのため、図形全体の高さに対する割合へ変換します。
adj = (centerY - shpTop) / shpHeight
例えばC3:C6全体の高さが40ポイントで、C3の高さが10ポイントなら、開始行中央は図形上端から5ポイントです。割合にすると5÷40=0.125となります。
右中かっこの突起位置はAdjustmentsで変更する
Excelの一部のオートシェイプには、黄色いハンドルをドラッグして形を変えられるものがあります。この調整部分をVBAから操作するために用意されているのがShape.Adjustmentsです。
Microsoftの公式ドキュメントによると、Adjustmentsオブジェクトには指定したオートシェイプの調整値が格納され、Adjustments(index)によって個別の値を取得・設定できます。Microsoft Adjustments公式ドキュメント[参照]
ただし、Adjustmentの数・意味・有効範囲は図形の種類によって異なります。Microsoftも、特定の図形について調整値の動作を確認する場合は、実際に図形を作成して調整する方法を案内しています。
もしAdjustments(1)で突起が思った位置に来ない場合
Officeのバージョンや対象図形によっては、想定したAdjustment番号や値の方向が異なる可能性があります。その場合、無理に数値を推測するより、Excel上で右中かっこを手作業で挿入して確認する方法が確実です。
まず「挿入」→「図形」から右中かっこを作成し、黄色い調整ハンドルを上下へ動かしてみます。その操作によって目的の突起が移動することを確認します。
VBAでは次のコードを一時的に実行すると、選択した図形が持つAdjustmentの個数を確認できます。
Sub CheckAdjustments()
MsgBox Selection.ShapeRange(1).Adjustments.Count
End Sub
例えば1と表示されるなら、その図形には1個のAdjustmentがあります。複数ある図形なら、各値を変えながらどの部分が動くか確認すると確実です。
右中かっこをC列の中に置くか右側に置くかは変更できる
完成コードでは、セルの内容を隠さないように、右中かっこを指定列の少し右側へ配置しています。
shpWidth = 20
shpLeft = targetRange.Left + targetRange.Width + 2
この「+ 2」は、セルの右端から2ポイント離すという意味です。例えばC列の右端ぴったりに置きたいなら「+ 2」を「+ 0」に変更できます。
逆にもっと離したければ「+ 5」「+ 10」などへ変更できます。また、かっこの横幅を太く広げたい場合はshpWidthの20を30などへ変更できます。
図形をセルの中に配置したい場合
右中かっこをC列の右側ではなく、C列のセル内へ重ねたい場合はLeftの計算を変更します。
例えばセルの右端付近へ図形を収めるなら、次のようにできます。
shpWidth = 20
shpLeft = targetRange.Left + targetRange.Width - shpWidth
これなら右中かっこの右端とセルの右端がおおむね一致します。ただし、セル内に文字や数値がある場合は図形と重なるため、用途に応じて位置を調整してください。
行の高さがバラバラでも対応できる
この方法の利点は、行番号から高さを推測するのではなく、Excelが持っているセルの実際の座標を利用していることです。
例えば3行目だけ高さ10、4行目は30、5行目は15、6行目は40というシートでも、targetRange.HeightからC3:C6全体の高さを取得できます。
開始行中央についてもfirstCell.Heightを使用するため、3行目の高さを後から変更してからマクロを実行しても、その時点の3行目中央を基準として計算できます。
入力ミスを考慮したエラーチェックも重要
実際に繰り返し使うマクロでは、正常な入力だけを前提にしない方が安全です。例えば開始行に「ABC」と入力した場合、Long型へ変換しようとするとエラーになります。
完成コードではIsNumericを使い、開始行と終了行が数値か確認しています。また「終了行が開始行より前」という入力も無効にしています。
さらに列名についても、存在しない文字列からRangeを作ろうとした場合に処理を終了するようにしています。自分だけが使うマクロでも、この程度のチェックを入れておくと入力間違いによる停止を減らせます。
InputBoxでキャンセルした場合にも終了させる
InputBoxを使用する場合、途中で入力をやめたくなることがあります。そのため、空文字が返された場合はExit Subでマクロを終了しています。
colText = Trim(InputBox("列のアルファベットを入力してください。例:C"))
If colText = "" Then Exit Sub
開始行・終了行についても同じ処理を行っています。これにより、途中でキャンセルしても図形作成処理へ進みません。
列名は小文字で入力しても処理できる
列名についてはUCaseを使って大文字へ変換しています。そのため「c」と入力しても「C」として扱えます。
Set targetRange = ws.Range(UCase(colText) & startRow & ":" & UCase(colText) & endRow)
また「AA」「BC」のような複数文字の列名にもRangeの指定方法自体は対応できます。そのため、A~Z列だけに限定する必要はありません。
作成した図形をセルと一緒に動かす設定
マクロの最後には次の設定を入れています。
shp.Placement = xlMoveAndSize
これは図形をセルに合わせて移動・サイズ変更するための設定です。行や列のサイズ変更を行う可能性があるシートでは便利です。
ただし、あとから行高を大幅に変更したときに「突起を常に開始行の中央へ再計算する」という処理まで自動的に行われるわけではありません。厳密な位置を維持したい場合は、行高を変更したあとに図形を作り直すか、位置を再計算する専用マクロを用意する方法があります。
同じ場所へ何度も実行すると図形が増える点に注意
このマクロをC3:C6に対して3回実行すると、基本的には同じ位置へ右中かっこが3個追加されます。一見1個に見えても図形が重なっている状態になります。
頻繁に作り直す用途なら、図形へ名前を付け、同名図形が存在したら削除してから再作成する方法が便利です。
例えば作成後に次のような名前を設定できます。
shp.Name = "RightBrace_" & UCase(colText) & "_" & startRow & "_" & endRow
C列の3~6行なら「RightBrace_C_3_6」となり、後からVBAで特定しやすくなります。
マクロを実行するまでの手順
VBAを初めて利用する場合は、Excelで対象ブックを開いてAlt+F11を押し、Visual Basic Editorを開きます。
- Alt+F11を押す
- 「挿入」→「標準モジュール」を選択する
- この記事のVBAコードを貼り付ける
- マクロ有効ブック(.xlsm)として保存する
- Excelへ戻る
- Alt+F8を押す
- InsertRightBraceを選択して実行する
- 列名、開始行、終了行を順番に入力する
会社や学校のPCではセキュリティポリシーによってマクロの実行が禁止されていることがあります。その場合はセキュリティ設定を勝手に解除せず、管理者へ確認してください。
今回の処理で重要になるVBAの要素
今回のような図形配置マクロを応用するときは、次の要素を理解しておくと便利です。
| VBA要素 | 役割 |
|---|---|
| InputBox | 列・開始行・終了行をユーザーから受け取る |
| Range.Left | セル範囲の左位置を取得する |
| Range.Top | セル範囲の上位置を取得する |
| Range.Width | セル範囲の幅を取得する |
| Range.Height | セル範囲の高さを取得する |
| Shapes.AddShape | オートシェイプを作成する |
| msoShapeRightBrace | 右中かっこの図形タイプを指定する |
| Shape.Adjustments | 図形固有の調整ハンドルに相当する値を操作する |
| Shape.Placement | セル変更時の図形の動作を設定する |
特にShapes.AddShapeでは位置とサイズがポイント単位で指定されます。Microsoft公式ドキュメントでもLeft、Top、Width、Heightは図形の境界ボックスの位置・大きさとして説明されています。Shapes.AddShape公式資料[参照]
まとめ|指定した列・行範囲への右中かっこ配置はVBAで自動化できる
Excel VBAを使えば、InputBoxへ列のアルファベット、開始行、終了行を入力し、その範囲に合わせて右中かっこのオートシェイプを自動配置できます。
例えば「C」「3」「6」と入力した場合、C3:C6のTopとHeightを取得して図形の縦位置と高さを決めます。開始行の中央については「C3.Top+C3.Height÷2」で求められるため、行高が10なら上端から5の位置を計算できます。
右中かっこの突起位置まで変更したい場合はShape.Adjustmentsを利用するのがポイントです。ただしAdjustmentの数や意味はオートシェイプごとに異なるため、利用しているExcel環境で右中かっこの調整値がどのように作用するかを確認しておくと確実です。Microsoftも図形ごとに調整方法が異なることを公式資料で説明しています。Microsoft Adjustments公式資料[参照]
セルの実際のTop・Heightを基準にすれば、行高が不揃いでも対応できます。右中かっこの横位置、幅、線の太さ、色などもShapeの各プロパティから変更できるため、今回のコードを土台としてシートのレイアウトに合わせて調整できます。


コメント