こんにちは、Ryoです。
Excelで図形を使う機会は多いですが、その中でも矢印の使用頻度は多いですよね。使う時に都度メニューから選んで選択するのは煩わしいので、VBAを使って範囲を選択すれば描画してくれるようにすることも出来ます。今回はInputBoxを使って範囲を選択し矢印を作成する方法について書いていきます。
1.サンプル概要
サンプルを実行すると、以下のインプットボックスが表示されます。
セル範囲をこのように選択するとInputBoxに書込まれます。
「OK」ボタンを押すことで矢印が描画されます。
日程表などを作成する際に多用しますから、ボタンやショートカットなどに割り当てておくと、作業が少し楽?になるかもしれませんね。
2.サンプルコード
Sub Sample1() Dim S_rng As Range On Error GoTo CancelError Set S_rng = Application.InputBox("選択したセル範囲に矢印を描画します", Type:=8) With ActiveSheet.Shapes.AddLine(S_rng.Left, S_rng.Top + S_rng.Height / 2, _ S_rng.Left + S_rng.Width, S_rng.Top + S_rng.Height / 2).Line .EndArrowheadStyle = msoArrowheadStealth .Weight = 6 .ForeColor.RGB = RGB(0, 0, 255) End With CancelError: End Sub
変数S_rngをRange型の変数として処理を行うので、InputBoxを表示した際に入力して返される値もRangeとする必要があります。この場合は以下記述のType:=8がそうですね。(詳細はMSDNを参照ください)
Set S_rng = Application.InputBox(“選択したセル範囲に矢印を描画します”, Type:=8)
◆エラー処理
実はここで大事なのが「エラー処理」で、サンプルコード内のOn Error GoTo CancelErrorが無いとInputBoxの「キャンセル」でエラーが表示されます。
このエラーが表示される理由は「キャンセル」ボタンを押すことでFalseが返ってくるので、指定したRange型と異なる為です。なので、エラーが発生した場合(キャンセルが押された場合)はCancelError:に飛んで何もせず終了させるという形をとっています。
◆矢印を選択した範囲の中央位置にする
後は矢印線を引きますのでAddLineメソッドを使って水平線且つ範囲中央になるように記述しています。これもMSDNが判りやすいと思います。
With ActiveSheet.Shapes.AddLine(S_rng.Left, S_rng.Top + S_rng.Height / 2, S_rng.Left + S_rng.Width, S_rng.Top + S_rng.Height / 2).Line
構文はAddLine( BeginX, BeginY, EndX, EndY )となっており、それぞれの引数はMSDNを参照してもらえれば良いかと思います。ここでは水平線にする為、第2引数のBeginYと第4引数のEndYを同じにします。
また、選択した範囲の中央位置に水平線を引くのでS_rng.Top + S_rng.Height / 2とします。
矢印についてはWithステートメント内でMsoArrowHeadStyle列挙型の定数を指定します。(詳細はMSDN参照ください)
◆矢印のスタイルについて
サンプルコードでは.EndArrowheadStyleの終点のみ矢印で指定していますが、.BeginArrowheadStyleを記述すれば始点も設定できます。
以下のサンプルコードは両端矢印にしたものです。
Sub Sample2() Dim S_rng As Range On Error GoTo CancelError Set S_rng = Application.InputBox("選択したセル範囲に矢印を描画します", Type:=8) With ActiveSheet.Shapes.AddLine(S_rng.Left, S_rng.Top + S_rng.Height / 2, _ S_rng.Left + S_rng.Width, S_rng.Top + S_rng.Height / 2).Line .BeginArrowheadStyle = msoArrowheadStealth .EndArrowheadStyle = msoArrowheadStealth .Weight = 6 .ForeColor.RGB = RGB(0, 0, 255) End With CancelError: End Sub
このSample2を実行することで、以下の様な両端矢印になります。
MsoArrowHeadStyleの指定としては以下の種類がありますので、形状はお好みで良いと思います。
msoArrowheadDiamond | ひし形矢印 |
msoArrowheadNone | 矢印なし |
msoArrowheadOpen | 開いた矢印 |
msoArrowheadOval | 円形矢印 |
msoArrowheadStealth | 鋭い矢印 |
msoArrowheadTriangle | 三角矢印 |
その他に記述しているWeightは線の太さ、.ForeColor.RGB(0,0,255)は色を指定しています。
3.【参考】ショートカットへの登録
環境によってはボタンなどに割り当ててVBAを実行させるよりもショートカットキーなどで使用したいこともあるかもしれませんので、Excelメニューから登録する方法について書いておきます。
「開発」タブの「マクロ」を選択します。
画像の画面が表示されたらショートカットとして登録したいマクロを選択して「オプション」を押します。
ここでショートカットキーの登録が出来ますので、使いやすいキーなどを設定して「OK」を押せば完了です。
頻繁に矢印を使用するファイルなどがあれば、標準モジュールに記述しておいてショートカット登録しておくと良いかもしれませんね。
4.まとめ
私自身が日程計画など作成する機会が多いのもあり、その際に使えそうなサンプルとして書いてみました。個人的には線を水平に引きたいときはShiftキー押してたりしないといけないので、やや煩わしいことがありますよね。
今回はInputBoxを使っていますが、他にも色々手段はあると思います。例えば右クリックのメニューに登録して実行させるのも良いかもしれませんね。もし何か機会があれば参考にしてくださいませ!
以上、InputBoxを使って範囲に矢印を描画する方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo