Пользовательская форма Excel продолжает сбрасывать текст подсказки - PullRequest
1 голос
/ 10 июля 2019

У меня есть пользовательская форма в Excel, и у всех текстовых полей есть текст подсказки. Поскольку у меня много текстовых полей и текстов подсказок, которые я многократно использую во многих книгах Excel, я обнаружил, что проще редактировать текст в листе настроек, а затем использовать макрос для назначения текста из листа элементам управления в моей форме. , Это дает мне преимущество использования поиска и замены, и легче редактировать текст на листе по сравнению с использованием меню свойств. Макрос назначает текст подсказки управления следующим образом:

With formSettings
    .textBox1.ControlTipText = Sheets("Settings").Cells(4, 12).Text
End With

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

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

1 Ответ

2 голосов
/ 10 июля 2019

Вам не хватает понятия экземпляр .UserForm - это класс, а классы определяют форму / интерфейс объекта .Особенностью UserForm является то, что 1) у него есть визуальный конструктор, и 2) у него есть скрытый атрибут VB_PredeclaredId, установленный на True, что означает, что у класса есть экземпляр по умолчанию .

Когда вы делаете это:

UserForm1.Show

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

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

Совсем нет.Что-то, где-то нужно инициализировать форму.Если ваши элементы управления формой должны быть настроены во время выполнения, UserForm_Initialize является единственным наилучшим возможным местом для запуска этой конфигурации - это гарантирует, что каждый раз новый экземпляр формысоздан, он правильно инициализирован.В случае такой инструкции, как UserForm1.Show, обработчик запускается с оператором разыменования . непосредственно перед вызовом метода Show.

Объект сохраняет свое состояние до тех пор, пока он существует.Проблема в том, что «X'ing-out» формы уничтожит объект и, таким образом, вернет его в исходное состояние времени разработки.

Вы можете предотвратить самоуничтожение экземпляра формы, обработавСобытие QueryClose и установка параметра Cancel на True, когда значение параметра CloseMode равно VbQueryClose.vbFormControlMenu, а затем Hide, вместо того, чтобы уничтожать форму - конечно, вы должныникогда Unload форма тоже.

Работа с UserForm становится намного проще, когда вы контролируете, когда он создан, и когда он уничтожен .Другими словами, когда вы избегаете использования его экземпляра по умолчанию для хранения любого состояния.

With New UserForm1 ' _Initialize handler runs
    '..setup initial form state here..
    .Show
    '..access form state here..
End With ' _Terminate handler runs, object is destroyed

Я написал статьи UserForm1.Show и О модулях классов, подробно охватывающих эти темы.

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