VBA UserForm: неожиданное поведение после использования SetFocus в TextBox - PullRequest
1 голос
/ 05 марта 2019

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

UF обновляется автоматически всякий раз, когда пользователь выбирает новую ячейку / диапазончерез событие Workbook_SheetSelectionChange.

В конце процедуры обновления UF (публичная подпрограмма в модуле кода UF) я использую TextBoxName.SetFocus (наряду с .SelStart = .TextLenght), чтобы установить фокус на текстокно, готовое для того, чтобы пользователь мог начать печатать.

Теперь эта процедура обновления также запускается, когда UF активируется через событие UserForm_Activate.

Вот моя проблема

Когда UF активируется, фокус успешно установлен на TextBox с курсором, видимым в конце текста, и все, что я набираю, вводится в TextBox, как и ожидалось.

НО, если я нажимаю на новую ячейку, котораявыполняет ту же процедуру обновления, за исключением события Workbook_SheetSelectionChange, происходит нечто странное.Технически фокус на TextBox, но курсор не виден.Пробел, Enter и Backspace все работают как положено, однако буквы и цифровые клавиши не работают.Т.е. я могу удалить текст или нажать клавишу ввода, чтобы добавить новые строки, но если я нажму любую другую клавишу с цифрой / буквой, ничего не произойдет, пока я не использую мышь, чтобы снова щелкнуть текстовое поле.

Я попытался переместитьпроцедура из модуля UF, использующая .SetFocus в разных местах, в том числе после того, как Workbook_SheetSelectionChange вызывает процедуру обновления, но ничего не работает.

Что еще можно попробовать?

Заранее спасибо!

1 Ответ

1 голос
/ 06 марта 2019

Создание текстового поля снова совместным

Некоторые (оконные) процессы могут мешать .SetFocus показывать полный эффект, например, окно MsgBox, отображаемое во время проверки текстового поля, или даже завершите процедуру обновления, вызванную событием Workbook_SelectionChange, щелкая ячейку листа, как в вашем случае. Хотя вы явно устанавливаете фокус или, скорее, , потому что элемент управления внутренне не потерял (полный) фокус, таким образом, фокус элемента управления не будет / не может быть сброшен, поскольку пользовательская форма уже «имеет» его.

Чтобы преодолеть неудовлетворительную ситуацию, вы можете

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

Ссылка по теме

Чтобы получить больше информации, я рекомендую ознакомиться с пояснениями, приведенными на Сообщение о проверке ввода в текстовом поле на немодальной пользовательской форме прерывает выбор текста

Благодарности CommonSense

...