UserName2017
New Member
- Joined
- Apr 26, 2017
- Messages
- 1
I modified the code from this post:
https://www.mrexcel.com/forum/excel...-x-y-screen-coordinates-excel-cell-range.html
I need to get X Y screen coordinates of Excel VISIBLE area.
my code:
Now I have LEFT and TOP, but can't get Bottom and RIGHT coordinates. Help me please..How to get Bottom and Right of VISIBLE AREA, not application.
https://www.mrexcel.com/forum/excel...-x-y-screen-coordinates-excel-cell-range.html
I need to get X Y screen coordinates of Excel VISIBLE area.
my code:
Code:
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetDC Lib "user32" ( _
ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" ( _
ByVal hwnd As Long, ByVal hDC As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
ByVal nIndex As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" ( _
ByVal hDC As Long, ByVal nIndex As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" ( _
) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Function ScreenDPI(bVert As Boolean) As Long
Static lDPI&(1), lDC&
If lDPI(0) = 0 Then
lDC = GetDC(0)
lDPI(0) = GetDeviceCaps(lDC, 88&) 'horz
lDPI(1) = GetDeviceCaps(lDC, 90&) 'vert
lDC = ReleaseDC(0, lDC)
End If
ScreenDPI = lDPI(Abs(bVert))
End Function
Private Function PTtoPX(Points As Single, bVert As Boolean) As Long
PTtoPX = Points * ScreenDPI(bVert) / 72
End Function
Sub GetRangeRect(ByVal rng As Range, ByRef rc As RECT)
Dim wnd As Window
Set wnd = rng.Parent.Parent.Windows(1)
With rng
rc.Left = PTtoPX(.Left * wnd.Zoom / 100, 0) _
+ wnd.PointsToScreenPixelsX(0)
rc.Top = PTtoPX(.Top * wnd.Zoom / 100, 1) _
+ wnd.PointsToScreenPixelsY(0)
rc.Right = PTtoPX(.Width * wnd.Zoom / 100, 0) _
+ rc.Left
rc.Bottom = PTtoPX(.Height * wnd.Zoom / 100, 1) _
+ rc.Top
End With
End Sub
Sub test()
Dim rc As RECT, x As Integer, y As Integer, z As Integer, w As Integer
Call GetRangeRect(Application.ActiveWindow.VisibleRange, rc)
x = rc.Left
y = rc.Top
z = rc.Right
w = rc.Bottom
MsgBox ("Left: " & x & Chr(13) & "Top: " & y & Chr(13) & "Right: " & z & Chr(13) & "Bottom: " & w)
End Sub
Now I have LEFT and TOP, but can't get Bottom and RIGHT coordinates. Help me please..How to get Bottom and Right of VISIBLE AREA, not application.