ドキュメント座標[^1]を画面座標[^2]に変換するのにWindow.PointsToScreenPixelsX()/Window.PointsToScreenPixelsY()を使おうとしたところはまってしまいました。
- (0, 0) 以外のドキュメント座標がうまく変換できない
- ウィンドウ枠の固定をしていたり、マルチディスプレイ環境の場合もうまく変換できない
踊るエクセル@ExcelVBAer さんのご教示により、ドキュメント座標がActiveWindowの.Panes(i).VisibleRange(i=1~.Panes.Count)のどこに属するか調べた上で、当該PaneのPane.PointsToScreenPixelsX()/Pane.PointsToScreenPixelsY()を使用すればよいことがわかったので、これを元に汎用プロシージャ:ConvertToScreenCoordinates()を作ってみました。
' Cell(Range)の左上の座標を画面座標に変換(戻り値はCollection)
Set Result = ConvertToScreenCoordinates(Cell.Top, Cell.Left)
Debug.Print "X:" & Result("X") & ", Y:" & Result("Y")
のようにして使用します。
※画面上にないドキュメント座標を指定した場合はNothingが返ります
[^1] ドキュメント座標(document coordinates):ワークシートの左上(A1)セルの.Top/.Leftを原点とする座標・ポイント(PPI)単位
[^2] 画面座標(screen coordinates):画面の左上を原点とする座標・ピクセル(DPI)単位
- いき.xls[互換モード]@aero_iki さんのツイートからの一連のツリー
- 元にした処理: 踊るエクセル@ExcelVBAer さんのツイート