皆さん、こんにちは。VBA講師の佐藤です。日々の業務効率化、お疲れ様です。
今回は、セルそのものの位置情報、つまり「画面上のどこに配置されているか」を数値で取得する「Topプロパティ」と「Leftプロパティ」について解説します。
多くの初学者は「値の書き込み」や「書式設定」で止まってしまいますが、実務で一歩先を行くエンジニアは、この座標情報を活用して「ユーザーにとって使いやすいツール」を作り込みます。
なぜセルの座標を取得する必要があるのか?
通常、VBAは「どのセルを操作するか」を指定するだけで完結します。しかし、以下のような実務の壁にぶつかったことはありませんか?
・セルをクリックした瞬間に、その位置に合わせて入力用のユーザーフォームを表示させたい。
・グラフや図形を、特定のセルの真上にピタリと配置したい。
・コメントボックスやポップアップを、入力中のセルに追従させたい。
これらは、セルの「行列番号」だけでは解決できません。画面上の「ピクセル単位の物理的な位置」を知る必要があるのです。
TopとLeftプロパティの基本
使い方は非常にシンプルです。特定のセル(Rangeオブジェクト)に対して、以下のプロパティを呼び出すだけです。
変数Top = Range(“A1”).Top
変数Left = Range(“A1”).Left
これだけで、そのセルがシートの左上からどれだけ離れているか(単位はポイント)を取得できます。
実務での活用事例:入力支援フォームの追従
私が現場でよく実装するのは「入力用フォームの追従」です。
例えば、セルを選択した際に、そのセルのすぐ隣に小さな入力補助画面を表示させるコードを考えてみましょう。
サンプルコード
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
‘ フォームの表示位置をセルの右側に設定
UserForm1.StartUpPosition = 0
UserForm1.Top = ActiveWindow.PointsToScreenPixelsY(Target.Top) / 0.75
UserForm1.Left = ActiveWindow.PointsToScreenPixelsX(Target.Left + Target.Width) / 0.75
UserForm1.Show vbModeless
End Sub
※注意:Windowsの解像度やDPI設定によって、PointsToScreenPixelsメソッドと座標計算を組み合わせるのがコツです。
講師からのアドバイス
ここで一つ重要な注意点があります。TopやLeftで取得できる値は、あくまで「その時点の」座標です。行の高さや列の幅を変更したり、ウィンドウをスクロールさせたりすると、座標は動的に変化します。
実務で安定した動作を求めるなら、「イベントプロシージャ(SelectionChangeやWindowScroll)」と組み合わせて、常に最新の座標を再計算する仕組みにすることが、バグを防ぐ鍵となります。
最初は難しく感じるかもしれませんが、座標を制御できるようになると、VBAで作れるアプリケーションの質が劇的に向上します。「ただ動くマクロ」から「プロが作ったようなツール」への進化を目指して、ぜひ皆さんの業務に組み込んでみてください。
それでは、次回の講義でお会いしましょう。
