2010-06-07 5 views
2

У меня есть таблица Excel, которая разделена на разные разделы с именованными диапазонами. Я хочу скрыть именованный диапазон при щелчке по галочке. Я могу сделать это для одного флажка, но я хотел бы иметь одну функцию, которая может скрыть соответствующий раздел на основе вызывающего флажка. Я планировал вызывать эту функцию из event_handlers, когда щелкнуты флажки, и передать этот флажок в качестве аргумента.Элемент управления Excel vba -get ActiveX при запуске обработчика событий

Есть ли способ доступа к объекту флажка, который вызывает обработчик событий?

Это работает:

Sub chkDogsInContest_Click() 

    ActiveSheet.Names("DogsInContest").RefersToRange.EntireRow.Hidden = Not chkMemberData.Value 

End Sub 

Но это то, что я хотел бы сделать:

Sub chkDogsInContest_Click() 

    Module1.Show_Hide_Section (<calling checkbox>) 

End Sub 

Эти функции определены в другом модуле:

'The format for the the names of the checkbox controls is 
'CHECKBOX_NAME_PREFIX + <name> 
'where "name" is also the name of the associated Named Range 

Public Const CHECKBOX_NAME_PREFIX As String = "chk" 


Public Function CheckName_To_SectionName(ByRef strCheckName As String) 

    CheckName_To_SectionName = Mid(strCheckName, CHECKBOX_NAME_PREFIX.Length() + 1) 

End Function 


Public Sub Show_Hide_Section(ByRef chkBox As CheckBox) 

    ActiveSheet.Names(CheckName_To_SectionName(chkBox.Name())).RefersTo.EntireRow.Hidden = True 

End Sub 

ответ

2

Поскольку вы» повторно используя стандартные (Active-X) флажки на обычном листе, тогда лучше всего создать событие Click для каждого суб, тогда c все одна рутины для Скрывать с параметром имени CheckBox, как:

Private Sub chkCheckBox1_Click() 

    If chkCheckBox1.Value = True Then 
     Call RangeHide("CheckBox1") 
    End If 

End Sub 

Private Sub RangeHide(rangetohide As String) 

    Range(rangetohide).EntireRow.Hidden = True 

End Sub 
+0

Да, это то, что я закончил делать. Я хотел бы, чтобы был способ сделать это, где я мог бы установить связь между флажком и диапазоном как частью структуры данных, а не жестко закодированной в каждую функцию события Click. Кроме того, я пытался использовать встроенные структуры данных, поэтому я бы не дублировал объектную модель Excel, создав свой собственный. – xdhmoore

0

Я думаю, что ответ заключается в создании другого класса, который имеет объект флажка в качестве части его и объявить, что объект «WithEvents» Тогда Я могу создать метод chkBox_clicked(), который будет вызываться всякий раз, когда будет щелкнуть любой флажок, являющийся членом этого класса. Я также могу сохранить диапазон внутри объекта.

http://www.cpearson.com/excel/Events.aspx

имеет больше информации ... Большой сайт BTW для Excel VBA.

EDIT: Это не работает. См. Мой комментарий ниже.

+0

Это не работает, по-видимому. Я получаю сообщение об ошибке, которое говорит, что объект не инициирует события автоматизации. Согласно «help», «Объект должен предоставить исходный интерфейс по умолчанию, чтобы вы могли записывать процедуры событий для своих событий. Эта ошибка имеет следующие причины и решения: Вы попытались написать процедуру события для события объекта, но это событие недоступно вне объекта. См. документацию вашего объекта для предложений по менее прямым способам рассмотрения интересующего вас события. " Это происходит, когда я создаю объект Public WithEvents chkBox As CheckBox – xdhmoore

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