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

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

Проблема

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

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

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

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

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

Один из способов восстановить ярлык (из-за известной границы на известном фрейме) – использовать VBE Tools от Stephen Bullen (и даже без учета этой проблемы, если у вас нет этой замечательной Addin, вы должны). Нажмите один раз на рамке (что вы знаете, что-то скрываете) и выберите «Все» в меню «Правка» (для этого не работает Ctrl + A ). Затем удерживайте Alt-right + стрелку (потому что здесь известно, что отсутствующий ярлык находится под границей LH) и наблюдайте, как Label скрывается из-под границы рамки. Это лучше, чем просто выбрать «Все» и перетащить все элементы управления вправо, поскольку он позволяет вам заменить все остальные элементы управления на их исходные позиции, просто изменив процесс ( Alt-Left + Arrow ), пока все не вернется снова. Если вам требуется идеальное восстановление пикселов других элементов управления в исходное положение, просто посчитайте щелчки правой стрелки, удалите восстановленную метку, выберите все снова и сделайте столько же щелчков левой стрелки.

Вопрос

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

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

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 
  • Легкий способ открыть неизвестное количество файлов excel
  • Как использовать VBA для чтения значений флажка из пользовательской формы Excel
  • VBA UserForm Поиск нескольких записей, отображение и циклический просмотр
  • Значение параметра UserForm Combobox
  • Userform Listbox заполняется и очищается в зависимости от выбора из другого списка
  • Редактируемая таблица в пользовательской форме Excel VBA
  • Дизайн входного диапазона в VBA
  • Приостановка цикла VBA для редактирования рабочего листа с использованием формы пользователя или без нее
  • Как выделить содержимое элемента управления TextBox / RefEdit и настроить фокус одновременно?
  • Excel для создания сводной строки после добавления переменной суммы строк
  • Сохранить модуль класса в форме
  • Давайте будем гением компьютера.