Cálculos entre text...
 
Notifications
Clear all

Cálculos entre textbox.

15 Posts
4 Usuários
0 Reactions
2,358 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde!

Estou utilizando o código abaixo para realizar cálculos com valores digitados em 05 textbox, a fórmula correta seria: g = ((a + b) * c * d * e) / (a * b), mas ao utilizar os parêntesis gera um erro 13 tipos incompatíveis, alguém pode me ajudar?

Private Sub TextBox5_Change()
    Dim a, b, c, d, e, f As Double
    
    a = Me.TextBox1.Value
    b = Me.TextBox2.Value
    c = Me.TextBox3.Value
    d = Me.TextBox4.Value
    e = Me.TextBox5.Value
    g = Me.TextBox6.Value
    
    If Me.TextBox5.Value <> Empty Then
        g = ((a + b) * c * d * e) /( a * b)
        Me.TextBox6 = Format(g, "0.00")
        
    Else
        Me.TextBox6 = Format(0, "0.00")
    End If
End Sub

Doni

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/11/2015 3:45 pm
(@suggos)
Posts: 111
Estimable Member
 

Boa tarde.

utilize a função CInt para atribuir valor às variáveis. O conteúdo do TextBox, por padrão, é identificado como string. Veja o exemplo abaixo.

a = CInt(Me.TextBox1.Value)

Não se esqueça de marcar o tópico como resolvido se a resposta for satisfatória.

 
Postado : 20/11/2015 4:00 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde!
Fiz as alterações sugeridas mas continua com erro na variavel g.

Doni

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/11/2015 4:20 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Doni, o erro reportado normalmente ocorre quando tenta efetuar operações com valores diferentes entre si.
na sua declaração de variaveis, sómente a varivel "f" assume integer, as demais assume Variant e o vbe irá atribuir o que mais for próximo ao valor passado.
Como as Textbox (por default) passam valores como string(Texto) suas variáveis assumem "valor" texto.
A função Cint proposta minimiza esse problema, porem com o inconveniente de somente reconhecer numero inteiro.
Experimente redefinir suas variaveis conforme abaixo, caso persista o problema poste um modelo para que o auxiliemos mais diretamente:

Dim a As Double, b As Double, c As Double
Dim d As Double, e As Double, f As Double

Obs.: Está em duas linhas por preferencia pessoal, pode ser em uma unica linha

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/11/2015 4:30 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Reinaldo, Boa tarde!

Segue o modelo para avaliação, visto o problema persiste.

Doni

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/11/2015 4:43 pm
(@edivan)
Posts: 119
Estimable Member
 

Opa, seu erro acontece pois quando você executa essa linha de código:

g = CDbl(Me.TextBox6.Value)

Seu objeto Textbox6 ainda nao foi preenchido então o valor dele é "" (vazio) isso gera o erro....

Faça assim crie uma rotina separada para fazer o cálculo, veja abaixo:

Sub Calculo()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim e As Double
Dim g As Double

If Me.TextBox1.Text = "" Then
a = 0
Else
a = CDbl(Me.TextBox1.Value)
End If

If Me.TextBox2.Text = "" Then
b = 0
Else
b = CDbl(Me.TextBox2.Value)
End If

If Me.TextBox3.Text = "" Then
c = 0
Else
c = CDbl(Me.TextBox3.Value)
End If

If Me.TextBox4.Text = "" Then
d = 0
Else
d = CDbl(Me.TextBox4.Value)
End If

If Me.TextBox5.Text = "" Then
e = 0
Else
e = CDbl(Me.TextBox5.Value)
End If

If Me.TextBox6.Text = "" Then
g = 0
Else
g = CDbl(Me.TextBox6.Value)
End If

If Me.TextBox5.Value <> Empty Then
g = ((a + b) * c * d * e) / (a * b)
Me.TextBox6 = Format(g, "0.00")

Else
Me.TextBox6 = Format(0, "0.00")
End If

End Sub

Depois no seu TextBox onde você quer executar o calculo você apenas chama essa rotina...

Aí se você precisar usa-la em mais TextBox basta chamar ela onde quiser...

Visite meu blog:

programacaopassoapasso.wordpress.com

Se não entender veja o anexo....

 
Postado : 20/11/2015 5:08 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Edivan, Boa noite!

Sim dessa forma que vc falou funciona, mas tem mais cálculos a serem feitos então o código ficaria enorme e o que eu gostaria é minimizar o tamanho dele.

ps. o erro 13 dados incompatíveis continua.

Doni

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/11/2015 6:22 pm
(@edivan)
Posts: 119
Estimable Member
 

no momento em que der o erro você escolhe a opção depurar a linha com o erro vai ficar amarela, deixe o mouse um instante em cima do .Value do seu Texbox veja se o avlor dele é "" se for o erro é por conta disso pois nao dá para atribuir um valor de texto "" em uma variavel double....

 
Postado : 20/11/2015 7:07 pm
(@edivan)
Posts: 119
Estimable Member
 

Na hora e declarar suas variáveis você pode escrever todas em uma unica linha já que são todas do mesmo tipo exemplo:

Dim a,b,c,d,e,g As Integer

 
Postado : 20/11/2015 7:09 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Como o Reinaldo já havia comentado acima, a forma de declaração de variável sugerida está incorreta. Da forma que foi sugerido, só a variável G será considerada como integre. As demais serão consideradas como Variant e diversos tipos de erro poderão ocorrer.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 20/11/2015 8:54 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Volto a comentar Dim a,b,c,d,e,g As Integer, somente a variável g assume integer, as demais assumem o padrão Variant.
Doni, se forem apenas as seis text's fica simples porem se forem mais, talvez seja preciso montar uma function

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/11/2015 8:56 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bom dia!

Fiz as alterações nas variáveis como o Reinaldo sugeriu, mas quando digito o valor na textbox5 gera o erro:

Private Sub TextBox5_Change()
    Dim a As Double
    Dim b As Double
    Dim c As Double
    Dim d As Double
    Dim e As Double
    Dim g As Double
    Dim h As Double
    Dim i As Double
    Dim j As Double
    
    
    a = CDbl(Me.TextBox1.Value)
    b = CDbl(Me.TextBox2.Value)
    c = CDbl(Me.TextBox3.Value)
    d = CDbl(Me.TextBox4.Value)
    e = CDbl(Me.TextBox5.Value)
    g=CDbl(Me.TextBox6.Value) ' linha onde está gerando o erro quando digito na textbox5
    
    If Me.TextBox5.Value <> Empty Then
        g = ((a + b) * c * d * e) / (a * b)
        Me.TextBox6 = Format(g, "0.00")
        
    Else
        Me.TextBox6 = Format(0, "0.00")
    End If
End Sub

Doni

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 21/11/2015 6:14 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

O erro é gerado pois ao alterar a textbox5 e disparado o evento e a textbox6 ainda não tem valor algum. Voce pode:
Efetuar os If's conforme o colega Edivan propos
ou
Comenta/Excluir a linha onde o erro está aparecendo, já que o Textbox6 não participa das operações, apenas recebe o valor calculado
ou ainda
Definir para todas as textbox valor padrão Zero --> Selecione as Text que deseja va em propriedades desça ate propriedade Value e digite 0

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 21/11/2015 6:57 am
(@edivan)
Posts: 119
Estimable Member
 

Como o Reinaldo já havia comentado acima, a forma de declaração de variável sugerida está incorreta. Da forma que foi sugerido, só a variável G será considerada como integre. As demais serão consideradas como Variant e diversos tipos de erro poderão ocorrer.

Wagner Morel, você está certo. Eu realmente não sabia, é que eu faço programas também em C# e no C# funciona assim, e eu sempre fiz assim no Excel também rsrsrs...

Mas fiz uns testes aqui e realmente só a ultima variável que pega o tipo certo...

Obrigado pela observação...

 
Postado : 21/11/2015 7:55 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Senhores, bom dia!

Reformulei o projeto, que ficou horrível mas agora está funcionando.

Option Explicit
Private Sub CommandButton1_Click()
'Dim T As Control
'TextBox1.SetFocus
'For Each T In UserForm1.Controls
 '   If TypeName(T) = "TextBox" Then
  '     T.Value = ""
   ' End If
'Next T




Me.TextBox6.Value = ""
Me.TextBox8.Value = ""
Me.TextBox9.Value = ""
Me.TextBox1.Value = ""
Me.TextBox2.Value = ""
Me.TextBox3.Value = ""
Me.TextBox4.Value = ""
Me.TextBox5.Value = ""
Me.TextBox7.Value = ""

Me.TextBox1.SetFocus




End Sub
Private Sub TextBox1_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double
If IsNumeric(Me.TextBox1.Text) Then num1 = CDbl(Me.TextBox1.Text) Else num1 = 0
End Sub
Private Sub TextBox2_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double
If IsNumeric(Me.TextBox2.Text) Then num2 = CDbl(Me.TextBox2.Text) Else num2 = 0
End Sub
Private Sub TextBox3_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double
If IsNumeric(Me.TextBox3.Text) Then num3 = CDbl(Me.TextBox3.Text) Else num3 = 0
End Sub
Private Sub TextBox4_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double
If IsNumeric(Me.TextBox4.Text) Then num4 = CDbl(Me.TextBox4.Text) Else num4 = 0
End Sub
Private Sub TextBox5_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double, num7 As Double, num8 As Double, num9 As Double
On Error Resume Next
If Me.TextBox6 < 0 Then Exit Sub
If IsNumeric(Me.TextBox1.Text) Then num1 = CDbl(Me.TextBox1.Text) Else num1 = 0
If IsNumeric(Me.TextBox2.Text) Then num2 = CDbl(Me.TextBox2.Text) Else num2 = 0
If IsNumeric(Me.TextBox3.Text) Then num3 = CDbl(Me.TextBox3.Text) Else num3 = 0
If IsNumeric(Me.TextBox4.Text) Then num4 = CDbl(Me.TextBox4.Text) Else num4 = 0
If IsNumeric(Me.TextBox5.Text) Then num5 = CDbl(Me.TextBox5.Text) Else num5 = 0
If IsNumeric(Me.TextBox6.Text) Then num6 = CDbl(Me.TextBox6.Text) Else num6 = 0
Me.TextBox6 = Format(((num1 + num2) * num3 * (num4 / 10) * num5) / (num1 * num2), "##,###0.000")
End Sub
Private Sub TextBox6_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double, num7 As Double, num8 As Double
If IsNumeric(Me.TextBox6.Text) Then num6 = CDbl(Me.TextBox6.Text) Else num6 = 0
Me.TextBox8 = Format(num6 * num7, "##,###0.000")
End Sub
Private Sub TextBox7_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double, num7 As Double, num8 As Double, num9 As Double
If IsNumeric(Me.TextBox6.Text) Then num6 = CDbl(Me.TextBox6.Text) Else num6 = 0
If IsNumeric(Me.TextBox7.Text) Then num7 = CDbl(Me.TextBox7.Text) Else num7 = 0
Me.TextBox8 = Format(num6 * num7, "##,###0.000")
End Sub
Private Sub TextBox8_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double, num7 As Double, num8 As Double, num9 As Double
If IsNumeric(Me.TextBox8.Text) Then num8 = CDbl(Me.TextBox8.Text) Else num8 = 0
Me.TextBox9 = Format(num8 / 20, "##,#0.00")
End Sub
Private Sub TextBox9_Change()
Dim num1 As Double, num2 As Double, num3 As Double, num4 As Double, num5 As Double, num6 As Double, num7 As Double, num8 As Double, num9 As Double
If IsNumeric(Me.TextBox6.Text) Then num6 = CDbl(Me.TextBox6.Text) Else num6 = 0
If IsNumeric(Me.TextBox7.Text) Then num7 = CDbl(Me.TextBox7.Text) Else num7 = 0
If IsNumeric(Me.TextBox8.Text) Then num8 = CDbl(Me.TextBox8.Text) Else num8 = 0
If IsNumeric(Me.TextBox9.Text) Then num9 = CDbl(Me.TextBox9.Text) Else num9 = 0

Me.TextBox9 = Format(num8 / 20, "##,#0.00")
End Sub

Obrigado a todos!

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/11/2015 8:26 am