2010-06-07 65 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所有一個例程與複選框名稱的參數的隱藏,如:

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 2010-06-08 14:23:25

0

我認爲答案是創建一個都有一個複選框對象作爲它的一部分另一個類,並宣佈對象「WITHEVENTS」那我可以創建一個方法chkBox_clicked(),只要點擊任何屬於該類成員的複選框,就會調用它。我也可以在對象內存儲範圍。

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

有更多的信息.​​..順便說一句大遺址爲Excel VBA。編輯:這是行不通的。看到我下面的評論。

+0

這顯然不起作用。我收到一個錯誤,表示Object不會收到自動化事件。根據「幫助」, 「對象必須提供默認的源接口,以便您可以爲其事件編寫事件過程。此錯誤的原因和解決方案如下: 您試圖編寫事件的事件過程的對象,但該事件在對象外部不可用。 請參閱對象的文檔,以獲取有關處理您感興趣的事件的直接方式的建議。「 當我創建一個對象時發生這種情況 Public WithEvents chkBox As CheckBox – xdhmoore 2010-06-10 16:30:43