2017-01-03 4 views
0

Предположим, у меня есть пользовательская форма с 5 строками. Каждая строка состоит из multple управления, для примера:Добавьте одну функцию ко многим элементам управления

<Text field> | <Text field> | <Combo box> 

Когда значение/столбца (текстовое поле) первого управления изменяется в одном из рядов, у меня есть функция Я хотел бы позвонить. Возможно ли это без пяти отдельных функций _Change (по одному для каждой строки)?

+0

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

+0

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

+0

kk. В конкретном случае 'SUM'-Field вы могли бы подумать о добавлении' .ControlSource' с '[Text0] + [Text1] + ....' to ** в одно конкретное поле суммы ** (вручную или с петлей над вашими элементами управления). Тогда вам не нужно возиться с событиями ваших входных полей. Для более сложной функции, требующей VBA, см. Мой пост ниже. –

ответ

0

Существует достаточно быстрый, но неоправданно грязный способ добавления Eventhandlers нескольких элементов управления ...

я) определяют функцию, которую вы хотите позвонить с Change. Afaik это должен быть Public Function в нормальном модуле

ii) создать Access-makro (не VBA) с RunCode -Event, который вызывает вашу функцию.

enter image description here

III) добавить событие элементов управления, либо с вашей точки зрения дизайна или что-то вроде

Private Sub Form_Current() 
    Dim ctl 
    For Each ctl In Me.Controls 
     With ctl 
      If .ControlType = acTextBox Then 
       .OnChange = "Makro1" 
      End If 
     End With 
    Next ctl   
End Sub 

Примечание:

  • приведенный выше код добавляет событие во все текстовые поля (из-за меня ленивый). замените If .ControlType = acTextBox Then на проверку по своему вкусу. Вы можете использовать тег, смарт-тег, простые условности имени как tbx_c1r1 или массивы элементов управления, если вы фантазия

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

Надеюсь, это поможет! Буду рад, если кто-нибудь придумает более разумный подход.

+0

Спасибо за предложение. Хотя грязный (как вы сказали), он действительно исправит мою проблему. Я бы предпочел не использовать Access хотя (но, возможно, мне нужно). – Noceo

+0

Мне очень жаль, я почему-то пропустил то, что получил превосходство, а не доступ! –

+0

Не беспокойтесь. Если вам интересно, я нашел возможное решение здесь: http://stackoverflow.com/questions/5940596/excel-vba-userform-execute-sub-when-something-changes - хотя я изо всех сил стараюсь заставить его работать с ' _Exit() ', а не просто' _Change() ' – Noceo

Смежные вопросы