VBA e coleções de objetos

Junho 2017


Quando vários (muitos) controles são postos em uma folha ou em um Userform (formulário do usuário), fica fastidioso escrever o código em cada um deles.
Esta dica te ajudará a processar seus controles como se eles estivessem indexados, (modo VB6 com índex)


Preliminares


Para testes e demonstrações, abra uma pasta nova.
Incorpore, um abaixo do outro, na coluna C ...
OptionButton1 e OptionButton2 propriedade GroupName = Folha1A (ou Plan1A)
OptionButton3 e OptionButton4 propriedade GroupName = Folha1B (ou Plan1B)
CheckBox1, CheckBox2 e CheckBox3

Salve a pasta com o nome Coleções.xls

Em um módulo


Option Explicit    
Public Collect As Collection    
Public CollectC As Collection    

Public Sub InitOption()    
Dim Obj As OLEObject    
Dim Cl As Classe1    
Set Cl = Nothing    
Set Collect = New Collection    
Workbooks("Coleções.xls").Activate    
'sistema de contrôle nos objetos da Folha1 (ou Plan1)    
For Each Obj In Sheets("Plan1").OLEObjects    
    'verifique se se trata de um OptionButton    
    If TypeOf Obj.Object Is MSForms.OptionButton Then    
            
        Set Cl = New Classe1    
        Set Cl.OptionButtonGroup = Obj.Object    
        Collect.Add Cl    
    End If    
Next Obj    

End Sub    

Public Sub InitCheck()    
Dim Obj As OLEObject    
Dim CO As Classe1    
Set CO = Nothing    
Set CollectC = New Collection    
Workbooks("Coleções.xls").Activate    
'sistema de contrôle nos objetos da Folha1 (ou Plan1)    
For Each Obj In Sheets("Plan1").OLEObjects    
'verifique se se trata de uma Checkbox    
    If TypeOf Obj.Object Is MSForms.CheckBox Then    
            
        Set CO = New Classe1    
        Set CO.CheckBoxGroup = Obj.Object    
        CollectC.Add CO    
    End If    
Next Obj    

End Sub


'Rotina para chamar Inicialize ou Reinicialize as coleções.
'Necessário se o código VBA foi alterado.
Sub ActivationCollect()    
    InitOption    
    InitCheck    
End Sub

Em um módulo de classe


Para abrir um módulo de classe >> Inserir >> Módulo de classe.
Copie este código...

'--------------------------------------    
'Em um módulo de classe chamado "Classe1"    

Option Explicit    

Public WithEvents OptionButtonGroup As MSForms.OptionButton    
Public WithEvents CheckBoxGroup As MSForms.CheckBox    

'Evenement Click nos CheckBox da planilha.    
Private Sub CheckBoxGroup_Click()    
        
    'Retorna o nome e o valor da CheckBox clicada    
    MsgBox CheckBoxGroup.Name & ": " & CheckBoxGroup.Value    
        
    'Exemplo que envia para a coluna A, o valor da CheckBox    
    Cells(CheckBoxGroup.TopLeftCell.Row, 1) = CheckBoxGroup.Value    
End Sub    

'Evento Clique nas CheckBox da planilha.    
Private Sub OptionButtonGroup_Click()    
        
    'Retorna o nome e o valor do OptionButton clicado    
    MsgBox OptionButtonGroup.Name & ": " & OptionButtonGroup.GroupName    
        
    'Exemplo que envia para a coluna A, o valor do OptionButton    
    Cells(OptionButtonGroup.TopLeftCell.Row, 1) = OptionButtonGroup.Value    
End Sub

E no módulo da pasta


Private Sub Workbook_Open()    
    InitOption    
    InitCheck    
End Sub


Na abertura da pasta, as coleções estão operacionais mas, se o código VBA foi alterado, as coleções serão desativadas; então, será preciso chamar a sub ActivationCollect : seja colocando o cursor no meio da sub e pressionando a tecla F5, seja criando um atalho.


Tradução feita por Lucia Maurity y Nouira

Veja também

Artigo original publicado por . Tradução feita por pintuda. Última modificação: 28 de fevereiro de 2011 às 12:39 por pintuda.
Este documento, intitulado 'VBA e coleções de objetos', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.