Notifications
Clear all

Loop para Checkbox

3 Posts
2 Usuários
0 Reactions
1,375 Visualizações
(@riwerson)
Posts: 4
New Member
Topic starter
 

Boa tarde!
Gostaria de saber se há alguma rotina que analise se uma série de "checkbox's" estão ou não marcadas.

Tenho uma planilha com 15 Checkbox's e queria copiar para outra aba apenas os "Captions das que
estiverem selecionadas, sem precisar de um bloco "If - End if" para cada uma.

É possível fazer isso?
Desde já, agradeço.

 
Postado : 15/10/2019 11:09 am
(@srobles)
Posts: 231
Estimable Member
 

riwerson,

Adicione as rotinas abaixo em um novo módulo.

Se estiver utilizando controles de Formulário, experimente :

Sub validaSelecaoFormulario()
    Dim ctlChk As Shape
    Dim contItens As Long
    Dim novaLinha As Long, novaColuna As Long
    Dim retornaSelecionados() As String
    
    contItens = 0
    Erase retornaSelecionados
    
    With ThisWorkbook.Sheets(1)
        For Each ctlChk In ThisWorkbook.Sheets(1).Shapes
            If ctlChk.Name Like "*Check Box*" And ctlChk.ControlFormat.Value = 1 Then
                contItens = contItens + 1
                ReDim Preserve retornaSelecionados(contItens)
                'ctlchk.Name = retorna nome do controle
                'ctlChk.AlternativeText = retorna o texto do controle
                retornaSelecionados(contItens) = ctlChk.AlternativeText
            End If
        Next
    End With
    
    With ThisWorkbook.Sheets(2)
        novaColuna = 0
        novaLinha = .Cells(Rows.Count, 1).End(xlUp).Row + 1
        
        While Not novaColuna = contItens
            novaColuna = novaColuna + 1
            .Cells(novaLinha, novaColuna) = retornaSelecionados(novaColuna)
        Wend
    End With
End Sub

Sub limpaSelecaoFormulario()
    Dim ctlChk As Shape
    
    With ThisWorkbook.Sheets(1)
        For Each ctlChk In ThisWorkbook.Sheets(1).Shapes
            If ctlChk.Name Like "*Check Box*" And ctlChk.ControlFormat.Value = 1 Then
                ctlChk.ControlFormat.Value = -4146
            End If
        Next
    End With  
End Sub

Caso esteja utilizando controles ActiveX, experimente :

Sub validaSelecaoActiveX()
    Dim ctlChk As OLEObject
    Dim contItens As Long
    Dim novaLinha As Long, novaColuna As Long
    Dim retornaSelecionados() As String
    
    contItens = 0
    Erase retornaSelecionados
    
    With ThisWorkbook.Sheets(1)
        For Each ctlChk In .OLEObjects
            If TypeName(ctlChk.Object) = "CheckBox" And ctlChk.Object.Value = True Then
                contItens = contItens + 1
                ReDim Preserve retornaSelecionados(contItens)
                retornaSelecionados(contItens) = ctlChk.Object.Caption
            End If
        Next
    End With
    
    With ThisWorkbook.Sheets(2)
        novaColuna = 0
        novaLinha = .Cells(Rows.Count, 1).End(xlUp).Row + 1
        
        While Not novaColuna = contItens
            novaColuna = novaColuna + 1
            .Cells(novaLinha, novaColuna) = retornaSelecionados(novaColuna)
        Wend
    End With    
End Sub

Sub limpaSelecaoActiveX()
    Dim ctlChk As OLEObject
    
    With ThisWorkbook.Sheets(1)
        For Each ctlChk In .OLEObjects
            If TypeName(ctlChk.Object) = "CheckBox" Then
                ctlChk.Object.Value = False
            End If
        Next
    End With  
End Sub

Espero ter ajudado.

Abs.

Saulo Robles

 
Postado : 15/10/2019 2:08 pm
(@riwerson)
Posts: 4
New Member
Topic starter
 

Fantástico! Ambas as respostas me ajudaram muito!!!
Muito obrigado, galera!

 
Postado : 17/10/2019 6:24 am