Checkbox - seleção ...
 
Notifications
Clear all

Checkbox - seleção obrigatória

14 Posts
3 Usuários
0 Reactions
2,273 Visualizações
(@wfranca)
Posts: 297
Honorable Member
Topic starter
 

Pessoal,

tenho as checkbox1 e checbox 2...

que código posso utilizar para obrigar a seleção de umas das duas através de um botão de comando em meu userform?

 
Postado : 01/10/2013 2:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

De uma maneira simplificada:

Private Sub CommandButton1_Click()
If Me.CheckBox1 = False And Me.CheckBox2 = False Then
 MsgBox "selecione uma opção"
 Exit Sub
 End If
 MsgBox "ok"
 
End Sub
 
Postado : 01/10/2013 5:42 pm
(@wfranca)
Posts: 297
Honorable Member
Topic starter
 

José atribui esse código ao meu formulário... funcionou ao iniciar o userform... a partir do segundo item a ser inserido ele pula a obrigação de preencher a seleção para o meu txtmotivo como apresenta o código abaixo; e se eu não selecionar ele preenche minha planilha mesmo assim...

Private Sub btninserir_Click()

If txtCidade.Text = "" Then
MsgBox "INFORME A QUANTIDADE", vbExclamation, "Campo Obrigatório"
txtCidade.SetFocus

Exit Sub

End If

If CheckBox1 = False And CheckBox2 = False Then
MsgBox "Cliente ou Loja?", vbExclamation, "Campo Obrigatório"
Exit Sub
End If

If txtmotivo.Text = "" Then
MsgBox "INFORME O MOTIVO", vbExclamation, "Campo Obrigatório"
txtCidade.SetFocus
Exit Sub
End If

Dim UltimaLinha As Object

Set UltimaLinha = Plan1.Range("A2000").End(xlUp)

UltimaLinha.Offset(1, 0).Value = txtNomeEmpresa.Text
UltimaLinha.Offset(1, 1).Value = txtNomeContato.Text
UltimaLinha.Offset(1, 2).Value = txtCargoContato.Text
UltimaLinha.Offset(1, 3).Value = txtEndereco.Text
UltimaLinha.Offset(1, 4).Value = txtCidade.Text
UltimaLinha.Offset(1, 5).Value = txtRegiao.Text
UltimaLinha.Offset(1, 6).Value = txtCEP.Text
UltimaLinha.Offset(1, 7).Value = txtPais.Text
UltimaLinha.Offset(1, 8).Value = txtTelefone.Text
UltimaLinha.Offset(1, 9).Value = txtFax.Text
UltimaLinha.Offset(1, 10).Value = txtHomePage.Text
UltimaLinha.Offset(1, 12).Value = txtmotivo.Text
If Me.CheckBox1.Value = True Then UltimaLinha.Offset(1, 11).Value = "Cliente"
If Me.CheckBox2.Value = True Then UltimaLinha.Offset(1, 11).Value = "Loja"
MsgBox "Item inserido com sucesso..."

txtNomeEmpresa.Text = ""
txtNomeContato.Text = ""
txtCargoContato.Text = ""
txtEndereco.Text = ""
txtCidade.Text = ""
txtRegiao.Text = ""
txtCEP.Text = ""
txtPais.Text = ""
txtTelefone.Text = ""
txtFax.Text = ""
txtHomePage = ""
txtmotivo = ""
CheckBox1 = ""
CheckBox2 = ""
txtCodigoFornecedor.SetFocus

With txtCodigoFornecedor
.SetFocus
.SelStart = 0
.SelLength = Len(txtCodigoFornecedor.Text)

End With

End Sub

 
Postado : 02/10/2013 6:51 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

wfranca,

Bom Dia!

Precisa ser CheckBox? Porque você não coloca OptionButton que já são exclusivos por default? Você coloca 2 OptionButton e já define a propriedade Value = True de um deles que é o que será carregado na inicialização do formulário como selecionado. Se o usuário selecionar o segundo optionbutton, o primeiro perderá a seleção e seu código nunca ficará sem uma seleção.

 
Postado : 02/10/2013 7:26 am
(@wfranca)
Posts: 297
Honorable Member
Topic starter
 

Wagner, também havia pensado nessa hipótese, mas infelizmente não para optar por ela... no caso da checkbox é para exatamente obrigar o usuário a marcar a seleção...

 
Postado : 02/10/2013 7:42 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Estranho, porque a lógica é essa sempre usei e funcionou. :?

 
Postado : 02/10/2013 8:06 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wagner, também havia pensado nessa hipótese, mas infelizmente não para optar por ela... no caso da checkbox é para exatamente obrigar o usuário a marcar a seleção...

Franca, a ideia do Wagner é valida, é só deixar a Propriedade dois Options como "FALSE", assim eles não estarão selecionados por padrão, e depois fazer a verificação conforme a rotina que o Patropi passou alterando o tipo do controle, lembrando que o controle OptionButton não aceita ter os dois selecionados de uma vez, diferente do CheCkbox que se pode selecionar os dois.

Patropi, da forma que colocou funciona corretamente (isoladamente), mas pelo que vi na rotina do franca ele incluiu apos outras verificações que no meu entender apos da primeira execução e atendendo a primeira condição é pulado as demais condições.

Franca, procure evitar utilizar muitos IF .. com a instrução Exit Sub, isto pode causar problemas tipo o que comentou, quando queremos fazer a verificação de mais de uma condição, procure utilizar IF ... ELSEIF ...END IF, veja na ajuda do VBA sobre estas opçoes.

Como não tenho o modelo para testar, veja se da forma abaixo atende o que pretende.

Private Sub btninserir_Click()

If txtCidade.Text = "" Then
        MsgBox "INFORME A QUANTIDADE", vbExclamation, "Campo Obrigatório"
        txtCidade.SetFocus

    ElseIf CheckBox1 = False And CheckBox2 = False Then
    
        MsgBox "Cliente ou Loja?", vbExclamation, "Campo Obrigatório"
    
    
    ElseIf txtmotivo.Text = "" Then
        MsgBox "INFORME O MOTIVO", vbExclamation, "Campo Obrigatório"
        txtCidade.SetFocus

Else


    Dim UltimaLinha As Object
    
    Set UltimaLinha = Plan1.Range("A2000").End(xlUp)
    
    UltimaLinha.Offset(1, 0).Value = txtNomeEmpresa.Text
    UltimaLinha.Offset(1, 1).Value = txtNomeContato.Text
    UltimaLinha.Offset(1, 2).Value = txtCargoContato.Text
    UltimaLinha.Offset(1, 3).Value = txtEndereco.Text
    UltimaLinha.Offset(1, 4).Value = txtCidade.Text
    UltimaLinha.Offset(1, 5).Value = txtRegiao.Text
    UltimaLinha.Offset(1, 6).Value = txtCEP.Text
    UltimaLinha.Offset(1, 7).Value = txtPais.Text
    UltimaLinha.Offset(1, 8).Value = txtTelefone.Text
    UltimaLinha.Offset(1, 9).Value = txtFax.Text
    UltimaLinha.Offset(1, 10).Value = txtHomePage.Text
    UltimaLinha.Offset(1, 12).Value = txtmotivo.Text
    
    If Me.CheckBox1.Value = True Then UltimaLinha.Offset(1, 11).Value = "Cliente"
    
    If Me.CheckBox2.Value = True Then UltimaLinha.Offset(1, 11).Value = "Loja"
    MsgBox "Item inserido com sucesso..."
    
    txtNomeEmpresa.Text = ""
    txtNomeContato.Text = ""
    txtCargoContato.Text = ""
    txtEndereco.Text = ""
    txtCidade.Text = ""
    txtRegiao.Text = ""
    txtCEP.Text = ""
    txtPais.Text = ""
    txtTelefone.Text = ""
    txtFax.Text = ""
    txtHomePage = ""
    txtmotivo = ""
    CheckBox1 = ""
    CheckBox2 = ""
    txtCodigoFornecedor.SetFocus


    With txtCodigoFornecedor
        .SetFocus
        .SelStart = 0
        .SelLength = Len(txtCodigoFornecedor.Text)
    End With
    
End If

End Sub

Qualquer duvida retorne.
[]s

 
Postado : 02/10/2013 8:29 am
(@wfranca)
Posts: 297
Honorable Member
Topic starter
 

Mauro, infelizmente o processo continuo pulando a etapa para obrigar a seleção... ele só obriga quando meu userform é iniciado...

Acho que vou aderir o processo do optbuttons mesmo.

 
Postado : 02/10/2013 8:57 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mauro, infelizmente o processo continuo pulando a etapa para obrigar a seleção... ele só obriga quando meu userform é iniciado...

Acho que vou aderir o processo do optbuttons mesmo.

Franca, não entendi quando diz qe obriga só quando o form é iniciado, pois a rotina acima só é executada apos pressionar o Botão Private Sub btninserir_Click(), e da maneira que diz você tem outra rotina de verificação no evento que inicializa o formulario, dai não da certo.

Voce tem de definir quando será feito a verificação, se ao iniciar o formulário ou ao se clicar no botão.

[]s

 
Postado : 02/10/2013 9:05 am
(@wfranca)
Posts: 297
Honorable Member
Topic starter
 

então...

quando eu inicio o meu projeto... e insiro o código através do meu button... ele funciona perfeitamente.. após o 2º item a inserir ele já não obriga a seleção das checkboks

 
Postado : 02/10/2013 9:16 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se me permitem,
Creio que o motivo pelo qual funciona na "abertura" do formulário e depois deixa de faze-lo é pelo método de "limpeza" utilizado

txtmotivo = ""
CheckBox1 = ""
CheckBox2 = ""

txtCodigoFornecedor.SetFocus

Para check box deve-se utilizar "True" or "False"
Ficaria

...
txtmotivo = ""
CheckBox1 = False
CheckBox2 = False
txtCodigoFornecedor.SetFocus
 
Postado : 02/10/2013 9:25 am
(@wfranca)
Posts: 297
Honorable Member
Topic starter
 

Boooooaaa Reinaldo....

Deu certo...

Só tenho a agradecer a todos vocês do planilhando... desde que participo desse fórum meu conhecimento só tem aumentado cada dia mais

 
Postado : 02/10/2013 10:08 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se me permitem,
Creio que o motivo pelo qual funciona na "abertura" do formulário e depois deixa de faze-lo é pelo método de "limpeza" utilizado

txtmotivo = ""
CheckBox1 = ""
CheckBox2 = ""

txtCodigoFornecedor.SetFocus

Para check box deve-se utilizar "True" or "False"
Ficaria

...
txtmotivo = ""
CheckBox1 = False
CheckBox2 = False
txtCodigoFornecedor.SetFocus

Reinaldo, nem precisa pedir permissão, todas as colaborações são bem vindas.

Quando olhei a rotina me atentei somente ao inicio dos IF(s) e nem analisei o restante e como tambem não executei, nem percebi que no final tinha CheckBox1 = "", só agora depois que postou que vi.
Ainda bem que estava atento a este detalhe que me passou despercebido, grato pela ajuda.

[]s

 
Postado : 02/10/2013 11:03 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Achei aqui nos meus arquivos uma outra opção, tente ai.

Dim Checar As Boolean
Checar = False
Dim C As Object

For Each C In Controls
If TypeName(C) = "CheckBox" Then
If C.Value = True Then
Checar = True
End If
End If
Next C

'se não encontar nenhum CheckBox selecionado interrompe o proc...

If Checar = False Then
MsgBox "Selecione um setor", vbCritical, "A T E N Ç Ã O! ! !..."
Exit Sub
End If
 
Postado : 03/10/2013 6:32 pm