2014-01-14 4 views
1

Предположим, у меня есть пользовательская форма с командной кнопкой с именем cmd_1.Получить имя объекта в функции обратного вызова для объекта VBA?

Для моей заявки у меня есть много проверок, которые я хотел бы сделать в этом клике - см. this question для обсуждения того, что я пытаюсь сделать. В основном я надеюсь реализовать единую функцию обратного вызова с логическими правилами, которые я проверяю на основе имени вызывающего объекта, чтобы определить правомочность действий этого элемента управления.

Это будет выглядеть примерно так:

private function isValid(p_controlName as string) as boolean 
    'logical checks based on the the value of p_controlName 
    'returning true/false as appropriate 
end function 

и я бы использовать что-то вроде этого

Private Sub cmd_1_Click() 
    if isValid("cmd_1") = false then exit sub 
End Sub 

Теперь я буду помещать это в много обратных вызовов интерфейса (Мне не нравится думать о том, сколько). Я бы предпочел избежать утомительного добавления имени элемента управления для каждого обратного вызова. Я очень, очень много предпочел бы сделать что-то вроде:

Private Sub cmd_1_Click() 
    'this is not valid syntax 
    if isValid(ThisControl.name) = false then exit sub 
End Sub 

Это лучше целому ряду причин, в простоте реализации, последовательности, с меньшей вероятностью ошибок и т.д.

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

  • Есть ли способ получить имя элемента управления в коде VBA из функции обратного вызова для использования в качестве аргумента, как я пытаюсь?

ответ

2

Если это только обработчики событий нажатия кнопки, то Screen.ActiveControl.Name должен получить, что вы хотите - Screen.ActiveControl возвращает управление с фокусом клавиатуры, и кнопка команды принимает фокус клавиатуры на время нажатия.

+0

Хм это, кажется, скорее всего, будет именно то, что мне нужно. Я, вероятно, буду постоянно параноидальным, что 'ActiveControl' вернет недействительный элемент управления по любой причине, хотя ... – enderland

0

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

Dim rect As Control 
Dim coll As Form 

Set coll = Forms("myForm") 
For Each rect In coll.Controls 
    If rect.ControlType = acRectangle Then 
     rect.OnClick = "=myCallbackFunction(" & param & ")" 
    End If 
Next rect 

myCallbackFunction это просто функция на той же форме как контроль, или публичную функцию в модуле.

Я сделал это, когда каждый прямоугольник (до 100, предварительно сгенерированный на высоте 0 в моей форме) перемещается и становится видимым на основе набора записей, тогда у них есть эта настройка события onclick на основе идентификатора из записей. В моем случае он выбирает другую запись подформы для соответствия щелчка прямоугольника.

Дон великий день

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