Как запретить форме пользователя охватывать элементы управления на листе?

#excel #vba

Вопрос:

Используя несколько вызовов API, я размещаю форму пользователя по центру экрана.
Во время навигации по этой форме пользователя (пользовательский эквивалент «MsgBox») я пытаюсь показать пользователю кнопку, расположенную на листе за формой пользователя.

В зависимости от разрешения и размера монитора лист за формой имеет различные коэффициенты масштабирования, и большую часть времени кнопка, выделяемая на листе, видна.
Иногда форма пользователя полностью закрывает кнопку.

Я добился некоторого успеха в определении того, закрывает ли форма кнопку, но я сталкиваюсь с проблемами, которые, как я предполагаю, связаны с масштабированием.

 Dim button as Shape
'helpBtnTop is used ByRef to provide the converted measurement
Dim helpBtnTop as Single
Set button = ThisWorkbook.Sheets("MySheet").Shapes("HelpButton")
'API Call in the following sub uses ConvertPixelsToPoints API to find the top using a conditional string arg
'"Pos" to look at only the Top measurement of the UserForm (left and Right won't matter for this use case).
ReturnPosition button.Top, sngTop:=helpBtnTop, Pos:="Top"

With UserForm
    'My problem is right here - the code itself does not _fail to execute_ but UserForm.Top,
    'button.Top, NOR helpBtnTop match up in any context.  I know some of this
    'has to do with Points vs Pixels, but I'm trying to determine which way I need to go for the
    'proper conversion.  Do I convert the UserForm.Top property to Points?  Are they already in 
    'Points and thus need to be converted back to Pixels?  Or should I be converting the button.Top
    'Property instead, and then calculating from there?
    '

    If .Top >= button.top Then
        .Top = button.top - .Height
    End If

    'For example - I have the top of my UserForm lined up directly in line 
      '(as close to pixel perfect as I can get) with the button - the various .Top properties are as follows:
      'UserForm.Top = 379.5
      'button.top = 386.25
      'helpBtnTop = 357.75.
  End With
 

В конечном итоге я включу .Height свойство формы пользователя в свои расчеты, так как хочу убедиться, что общее значение всей области формы пользователя не будет блокировать вид кнопки, но сначала я хотел бы понять, что мне нужно сделать, чтобы сравнить яблоки с яблоками, а не с апельсинами.

Если я возьму верхнюю часть каждого объекта и преобразую, используя ActiveWindow.PointsToPixelsY для измерения, я получу в пределах 6 единиц (в данном случае предполагая пиксели) друг к другу, поэтому мне придется выполнить некоторое преобразование для каждого и основывать математику на этом. Это моя единственная альтернатива?

Комментарии:

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

2. Итак, у меня есть набор кнопок на главном листе книги, которую мы разработали для сравнения наборов данных. Одна из этих кнопок-кнопка справки «?». В начале запуска, когда пользователь впервые регистрирует инструмент, есть ряд справочных диаграмм, указывающих на новые функции и т. Д. В конце есть пользовательское окно сообщения с благодарностью пользователям за регистрацию. При нажатии «ДАЛЕЕ», чтобы продолжить сообщение, оно сообщает пользователю о кнопке на главной странице, чтобы он снова увидел анимацию/диаграммы. . . Проблема в том, что иногда эта кнопка закрывается в зависимости от используемого разрешения.