ExcelVBA技 ユーザーフォーム E13U009
E13U009 (Excel2000~2013)
ユーザーフォームをアクティブセルの位置に表示
ユーザーフォームをアクティブセルの隣にぴったり表示する方法です。
セルのスクリーン座標をポイント単位で取得する kPosCell関数 を示します。マウスポインターにオートシェイプを追従させる等色々な場面で応用出来ます。
以下例では、アクティブセルの右下にユーザーフォームの左上がくるように表示しています。
セル位置に付いての配慮は必要と思われます。(引数posに画面で見えない位置を指定した等)
VisibleRangeプロパティ等で判定することが出来ます。
Window.VisibleRangeプロパティ
指定したウィンドウ内またはウィンドウ枠 (ペイン) 内に表示されているセルの範囲を表す Range オブジェクトを返します。一部しか表示されていない列や行も対象になります。
注ここに示したkPosCell関数は[ウィンドウ枠を固定]や[分割]には対応していません。 これらに対応した関数は実用ツール[k蘭]にて用いていて、[k蘭]-[カレンダー]コマンドでカレンダーをポップアップ表示しています。
'標準モジュール Option Explicit Option Private Module 'kPosCell関数 'セルのスクリーン座標を取得します ポイント単位 '引数 uf ユーザーフォーム ' psx,poy セル座標、pos セル位置(既定値はActiveCellの右下) ' kx,ky ポイント・ピクセル変換係数 '戻り値 0=成功 -1→未対応 Function kPosCell(uf As Object, ByRef pox#, ByRef poy#, Optional pos As Range, _ Optional ByRef kx#, Optional ByRef ky#) As Long If ActiveWindow.Panes.Count > 1 Then kPosCell = -1: Exit Function Dim zx#, zy#, pxx&, pxy&, pxx1&, pxy1& Dim ww&, hh&, deskw&, deskh&, ia As IAccessible Set ia = uf ia.accParent.accLocation 0, 0, ww, hh kx = uf.Width / ww: ky = uf.Height / hh If pos Is Nothing Then Set pos = ActiveCell.Offset(1, 1) '右下 With ActiveWindow pxy = pos.Height / kx pxy1 = pxy * .Zoom / 100 zy = pxy1 / pxy pxx = pos.Width / ky pxx1 = pxx * .Zoom / 100 zx = pxx1 / pxx pox = ky * .PointsToScreenPixelsX(0) + pos.Left * zx poy = kx * .PointsToScreenPixelsY(0) + pos.Top * zy End With End Function
'フォーム モジュール Option Explicit 'kPosCell関数の利用例 Private Sub UserForm_Initialize() Dim pox#, poy# If kPosCell(Me, pox, poy) = -1 Then Exit Sub StartUpPosition = 0 Left = pox Top = poy End Sub