Реализация события изменения для проверки изменений в значениях текстового поля и включение кнопки «Применить» - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужна ваша помощь,

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

Я бы хотел включить кнопку «Применить» после того, как пользователь ввел какие-либо текстовые поля или выбрал какие-либо новые значения в поле со списком, и изменил свойство кнопки «Включен» с false на true.

Я просмотрел сеть, но не смог найти решение, соответствующее моим требованиям.

Любая помощь очень ценится. Мне жаль, что я перехожу через мой уровень знаний VBA здесь.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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

Из-за того, как обработчики событий связаны с источниками событий в VBA, ответ «нет».

Однако ...

Добавьте новый модуль класса в ваш проект, назовите его DynamicTextBox (у вас может быть другой для DynamicComboBox).

Option Explicit
Private WithEvents encapsulated As MSForms.TextBox

Public Sub Initialize(ByVal ctrl As MSForms.TextBox)
    Set encapsulated = ctrl
End Sub

Private Sub encapsulated_Change()
    'handle textbox changed here
End Sub

Теперь в вашей форме есть Collection из DynamicTextBox экземпляров класса - вы захотите иметь New экземпляр для каждого TextBox, для которого вы хотите обработать событие Change для.

Option Explicit
Private handlers As VBA.Collection

Private Sub UserForm_Initialize()
    Set handlers = New VBA.Collection
    Dim ctrl As MSForms.Control
    For Each ctrl In Me.Controls
        If TypeOf ctrl Is MSForms.TextBox Then
            Dim textBoxHandler As DynamicTextBox
            Set textBoxHandler = New DynamicTextBox
            textBoxHandler.Initialize ctrl
            handlers.Add textBoxHandler
        'ElseIf TypeOf ctrl Is MSForms.ComboBox Then
        '    Dim comboBoxHandler As DynamicComboBox
        '    Set comboBoxHandler = New DynamicComboBox
        '    comboBoxHandler.Initialize ctrl
        '    handlers.Add comboBoxHandler
        End If
    Next
End Sub

Обратите внимание, что этот метод инкапсуляции элемента управления WithEvents MSForms в экземпляре класса также может использоваться для обработки событий элементов управления, которые динамически добавляются во время выполнения.

Ключ в том, чтобы держать элементы управления MSForms в области видимости - это то, что делает модуль уровня Collection.

0 голосов
/ 02 ноября 2018

Это очень субъективный вопрос, поэтому нет правильного ответа. Я могу придумать способ сделать это, но в зависимости от того, что делает ваше приложение, это может быть излишним. Изложив шаги ниже.

  1. Переберите все элементы управления в форме и сохраните их текст значения в массиве. Что-то вроде

    For Each ctl In frm.Controls
     'Save the values in an array 
    Next ctl
    
  2. Используйте событие, например, нажмите на форму. Что-то еще может также работать на основе того, что делает ваша форма.

  3. В событии click проверьте значение каждого элемента управления с массивом для менять. Если да, включите кнопку «Применить» и обновите массив

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

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