Jump to content

Calculadora em VBA


Duarte7777

Recommended Posts

eu em API, estou a fazer uma calculadora. Só que ela não faz as contas de menos direito. Ex: 9-8=9 e tem que dar 1.

o código é este (se alguém me conseguir ajudar agradecia):

Private Function EvaluateFactor(factor As String) As Variant
    ' Avalia um fator para multiplicação e divisão
    Dim values() As String
    values = Split(factor, "/")

    Dim result As Variant
    result = Val(values(0))

    Dim i As Integer
    For i = 1 To UBound(values)
        If Val(values(i)) <> 0 Then
            result = result / Val(values(i))
        Else
            ' Trata a divisão por zero
            EvaluateFactor = CVErr(xlErrDiv0)
            Exit Function
        End If
    Next i

    EvaluateFactor = result
End Function
Private Function EvaluateTerm(term As String) As Variant
    ' Avalia um termo para adição e subtração
    Dim factors() As String
    factors = Split(term, "*")

    Dim result As Variant
    result = EvaluateFactor(factors(0))

    Dim i As Integer
    For i = 1 To UBound(factors)
        Dim currentFactor As String
        currentFactor = factors(i)

        ' Verifica se o fator contém operadores de adição ou subtração
        If InStr(currentFactor, "+") > 0 Then
            result = result + CalculateExpression(Mid(currentFactor, InStr(currentFactor, "+") + 1))
        ElseIf InStr(currentFactor, "-") > 0 Then
            result = result - CalculateExpression(Mid(currentFactor, InStr(currentFactor, "-") + 1))
        Else
            ' Caso contrário, multiplique normalmente
            result = result * EvaluateFactor(currentFactor)
        End If
    Next i

    EvaluateTerm = result
End Function

Private Function EvaluateMultiplicationDivision(expression As String) As Variant
    ' Avalia a expressão para multiplicação e divisão
    Dim terms() As String
    terms = Split(expression, "+")

    Dim result As Variant
    result = EvaluateTerm(terms(0))

    Dim i As Integer
    For i = 1 To UBound(terms)
        result = result + EvaluateTerm(terms(i))
    Next i

    EvaluateMultiplicationDivision = result
End Function
Private Function EvaluateFullExpression(expression As String) As Variant
    ' Avalia a expressão levando em consideração a ordem de precedência dos operadores
    Dim result As Variant
    result = EvaluateMultiplicationDivision(expression)

    If Not IsError(result) Then
        EvaluateFullExpression = result
    Else
        EvaluateFullExpression = CVErr(xlErrValue)
    End If
End Function
Private Function CalculateExpression(expression As String) As Variant
    On Error Resume Next

    ' Substitui vírgulas por pontos para garantir a interpretação correta dos números
    expression = Replace(expression, ",", ".")

    ' Remove espaços em branco
    expression = Replace(expression, " ", "")

    ' Avalia a expressão
    CalculateExpression = EvaluateFullExpression(expression)

    If Err.Number <> 0 Then
        ' Se ocorrer um erro, retorna o erro
        CalculateExpression = CVErr(xlErrValue)
    End If

    On Error GoTo 0
End Function
Private Sub EvaluateAndAddToHistory()
    ' Avalia a expressão na caixa de texto e a adiciona ao histórico
    Dim expression As String
    expression = TextBox1.Value

    ' Avalia a expressão
    Dim result As Variant
    result = CalculateExpression(expression)

    If Not IsError(result) Then
        ' Adiciona a expressão e o resultado ao histórico
        AddToHistory expression & " = " & result
        ' Exibe o resultado na caixa de texto
        TextBox1.Value = result
        Image1.Picture = LoadPicture("C:\Users\craft\OneDrive\Desktop\CALCULADORA\emojo.jpg")
        If result = 69 Then
    Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\amoung-usa-sus.wav"
    ReproduzirSom caminhoSom
    Image1.Picture = LoadPicture("C:\Users\craft\OneDrive\Desktop\CALCULADORA\sus.jpg")
    End If
    Else
        ' Trata erros de avaliação
        MsgBox "Expressão inválida!", vbExclamation
        ' Limpa a caixa de texto após a avaliação
        TextBox1.Value = ""
    End If
    
    
End Sub


Private Sub AddToHistory(calculation As String)
    ' Adiciona o cálculo ao histórico
    ListBoxHistory.AddItem calculation
    ListBoxHistory.ListIndex = ListBoxHistory.ListCount - 1
End Sub


Private Sub menos_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = "-"
Else
   TextBox1.Text = TextBox1.Text & "-"
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub multiplicar_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = "*"
Else
   TextBox1.Text = TextBox1.Text & "*"
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub Off_Click()
Unload UserForm1
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-leave-noise.wav"
End Sub

Private Sub UserForm_Initialize()
    ListBoxHistory.Clear
    Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\ronnie_lightweight-baby.wav"
    ReproduzirSom caminhoSom
End Sub
Private Sub negativo_Click()
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    If TextBox1.Text = "" Then
   TextBox1.Text = "-"
Else
   TextBox1.Text = "-" & TextBox1.Text
End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Dim inputChar As String
    inputChar = Chr(KeyAscii)
    If KeyCode = 13 Then ' 13 é o código ASCII para Enter
        ' Executa o cálculo e adiciona ao histórico
        EvaluateAndAddToHistory
        KeyCode = 0 ' Impede que o Enter seja processado normalmente
    End If
If Not (inputChar Like "[0,1,2,3,4,5,6,7,8,9]" Or inputChar Like "[.,,,+,-,*,/]") Then
        KeyAscii = 0 ' Ignora a tecla pressionada se não for um número, vírgula ou operador
    End If

    If IsNumeric(inputChar) Then
        ' Se o caractere é numérico, restringe a entrada para uma vírgula por número
        If inputChar = "." Then
            If InStr(1, TextBox1.Value, ".", vbTextCompare) > 0 Then
                KeyAscii = 0
            End If
        End If
    ElseIf inputChar Like "[+,-,*,/]" Then
        ' Restringe a entrada para um operador seguido
        If Len(TextBox1.Value) > 0 Then
            If Not IsNumeric(Right(TextBox1.Value, 1)) Then
                KeyAscii = 0
                AddToHistory TextBox1.Value
            End If
        End If
    End If
End Sub


 Private Sub ReproduzirSom(ByVal caminhoSom As String)
    Dim objShell As Object
    Set objShell = CreateObject("WScript.Shell")

    ' Executar um script do PowerShell para reproduzir o som
    objShell.Run "powershell -c (New-Object Media.SoundPlayer '" & caminhoSom & "').PlaySync()"
End Sub


Private Sub apaga_numero_Click()
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    ' Apaga o último caractere da caixa de texto
    Dim textoAtual As String
    textoAtual = TextBox1.Value
    
    If Len(textoAtual) > 0 Then
        TextBox1.Value = Left(textoAtual, Len(textoAtual) - 1)
    End If
End Sub


Private Sub apagar_linha_Click()
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    TextBox1.Value = ""
    hasDecimal = False
    hasOperator = False

End Sub

Private Sub cinco_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 5
Else
   TextBox1.Text = TextBox1.Text & 5
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub dividir_Click()
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    If TextBox1.Text = "" Then
   TextBox1.Text = "/"
Else
   TextBox1.Text = TextBox1.Text & "/"
End If
End Sub

Private Sub dois_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 2
Else
   TextBox1.Text = TextBox1.Text & 2
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub igual_Click()
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    EvaluateAndAddToHistory
End Sub

Private Sub mais_Click()
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    If TextBox1.Text = "" Then
   TextBox1.Text = "+"
Else
   TextBox1.Text = TextBox1.Text & "+"
End If
End Sub

Private Sub nove_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 9
Else
   TextBox1.Text = TextBox1.Text & 9
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub oito_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 8
Else
   TextBox1.Text = TextBox1.Text & 8
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub quatro_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 4
Else
   TextBox1.Text = TextBox1.Text & 4
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub seis_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 6
Else
   TextBox1.Text = TextBox1.Text & 6
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
    
End Sub

Private Sub sete_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 7
Else
   TextBox1.Text = TextBox1.Text & 7
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub tres_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 3
Else
   TextBox1.Text = TextBox1.Text & 3
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub um_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 1
Else
   TextBox1.Text = TextBox1.Text & 1
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub


Private Sub virgula_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = ","
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

Private Sub zero_Click()
If TextBox1.Text = "" Then
   TextBox1.Text = 0
Else
   TextBox1.Text = TextBox1.Text & 0
End If
Dim caminhoSom As String
    caminhoSom = "C:\Users\craft\OneDrive\Desktop\CALCULADORA\discord-notification.wav"
    ReproduzirSom caminhoSom
End Sub

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.