В Excel VBA разместите книгу точно над элементом управления формы - PullRequest
0 голосов
/ 07 января 2019

Вот чего я хочу достичь:

  1. Из основной рабочей книги отобразите форму пользователя. (это легко)
  2. При инициализации пользовательской формы откройте дополнительную рабочую книгу. (это легко)
  3. Как только вспомогательная рабочая книга открыта, задайте ее свойства top, left, width и height так, чтобы рабочая книга отображалась точно над элементом управления Frame1 в пользовательской форме.

Результатом всего этого является то, что вторичная рабочая книга отображается в форме виртуального элемента управления электронной таблицей.

Я использовал различные способы определения экранных координат формы и элемента управления Frame1 без окончательного результата. Различные интерфейсы Win32 API, кажется, попадают в его части, например, GetSystemMetrics, GetDeviceCaps, FindWindow, WindowFromPoint и т. Д.

Осложняющим фактором является то, что я не буду знать, какое разрешение экрана в операционной среде. Эта задача, похоже, переводит французский на русский, затем на латынь, затем на ацтекский язык и, наконец, на двоичный код. Мне нужен Розеттский камень. Но увы.

Кто-нибудь получил этот Розеттский камень?

Спасибо,

Bob

PS. Обратите внимание, что OWC11 не является удовлетворительным вариантом по ряду причин, включая ограничение отображения условного форматирования ячейки, доступность некоторых необходимых функций Excel и его устаревание.

1 Ответ

0 голосов
/ 07 января 2019

Чтобы получить разрешение экрана операционной среды, вы можете использовать код:

Private Declare Function GetSystemMetrics32 Lib "User32" _
Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

Private Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Const LOGPIXELSX = 88 'Might be wrong as online says 96
Private Const LOGPIXELSY = 96
Private Const POINTS_PER_INCH As Long = 72

Public Function PointsPerPixel() As Double
    Dim hDC As Long
    Dim lDotsPerInch As Long
    hDC = GetDC(0)
    lDotsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
    PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
    ReleaseDC 0, hDC
End Function

Public Function PixelsPerPoint() as Double
    Dim hDC As Long
    Dim lDotsPerInch As Long
    hDC = GetDC(0)
    lDotsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
    PixelsPerPoint = lDotsPerInch / POINTS_PER_INCH
    ReleaseDC 0, hDC
End Function

Function ScreenRes() as Double()
    Dim resolution(2) as Double
    resolution(0) = GetSystemMetrics32(0) ' width in points
    resolution(1) = GetSystemMetrics32(1) ' height in points
    ScreenRes = Resolution
End Function

Для получения разрешения используйте ScreenRes(). Затем вы можете найти местоположение форм, используя formName.left и formName.top, и я считаю, что это местоположение на основе точек. Вы можете получить код либо преобразовать его в Pxl, либо преобразовать размер экрана в точки. Затем, чтобы переместить книгу Excel, вы можете использовать Application.left и Application.top, и я почти уверен, что это также в пунктах.

Если вы хотите отформатировать его лучше для экрана, вы также можете использовать Application.width и Application.height в сочетании с formName.width и formName.height. Вы можете проверить, находятся ли границы формы за пределами экрана, используя if (formName.left + formName.width) > (PixelsToPoint *(ScreenRes)(0)) and (formName.left > 0) и аналогичную форму для высоты.

Вероятно, в моем коде есть ошибки, поскольку я не проверял его в VBA, но, надеюсь, это начало того, что вам нужно. Если кто-то захочет внести изменения в мой код, я буду чрезвычайно признателен, и надеюсь, что сказанное мной поможет, поскольку ваш вопрос был немного расплывчатым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...