Как восстановить элемент управления, который был заблокирован за пределами кадра?


Это касается только фреймов, и я столкнулся с этим только в Excel 11, но поскольку это явно ошибка, она, возможно, была исправлена в более поздних версиях, которые я не пробовал. Если вы используете фреймы много, это в конечном итоге укусит вас.

Задача

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

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

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

Отсутствующая метка может быть вложена в (она отображается в раскрывающемся списке Свойства), но это не выделяет ее, и она не может быть удалена, потому что она не может быть выбрана. Щелчок по имени метки в раскрывающемся списке Свойства ничего не делает.

Если вы знаете, какой кадр поглотил метку (как мы делаем в этом примере), и если вы знаете, какая граница из того кадра, под которым он находится (как мы делаем в этом примере), то есть способ восстановить отсутствующую метку. Но много раз это будет не так. Если вы на самом деле не видите, как метка исчезает, она может легко остаться незамеченной в то время, особенно когда кадры накладываются друг на друга.

Один из способов восстановить метку (из-под известной границы на известном кадре) - это использовать инструменты VBE Стивена Буллена (и даже без учета этой проблемы, если у вас не установлен этот замечательный Аддин, вы должны). Нажмите один раз на рамку (которая, как вы знаете, что-то скрывает) и выберите Все в меню Правка (Ctrl + A не работает для этого). Затем удерживайте нажатой клавишу Alt-right + стрелка (потому что здесь известно, что недостающая метка находится под границей LH) и наблюдайте, как метка робко выползает из-под границы кадра. Это лучше, чем просто выбрать все и перетащить все элементы управления вправо, потому что это позволяет заменить все остальные элементы управления на исходные позиции только в обратном порядке (альт-левый + стрелка) пока все выглядеть нормально. Если вам нужно пиксельное идеальное восстановление других элементов управления в исходное положение, просто подсчитайте щелчки Правой Кнопкой Мыши, избавьтесь от восстановленной метки, выберите все снова и сделайте то же самое количество щелчков левой кнопкой мыши.

Вопрос

1) Как найти, восстановить и / или удалить элемент управления, захваченный фреймом таким образом, если Я не знаю, под какой рамкой он находится?

2 3

2 ответа:

Вы можете запустить простой макрос против формы, чтобы обнаружить (и удалить, переместить, что угодно) скрытые элементы управления

Private Sub UserForm_Click()
    Dim ctrl As Control

    For Each ctrl In Me.Controls
        If ctrl.Left + ctrl.Width < 0 Or ctrl.Top + ctrl.Height < 0 Then
            Debug.Print ctrl.Name & " " & ctrl.Parent.Name
        End If
    Next
End Sub

@Chris, спасибо за ответ, но я не упомянул, что в моей запущенной форме в любой момент времени может быть 50-100 элементов управления, которые были перемещены (временно) за пределы их содержащих фреймов, и ваш метод найдет все это. Это все еще было бы нормально, если бы я всегда знал имя отсутствующего элемента управления, и большую часть времени я буду знать это, но не всегда.

Тем не менее, ваш метод определенно поставил меня на правильный путь. Я начал искать элементы управления которые находятся вне их содержащего кадра и вплотную к нему, однако оказывается, что они не вплотную к нему, а скорее они находятся на расстоянии до 4 пикселей от кадра (в зависимости от того, где именно был сброшен элемент управления). И просто для дополнительной извращенности, элементы управления, которые исчезли под верхней и левой границами кадра (я думаю) всегда вне кадра, но элементы управления, которые исчезли под правой и нижней границами, могут быть 0-4 пикселя либо внутри, либо снаружи. за кадром. Довольно уродливо.

Итак, вот что, кажется, работает нормально.

Dim ctrl As Control
For Each ctrl In Me.Controls
  With ctrl
    If typeName(.parent) = "Frame" then
       If .Left + .Width > -4 And .Left + .Width < 0 Then Debug.Print .Name & " " & .Parent.Name & " top border"
       If .Top + .Height > -4 And .Top + .Height < 0 Then Debug.Print .Name & " " & .Parent.Name & " left border"
       If .Left > .Parent.Width - 4 And .Left < .Parent.Width + 4 Then Debug.Print .Name & " " & .Parent.Name & " right border"  
       If .Top > .Parent.Height - 4 And .Top < .Parent.Height + 4 Then Debug.Print .Name & " " & .Parent.Name & " bottom border"
    End if
  End With
Next