VBA 基本技術カテゴリの記事です。今回はセル範囲の座標とサイズ 取得する方法を解説します。オートシェイプを作る場所やサイズを決めるときに重宝します。
【VBA】Top・Left・Width・Heightプロパティ
Rangeオブジェクトにはセル範囲の位置と幅の情報を得るために Top、Left、Width、Height の 4 種類のプロパティが用意されています。たとえばセル範囲 C4:D5 に適用した場合は、それぞれ下の図のような値を取得します。
選択したセル範囲の位置とサイズの情報を取得する簡単なプロシージャを書いてみます。
'[VBA] 選択範囲の位置とサイズを取得します Sub Range_Position() Dim cleft As Double, ctop As Double Dim cheight As Double, cwidth As Double With Selection cleft = .Left ctop = .Top cwidth = .Width cheight = .Height End With Debug.Print cleft; ctop; cwidth; cheight End Sub
たとえば、上図のような状況で C4:D5 を選択して Range_Position() を実行するとイミディエイトウィンドウに 96, 54, 96, 36 のような数字が並びます(もちろん開いているシートの行幅や列幅によって出力される値は異なります)。
Width とか Height とか書くのが面倒くさいというような人のために、数字を指定して必要な情報をとる Function Macro (ユーザー定義関数) もつくっておきました。
'[VBA] 単独セルの位置と幅を取得するファンクションマクロ Function CPOS(y As Integer, x As Integer, n As Integer) As Double Select Case n Case 1 CPOS = Cells(y, x).Left Case 2 CPOS = Cells(y, x).Top Case 3 CPOS = Cells(y, x).Width Case 4 CPOS = Cells(y, x).Height End Select End Function
この関数を呼び出すときは
=CPOS(行, 列, 情報番号)
と記述します。情報番号はそれぞれ
1:left
2:Top
3:Width
4:Height
に対応しています。たとえば
=CPOS(4,3,3)
とすれば、C4セルの幅の値を取ってくれます。
マウスで好きなセル範囲を選択して、そこにぴったりはまる長方形を作成するプロシージャを載せておきます。
'[VBA] 選択した範囲に長方形を作成するマクロ Sub Make_Rectangle() Dim p1 As Single, p2 As Single Dim s1 As Single, s2 As Single With Selection p1 = .Left p2 = .Top s1 = .Width s2 = .Height End With ActiveSheet.Shapes.AddShape(msoShapeRectangle, p1, p2, s1, s2) _ .Fill.Visible = False End Sub
たとえば、次のように B3:D4 の範囲を選択して Make_Rectangle() を実行すると…
長方形ができましたね! ちなみに、AddShapeメソッドは
Shapes.AddShape(図形の種類, Left, Top, Width, Height)
という記述で Shapesコレクションに新しい図形を追加しますけど、
Left, Top, Width, Height
の部分に選択範囲の位置と幅の情報を指定しているのです。他にも円とか矢印とか、好きな図形を描けるので色々試してください。
コメント