Duarte7777 Posted December 12, 2023 at 05:33 PM Report Share #632393 Posted December 12, 2023 at 05:33 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now