Notifications
Clear all

Fechar userform

15 Posts
3 Usuários
0 Reactions
4,602 Visualizações
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Prezados, boa tarde!

Possuo uma userform de cadastro contendo vários textbox e combobox. No comando exit de cada textbox e combobox inseri o seguinte código:

If ComboBoxCategorias.Value = "" Then
MsgBox ("O preenchimento do campo Centro de Custo é obrigatório."), vbCritical, "Atenção!"
Cancel = True

End if

end sub

Ou seja, nenhum campo ficará vazio.

O que acontece é que, ao clicar no comando de botao "fechar", a userform só fechará se todos campos estiverem <> de vazio. O que devo fazer para que esse botão fechar a userform mesmo se existir campos vazios?

 
Postado : 27/07/2013 11:16 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boatarde!!

Já tentou o comando

Unload Me

?

Att

 
Postado : 27/07/2013 12:42 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Alexandre,

Sim! Mas como havia mencionado acima, ao clicar no botão de comando nomeado como Fechar e algum combobox ou listbox estiver vazio, aparecerá a msgbox alertando o usuário acerca disso, ou seja, o unload só funcionará se todos combobox e listbox forem <> "".

 
Postado : 27/07/2013 1:09 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

... eu preciso de um comando que, mesmo se algum textbox ou combobox estiver vazio, eu consiga fechar a userform ao clicar no botao de comando **fechar**.

 
Postado : 27/07/2013 1:11 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Ainda não compreendi....
Poste seu arquivo modelo compactado!!

Att

 
Postado : 27/07/2013 1:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Com o exemplo fica muito mais fácil obter um retorno. Enquanto isso qual o código contido no botão "Fechar"?

 
Postado : 28/07/2013 6:42 am
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Reinaldo, Alexandre e interessados, boa tarde!

Criei um exemplo, creio que os auxiliarão!

 
Postado : 28/07/2013 11:24 am
(@adolfolima)
Posts: 27
Eminent Member
 

Oi Lorenzon.

Vc colocou o alerta no 'exit' do textbox e este estando selecionado, antes de rodar a rotina do botão 'Cancelar' ele terá que sair da caixa... aí surge a mensagem.
Penso que seu alerta pra não deixar caixas vazias não deveria está nos 'exits' e sim na rotina do botão 'Enviar' (tem um botão 'enviar'?).

por exemplo:

Private Sub BtEnviar_Click()
On Error Resume Next

    ' Verifica se campo 1 está vazio
If TextBox2.Value = "" Then GoTo Erro
    ' Verifica se campo 2 está vazio
If TextBox3.Value = "" Then GoTo Erro


' Daqui pra baixo sua rotina do botão enviar
'...
'...
'...
'...

Exit Sub
Erro:
        MsgBox "O preenchimento de todos os campos são obrigatórios.", vbCritical, "Atenção!"

End Sub

Gnd abç.

 
Postado : 28/07/2013 12:50 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Adolfo, boa tarde!

Eu já usei esse código em ''inserir'', mas preferi colocar no exit de cada textbox e combobox, pois o fato de deixar um campo vazio, influencia diretamente nos comandos dos outros textbox's (se eh que consegui explicar).

A minha vontade eh que, ao clicar no botao cancelar, este desconsidere tudo e fecha a userform.

 
Postado : 28/07/2013 1:04 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Adolfo, sua observação até um certo ponto é valida, ou seja sugere a verificação dos campos somente quando acionar o Botão para enviar.

Digo até um certo ponto, pois na questão do colega Lorenzon, o mesmo está utilizando o Evento EXIT para que seja identificado se o campo está vazio antes de se pular para o outro campo, retornando ao campo em questão e impedindo a progressão, e para obtermos este tipo de ação temos de utilizar o Evento EXIT.

Agora se não me engano eu já tratei deste assunto aqui no Forum, e comentei que deve-se tomar muito cuidado com estes Eventos, EXIT, BeforerUpdate e outros, onde temos como parâmetros ou argumentos da função a Propriedade "CANCEL" (Aquele que vem entre Parentes (ByVal Cancel As MSForms.ReturnBoolean).
Ela sempre acaba dando uma bagunçada e devemos fazer algumas manobras, ou seja, por padrão ela é sempre False e para obtermos a ação de retornarmos ao campo se não foi atendida o que se propôs, temos de reverte-la alterando o seu valor para TRUE, o que é feito da forma que se encontra nas rotinas no exemplo anexado - Cancel = True.

Desta forma, uma solução possível, e lógicamente, terá de ser testada com todas as opções possíveis paraver se não irá afetar em outros campos ou rotinas fora do formulário por ser uma propriedade Global, seria criarmos uma outra Variável, por exemplo :

Adicione em um Módulo qualquer a seguinte instrução :
'Não pode estar no modulo do Formulário, tem de ser um Modulo separado.
Public sCancelar As Boolean

Depois troque as rotinas do formulário pelas abaixo :

Private Sub textbox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    
    If sCancelar = True Then
        sCancelar = False
        Exit Sub
    
        If TextBox2.Value = "" Then
            MsgBox ("O preenchimento do campo Centro de Custo é obrigatório."), vbCritical, "Atenção!"
            Cancel = True
            
            End If
     End If
 
End Sub

Private Sub textbox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If sCancelar = True Then
        sCancelar = False
        Exit Sub
    
        If TextBox3.Value = "" Then
                MsgBox ("O preenchimento do campo Mês é obrigatório."), vbCritical, "Atenção!"
                Cancel = True
                End If
     End If
        
End Sub

Private Sub CommandButton1_Click()
    
    Response = MsgBox("Deseja realmente cancelar ?", vbYesNo, "Atenção!")

    sCancelar = True

    Select Case Response
    
        Case 6
        Unload Me
        
        Case 7
    
    
    End Select

End Sub

Como disse acima, tem de ser feito varios testes e ir analizando cada ponto.

Eu particularmente, acho um pouco complicado lidar com este tipo de evento, já tive projetos que acabei alterando por não ter conseguido um resultado positivo.

[]s

 
Postado : 28/07/2013 1:16 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Pessoal, boa tarde!

Agradeço a contribuição de todos, em especial a do Mauro que, do modo maestral, resolveu meu problema!

Mauro,

Funcionou corretamente! obrigado!!!!

 
Postado : 28/07/2013 1:34 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

o código funcionou no sentido de fechar a userform ao clicar no botao fechar, mesmo se houver textbox ou combobox vazio, o problema que os alertas não aparecem mais quando realizo novo cadastro.

 
Postado : 28/07/2013 1:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mauro,

o código funcionou no sentido de fechar a userform ao clicar no botao fechar, mesmo se houver textbox ou combobox vazio, o problema que os alertas não aparecem mais quando realizo novo cadastro.

Lorenzon, neste seu anexo não tem opção de Novo Cadastro, mas é como eu explanei anteriormente quando utilizamos estes tipos de Eventos onde alteramos Variáveis de Padrão Global que acabam influenciando em todo o aplicativo.
Desta forma, você terá de ir analisando ponto a ponto para detectar onde e como devemos reverter novamente esta Variável.

Como eu tambem citei, já teve projeto que fiz modificações radicais para poder atingir o pretendido, alem destaque citei, outra foi ter de inserir Frames nos Formulários e transferir os Textbox e combos para o mesmo, é bem trabalhoso.

[]s

 
Postado : 28/07/2013 2:21 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Realmente, realizei algumas adequações. Mas, esta td certo!

 
Postado : 28/07/2013 3:23 pm
(@adolfolima)
Posts: 27
Eminent Member
 

Adolfo, boa tarde!
... pois o fato de deixar um campo vazio, influencia diretamente nos comandos dos outros textbox's (se eh que consegui explicar).
...

Entendi. Legal.

Além da dica do Mauro, que acredito dar certo, existe ainda a possibilidade de deixar a propriedade 'enable=false' dos combos ou textbox que não podem serem preenchidos sem que uma caixa fundamental já esteja com um valor válido.

gnd abç.

 
Postado : 28/07/2013 8:51 pm