Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ceth

Problemas com "Err"

Recommended Posts

Olá amigos,

 

Primeiramente gostaria de informar que gostei muito do fórum, já visitava com certa frequência, mas só agora resolvi me registrar. Espero ajudar sempre que possível, e no mais aprender muito com vocês.

 

Comecei a estudar VB tem alguns dias, sou leigo mesmo no assunto, mas tenho uma força de vontade enorme para aprender, mas oque isso interessa?! ;), vamos lá:

 

Estou com um problema pra lidar com o Err, ele funciona corretamente, o problema é na hora de informar a mensagem de erro, sei que existe as mensagens padrões "Err.Number", mas nem essa está funcionando aqui, gostaria de saber também como informar uma mensagem da minha escolha, já que tentei usar um MsgBox e não obtive êxito!

 

Segue o código:

 

Public Sub cmdMutliplica_Click()Dim vValor1 As SingleDim vValor2 As Single		On Error GoTo Erro_Na_Conversao	vValor1 = CInt(txtNum.Text)		vValor1 = CSng(txtNum1.Text)	vValor2 = CSng(txtNum2.Text)		txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")	Erro_Na_Conversao:If Err.Number = 13 ThenvValor1 = 0vValor2 = 0Resume NextEnd IfEnd Sub

 

Agradeço desde já pela atenção, obrigado mesmo!

 

 

[]s,

ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for o q eu entendi ... (que voce quer simular o erro do VB mas com a sua mensagem) seria isso: (EX)

Err.Raise 32132, "","Erro o inserir os Dados"
É isso mesmo que eu quero fazer, mas não da certo deste jeito, add a linha, e não está dando erro, mas também não está fazendo o desejado, clico no botão da multiplicação e ele não está dando erro de buffer ao menos, mas a mensagem não está aparecendo![]s,ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você quer mostrar uma mensagem quando acontecer um erro específico?

if err.number = valor then msgbox "Mensagem específica"
Você disse que não conseguiu, mas fazendo desse jeito é para funcionar.

Tenta executar passo a passo (com um breakpoint) e ver se está entrando no if e talz. O erro também pode estár no número do erro com o qual você está fazendo a comparação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você quer mostrar uma mensagem quando acontecer um erro específico?

if err.number = valor then msgbox "Mensagem específica"
Você disse que não conseguiu, mas fazendo desse jeito é para funcionar. Tenta executar passo a passo (com um breakpoint) e ver se está entrando no if e talz. O erro também pode estár no número do erro com o qual você está fazendo a comparação.
msgbox err.description , vbcritical , err.number

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai complicou ...Coloque aquele codigo: Err.Raise 32132, "","Erro o inserir os Dados" na primeira linha do botao que voce estava testando, e veka se ele vai aparecer ...... Caso apareça, va depurando linha por linha pq provavelmente vai chegar numa determinada parte do codigo que ou ele vai dar um erro ou nap vai satisfazer uma condicao e vai sair do evento ...Agora caso o mensagem de erro que voce colocar na primeira linha nao aparecer ..... ai ja é mais preocupante ..... mas acho que aparece sim ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está dificil mesmo, mas vamos lá, tenho fé que consigo ;)

 

Public Sub cmdMutliplica_Click()Dim vValor1 As SingleDim vValor2 As SinglevValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")End Sub

Esse é o código que tenho funcionando, depois que fiz minhas adaptações não tive sucesso.

 

O que eu gostaria de fazer é colocar uma linha de checagem, que faria a filtragem, e mandaria uma mensagem ao usuário, se fosse texto, algo como: Dado inválido!

 

Oque tenho em mãos é isso:

 

Public Sub cmdMutliplica_Click()Dim vValor1 As SingleDim vValor2 As Single	On Error GoTo Erro_Na_Conversao	  'essa linha aqui não da, deixando-a aqui, a função já nem mesmo funciona	vValor1 = CInt(txtNum.Text)		vValor1 = CSng(txtNum1.Text)	vValor2 = CSng(txtNum2.Text)		txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")	Erro_Na_Conversao:If Err.Number = 13 ThenvValor1 = 0vValor2 = 0' sei que vou usar um Message box aquiResume NextEnd IfEnd Sub

Lembrando que já segui as dicas dadas aqui, mas mesmo assim não consegui obter êxito.

 

Espero que alguém possa me ajudar, e mais uma vez obrigado.

 

 

[]s,

ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que poderia fazer é o seguinte:Antes de jogar o valor na variavel, verifique as texts If Not IsNumeric(txtNum) Then MsgBox "Digite um numero valido" txtNum.SetFocus Exit Sub End If If Not IsNumeric(txtNum1) Then MsgBox "Digite um numero valido" txtNum1.SetFocus Exit Sub End If If Not IsNumeric(txtNum2) Then MsgBox "Digite um numero valido" txtNum2.SetFocus Exit Sub End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase lá :mellow:

 

Public Sub cmdMutliplica_Click()Dim vValor1 As SingleDim vValor2 As Single		If Not IsNumeric(txtNum1) Then	MsgBox "Digite um número valido"	txtNum1.SetFocus	txtNum1 = Empty	End If		If Not IsNumeric(txtNum2) Then	MsgBox "Digite um número valido"	txtNum2.SetFocus	txtNum2 = Empty	End If	Exit Sub ' ESSE "EXIT SUB" SERIA PRA TERMINAR A SUB-ROTINA?!!vValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")End Sub

Então, ta complicado mesmo, coloquei da forma como postei acima, ele faz a filtragem direitinho, mas porém, a função cmdMultiplica não funciona, eu não sei qual seria a ordem que tenho que colocar, já tentei colocar os If Not pra cima, mas nada da certo.

 

O que me dizem?! .. não quero parecer abusado, mas não sei mesmo oque fazer, e queria aproveitar pra agradecer pela força que todos me deram até agora.

 

 

[]s,

ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

É. ... voce inverteu a ordem dos Exit Subs ... eles tem que ficar dentro dos IFs porque, se o cara colocou mesmo uma letra, o sistema nao pode continuar a calcular o resto, porque ai sim daria erro.

 

Public Sub cmdMutliplica_Click()Dim vValor1 As SingleDim vValor2 As Single		If Not IsNumeric(txtNum1) Then		   MsgBox "Digite um número valido"		   txtNum1.SetFocus		   txtNum1 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	  	End If 		If Not IsNumeric(txtNum2) Then		   MsgBox "Digite um número valido"		   txtNum2.SetFocus		   txtNum2 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End IfvValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Enfim http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Valeu pela força amigos, em especial para o nosso amigo Dennys Lopes, valeu mesmo cara!! ;)

 

Vou postar o code, assim fica de referência para o pessoal que está iniciando, assim como eu ;)

 

Segue abaixo:

 

Public Sub cmdMutliplica_Click()Dim vValor1 As SingleDim vValor2 As Single		If Not IsNumeric(txtNum1) Then		   MsgBox "Digite um número valido"		   txtNum1.SetFocus		   txtNum1 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End If		If Not IsNumeric(txtNum2) Then		   MsgBox "Digite um número valido"		   txtNum2.SetFocus		   txtNum2 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End IfvValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")End SubPrivate Sub cmdDivide_Click()Dim vValor1 As SingleDim vValor2 As Single	If Not IsNumeric(txtNum1) Then		   MsgBox "Digite um número valido"		   txtNum1.SetFocus		   txtNum1 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End If		If Not IsNumeric(txtNum2) Then		   MsgBox "Digite um número valido"		   txtNum2.SetFocus		   txtNum2 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End IfvValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 / vValor2, "###,##0.00")End SubPrivate Sub cmdSoma_Click()Dim vValor1 As SingleDim vValor2 As Single	If Not IsNumeric(txtNum1) Then		   MsgBox "Digite um número valido"		   txtNum1.SetFocus		   txtNum1 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End If		If Not IsNumeric(txtNum2) Then		   MsgBox "Digite um número valido"		   txtNum2.SetFocus		   txtNum2 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End If	vValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 + vValor2, "###,##0.00")End SubPrivate Sub cmdSubtrai_Click()Dim vValor1 As SingleDim vValor2 As Single	If Not IsNumeric(txtNum1) Then		   MsgBox "Digite um número valido"		   txtNum1.SetFocus		   txtNum1 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End If		If Not IsNumeric(txtNum2) Then		   MsgBox "Digite um número valido"		   txtNum2.SetFocus		   txtNum2 = Empty		   Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letra	End If	vValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)txtResultado.Text = Format(vValor1 - vValor2, "###,##0.00")End SubPrivate Sub Form_Terminate()Dim vOk As IntegervOk = MsgBox("Tem certeza que deseja encerrar o programa?", vbYesNo + vbQuestion, "Saída")If vOk = vbYes ThenEndEnd IfEnd SubPrivate Sub txtResultado_Change()'marcar propriedade locked como true, desabilita a opção de editar a textboxEnd SubPrivate Sub cmdLimpar_Click()txtResultado.Text = EmptytxtNum1.Text = EmptytxtNum2.Text = EmptytxtNum1.SetFocusEnd Sub

Como sou bem novo na área acredito que meu código tenha que ser muito melhorado ainda, então fica ai, se alguém quiser dar alguma opinião, quem sabe alguma melhoria, ou quem sabe algum jeito de diminuir o código, acredito que sejá possível.

 

Obrigado mais uma vez amigos.

 

 

[]s,

ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu ceth .... qualquer coisa é só perguntar ...Quanto a melhorar seu código, realmente, da pra reduzir 50% dele .... se quiser algumas dicas depois é só postarFalow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu ceth .... qualquer coisa é só perguntar ...

Vou lembrar de perguntar sim :D

Quanto a melhorar seu código, realmente, da pra reduzir 50% dele .... se quiser algumas dicas depois é só postar

Quero sim, como disse estou começando agora com programação em VB, e é bom ter uma base boa, ja ir notando ao menos aonde posso melhorar meus programas, se quiser pode postar aqui mesmo pra todos aproveitarem, ou qualquer coisa me envia em PM, agradecido já![]s,ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, já estou aqui denovo enchendo, achei um bug :oSeguinte, eu fiz a caixa de diálogo pra quando o usuário ir fechar a janela do programa, ele pedir se o mesmo realmente deseja fecha o programa ou não, até ai tudo bem, se eu responder que sim, tudo certo também, mas se eu disser que não, ele sai do programa mesmo assim :P

Private Sub Form_Terminate()Dim vOk As IntegervOk = MsgBox("Tem certeza que deseja encerrar o programa?", vbYesNo + vbQuestion, "Saída")If vOk = vbYes ThenEndEnd IfEnd Sub

Pensei em colocar um outro If ai, mas não sei como faria pra ele voltar ao programa, alguém sabe se é possível?! e como?![]s,ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, ao inves de utilizar quatro botoes ... utilizei apenas um cmdOperacoes(0), cmdOperacoes(1), cmdOperacoes(2), cmdOperacoes(3) .... utilizando o index

 

Ai ... o codigo do botao ficaria assim:

 

Public Sub cmdOperacoes_Click(Index As Integer)Dim vValor1 As SingleDim vValor2 As Single	If Not IsNumeric(txtNum1) Then	MsgBox "Digite um número valido"	txtNum1.SetFocus	txtNum1 = Empty	Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letraEnd IfIf Not IsNumeric(txtNum2) Then	MsgBox "Digite um número valido"	txtNum2.SetFocus	txtNum2 = Empty	Exit Sub 'Esse Exit sub é para terminar a rotina porque iria dar erro se fosse digitado uma letraEnd IfvValor1 = CSng(txtNum1.Text)vValor2 = CSng(txtNum2.Text)Select Case Index	Case 1: txtResultado.Text = Format(vValor1 + vValor2, "###,##0.00")	Case 2: txtResultado.Text = Format(vValor1 - vValor2, "###,##0.00")	Case 3: txtResultado.Text = Format(vValor1 * vValor2, "###,##0.00")	Case 4: txtResultado.Text = Format(vValor1 / vValor2, "###,##0.00")End SelectEnd SubPrivate Sub Form_Terminate()If MsgBox("Tem certeza que deseja encerrar o programa?", vbYesNo + vbQuestion, "Saída") = vbYes Then EndEnd SubPrivate Sub cmdLimpar_Click()txtResultado.Text = EmptytxtNum1.Text = EmptytxtNum2.Text = EmptytxtNum1.SetFocusEnd Sub

Espero ter ajudado ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oao :D, muito bom mesmo, uma ótima mudança, vou adaptar aqui ;)ps: se puder me ajudar com a última dúvida, com relação ao botão sair, agradeço, mas de qualquer forma valeu pela força.[]s,ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Dennys, eu quero fazer uma checagem, pra quando o usuário clicar no botão fechar, ele pedir:

 

Private Sub Form_Terminate()	If MsgBox("Tem certeza que deseja encerrar o programa?", vbYesNo + vbQuestion, "Saída") = vbYes Then EndEnd Sub

Ele pergunta certinho, se eu disser Sim, ele sai do programa, mas se eu disse Não, ele não volta para o programa, como deveria, entendeu?!

 

ps: testei seu código reduzido aqui e não deu certo, ele não da erro pra compilar nem nada, mas meu código se tornou totalmente inútil, somente o botão limpar está funcionando, ele não está fazendo as checagens, nem mesmo as operações.

 

 

[]s,

ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para o botao sair, coloque o codigo no evendo Unload, nao no Terminate:Private Sub Form_Unload(Cancel As Integer)If MsgBox("Tem certeza que deseja encerrar o programa?", vbYesNo + vbQuestion, "Saída") = vbYes Then EndElse Cancel = 1End IfEnd SubQuanto ao resto do código, voce criou os botaos de forma indexada:Apague os botoes, crie um botao chamado cmdOperacoes, copie o botao e cole no formulário. O vb vai perguntar: "You already have a control named 'cmdOperacores'. Do you want to create a control array?"Ai voce clica em Sim ....A partir dai, toda vez que voce copiar e colar o botao cmdOperacores, ele vai criando os indices cmdOperacores(0), cmdOperacores(1), cmdOperacores(2) ... dai sao quatro botoes com apenas um bloco de codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, enfim tudo certo :DValeu mesmo pela força amigo, e estamos ai, quando precisar só dar um grito ;)[]s.ceth

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.