Hallar el valor de la fórmula definida en un campo

En Access tengo un Formulario llamado F1 con tres campos provenientes de una tabla: c1, c2, c3, r
Por ejemplo, en un registro tenemos
C1 vale 5,
C2 vale 6 (son numéricos)
c3 es texto y almacena una fórmula por ejemplo [c1]*[c2]/10 y desearía que en r se calculará el resultado de la fórmula indicada en c3. Es decir, calculara 5*6/10=3
¿Hay algún modo de hacerlo?
He intentado usar la función EVAL, pero no me ha funcionado.

1 Respuesta

Respuesta
1
Lo pienso y te contesto. Te adelanto que forma hay, pero hay que escribir un "parser" (forma parte de un compilador o intérprete).
Por ahora esperame, Marciana
Espero ...
No me había olvidado. Estoy desempolvando viejos algoritmos. Aprovecho para preguntar:
1) ¿La expresión utiliza las cuatro operaciones + - * / o también exponencial?
2) ¿Incluye nombres de función?
3) ¿Podrías escribirme cómo serían las expresiones más complejas que se pueda escribir?
4) ¿Los operandos son siempre 3?
Espero tu respuesta (y sigo trabajando)
Hola Mariana:
Lo primero gracias por tu atención.
Paso a responderte:
1) ¿La expresión utiliza las cuatro operaciones + - * / o también exponencial?
   Con las basicas + - * / sirve
2) ¿Incluye nombres de función?
   En principio NO.
3) ¿Podrías escribirme cómo serían las expresiones más complejas que se pueda escribir? -
   Por ejemploD=C6*C7*C8/100    o    G = 50*D + 25*E+25*C  o F = A/B*100
4) ¿Los operandos son siempre 3?
No siempre
Si no es muy complejo sería interesante poder evaluar condiciones, por ejemplo
A=10, B= 2,  I=A/B*100  , Criterio=">=50"  ,  ¿Cómo saber en una variable A si I cumple Criterio? 
Gracias de nuevo y un saludo.
Complica mucho que el número de variables no esté definido. Deberías poner un máximo. Yo había interpretado que cada variable viene en un campo de la tabla.
Evaluar condiciones es un problema diferente al de evaluar expresiones.
Te aclaro que me llevará un poco de tiempo hacer una solución simple (cantidad de variables fija, cuatro operaciones) y sin ocuparme mucho de los posibles errores (por ejemplo que escriban "A+*B". Esto lo hago porque es un problema muy interesante que no veía desde mis tiempos en que era profesora en la universidad, por suerte encontré un libro con el tema desarrollado.
Te voy a ir enviando las etapas intermedias de desarrollo.
Espero tu respuesta sobre el máximo de variables. Luego no te contestaré porque si no te queda bloqueada tu posibilidad de hacer otras consultas. Que siempre quede una respuesta mía pendiente.
Suerte, M
Hola de nuevo:
  Para no complicarlo pensemos que la expresión más compleja sería: F = A/B*100  que son las más habituales, donde
A y B serían campos de la tabla y 100 una constante o incluso un campo
más de la tabla, por lo que serían un máximo de dos variables (o tres
si incluyes la constante).
Olvidemos el control de errores de expresiones invalidas.
Todo
Mi problema vino al ver que por ejemplo FoxPro tiene una función
"Evaluate(Expr_String)" que permite evaluar expresiones (incluyendo
cálculos, funciones y/o expresiones), por ejemplo:
 x=8
Cadena="IIF(x >= 6 , 50 , 30)"
N_Val=Evaluate(Cadena)
Y pensé que habría algo similar que no encontraba ...
Gracias y un saludo.
Sin terminar:
Creá una base vacía. En módulos agregá uno nuevo, cualquier nombre, y pegale lo siguiente:
Option Compare Database
Option Explicit
Dim PilaOperando(10) As Double
Dim PilaOperador(10) As String
Dim pilaNivel(10) As Integer
Dim PilaOperandoLibre As Integer
Dim PilaOperadorLibre As Integer
Public Function Resultado(a As Double, b As Double, c As Double, e As String) As Double
    Dim largo As Integer
    Dim indice As Integer
    Dim Parsed As String
    Dim Operando1 As Double
    Dim Operando2 As Double
    PilaOperandoLibre = 1
    PilaOperadorLibre = 1
    largo = Len(e)
    For indice = 1 To largo
        Parsed = Mid(e, indice, 1)
        Select Case Parsed
            Case "a"
                ApilaOperando (a)
            Case "b"
                ApilaOperando (b)
            Case "c"
                ApilaOperando (c)
            Case "*", "/"
                ApilaOperador (Parsed)
            Case "+", "-"
                ApilaOperador (Parsed)
        End Select
    Next
    For indice = 1 To PilaOperadorLibre
        Parsed = DesApilaOperador()
        Operando1 = DesApilaOperando()
        Operando2 = DesApilaOperando()
        Select Case Parsed
            Case "*"
                Resultado = Operando1 * Operando2
            Case "/"
                Resultado = Operando2 / Operando1
            Case "+"
                Resultado = Operando1 + Operando2
            Case "-"
                Resultado = Operando1 - Operando2
        End Select
        ApilaOperando (Resultado)
    Next
    Resultado = DesApilaOperando()
End Function
Public Function ApilaOperando(x As Double)
  PilaOperando(PilaOperandoLibre) = x
  PilaOperandoLibre = PilaOperandoLibre + 1
End Function
Public Function ApilaOperador(x As String)
  PilaOperador(PilaOperadorLibre) = x
  PilaOperadorLibre = PilaOperadorLibre + 1
End Function
Public Function DesApilaOperando() As Double
    PilaOperandoLibre = PilaOperandoLibre - 1
    DesApilaOperando = PilaOperando(PilaOperandoLibre)
End Function
Public Function DesApilaOperador() As String
    PilaOperadorLibre = PilaOperadorLibre - 1
    DesApilaOperador = PilaOperador(PilaOperadorLibre)
End Function
Luego, en esa misma ventana abrí la ventana Inmediato (Control +G) para hacer pruebas
y escribí las siguientes expresiones de a una, :
?resultado(1,2,3,"a+b*c")
?resultado(1,2,3,"a*b*c")
?resultado(1,2,3,"a*b/c")
?resultado(1,2,3,"a/b*c")
 los resultados respectivos son:
 ?resultado(1,2,3,"a+b*c")
7
?resultado(1,2,3,"a*b*c")
 6
?resultado(1,2,3,"a*b/c")
 0,666666666666667
?resultado(1,2,3,"a/b*c")
0,166666666666667
Hay que incorporar la precedencia de operadores (a/b*c debería dar 1,5 porque primero se divide y luego se multiplica). En eso estoy.
Hay que incorporar que aparezcan constantes en la expresión.
Hacé más pruebas teniendo en cuenta lo que falta.
Mariana, el prototipo funciona bastante bien ...
¿Cómo se integraría en un formulario?
Gracias por tus molestias. La solución me parece muy interesante...
Formulario
Supongamos que tenés un formulario con la tabla en cuestión, supongamos que los campos se llaman a, b y c, pondrías un botón y en el evento Al hacer clic pondrías la llamada a la función:
dim EsteResultado as double 
esteResultado=Resultado(a,b,c,"a+b*c") 
MsgBox EsteResultado
 (Los campos pueden tener nombres más complicados, sería así:
 esteResultado=Resultado(campo1,campo2,campo3,"a+b*c")
Pero en la expresión se llama "a" al primer argumento, "b" al segundo, etc.
Otra forma en formulario
En lugar de mostrarlo como en el ejemplo que te puse lo podes asignar a un cuadro de texto directamente: agregás el cuadro de texto y en Origen del control escribís
 =Resultado(a,b,c,"a+b*c")
Entonces al recorrer los registros el cuadro de texto mostraría el resultado.
Consulta
Si quisieras usar la función en una consulta agregarías los campos de la tabla y un campo calculado
Este: =Resultado([a],,[c],"a+b*c")
Fíjate que simplifiqué un problema de la función: que es suponer que el nombre de las variables es de un solo carácter y que son solamente 3 -se puede ampliar el número sin complicación-.
La función te sirve de pequeña calculadora, no necesitás tener una tabla =Resultado(2,3,4,"a+b*c") te dará un resultado asumiendo que el primer argumento es a, el segundo b y el tercero c.
Para permitir la inclusión de una constante (o varias) hay que hacer un análisis de la expresión para saber donde comienza la constante y donde termina. Además puede tener decimales o no con lo que hay que también detectar el punto o coma con que va a estar escrita.
Entonces: deberás decirme cómo serán las constantes
1)¿Siempre enteras?
2)¿Siempre con decimales? ¿En tal caso usa punto o coma como separador?
3) ¿A veces enteras a veces con decimales? (Ídem qué separador)
Ahora debería calcular todo bien. Falta considerar paréntesis y constantes.
Por favor hacé muchas pruebas.
Option Compare Database
Option Explicit
Dim PilaOperando(10) As Double
Dim PilaOperador(10) As String
Dim pilaNivel(10) As Integer
Dim PilaOperandoLibre As Integer
Dim PilaOperadorLibre As Integer
Public Function Resultado(a As Double, b As Double, c As Double, e As String) As Double
    Dim largo As Integer
    Dim indice As Integer
    Dim Parsed As String
    Dim Operador As String
    Dim Operando1 As Double
    Dim Operando2 As Double
    PilaOperandoLibre = 1
    PilaOperadorLibre = 1
    largo = Len(e)
    For indice = 1 To largo
        Parsed = Mid(e, indice, 1)
        Select Case Parsed
            Case "a"
                ApilaOperando (a)
            Case "b"
                ApilaOperando (b)
            Case "c"
                ApilaOperando (c)
            Case "*"
                If Top() = "/" Then
                Operador = DesApilaOperador()
                Operando2 = DesApilaOperando()
                Operando1 = DesApilaOperando()
                ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
            Case "/"
                If Top() = "/" Then
                Operador = DesApilaOperador()
                Operando2 = DesApilaOperando()
                Operando1 = DesApilaOperando()
                ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
            Case "+"
                ApilaOperador (Parsed)
            Case "-"
                If Top() = "-" Then
                Operador = DesApilaOperador()
                Operando2 = DesApilaOperando()
                Operando1 = DesApilaOperando()
                ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
        End Select
    Next
    'PilaOperadorLibre = PilaOperadorLibre - 1
    For indice = 2 To PilaOperadorLibre
        Parsed = DesApilaOperador()
        Operando2 = DesApilaOperando()
        Operando1 = DesApilaOperando()
        Resultado = ResuelveUna(Operando1, Operando2, Parsed)
        ApilaOperando (Resultado)
    Next
    Resultado = DesApilaOperando()
End Function
Public Function ApilaOperando(x As Double)
  PilaOperando(PilaOperandoLibre) = x
  PilaOperandoLibre = PilaOperandoLibre + 1
End Function
Public Function ApilaOperador(x As String)
  PilaOperador(PilaOperadorLibre) = x
  PilaOperadorLibre = PilaOperadorLibre + 1
End Function
Public Function DesApilaOperando() As Double
    PilaOperandoLibre = PilaOperandoLibre - 1
    DesApilaOperando = PilaOperando(PilaOperandoLibre)
End Function
Public Function DesApilaOperador() As String
    PilaOperadorLibre = PilaOperadorLibre - 1
    DesApilaOperador = PilaOperador(PilaOperadorLibre)
End Function
Public Function Top() As String
    If PilaOperadorLibre = 1 Then
        Top = "Vacía"
        Exit Function
    End If
    Top = PilaOperador(PilaOperadorLibre - 1)
End Function
Public Function ResuelveUna(Op1 As Double, Op2 As Double, Operador As String) As Double
    Dim Resultado As Double
        Select Case Operador
            Case "*"
                Resultado = Op1 * Op2
            Case "/"
                Resultado = Op1 / Op2
            Case "+"
                Resultado = Op1 + Op2
            Case "-"
                Resultado = Op1 - Op2
        End Select
        ResuelveUna = Resultado
End Function
Ya lo he incluido en un campo de un formulario y lo calcula bastante bien.
Lo he probado con varios casos y todo parece funcionar bien, a falta de incluir paréntesis, por ejemplo, si hago a+b/c  calcula a + (b/c), pero es imporible hacer (a+b)/c.
Respecto a las constantes basta con que sean enteras.
Gracias y un cordial saludo.
Que la constante sea entera simplifica bastante. Falta eso y los paréntesis. Ya lo tengo pensado. En cuanto lo tenga te lo mando.
Si algún caso que no queda bien calculado por favro hacémelo saber.
Escribo por sexta vez porque se han volado las respuestas anteriores.
Te envío la solución. Te pido que hagas pruebas sistemáticas pronto ya que tengo la solución el la cabeza, la olvidaré pronto. Pruebas sistemáticas sería probar todos los esquemas posibles. Recordá que no hay atención de errores. Son errores: caracteres no válidos, son válidos las letras a, b, c, los operadores + - * / y los dígitos numéricos (quedamos que las constantes son enteras), otro error son fórmulas mal formadas: por ejemplo a*-b o ab*/. También podría haber desbordamiento si hay más de 10 operandos o más de 10 operadores.
Acá va la solución espero que no incluya código html. Si lo incluye deberás quitarlo.
Option Compare Database
Option Explicit
Dim PilaOperando(10) As Double
Dim PilaOperador(10) As String
Dim pilaNivel(10) As Integer
Dim PilaOperandoLibre As Integer
Dim PilaOperadorLibre As Integer
Public Function Resultado(a As Double, b As Double, c As Double, e As String) As Double
Dim largo As Integer
Dim indice As Integer
Dim Parsed As String
Dim Operador As String
Dim Operando1 As Double
Dim Operando2 As Double
Dim constanteTexto As String
Dim ConstanteDoble As Double
PilaOperandoLibre = 1
PilaOperadorLibre = 1
largo = Len(e)
For indice = 1 To largo
Parsed = Mid(e, indice, 1)
Select Case Parsed
Case "a"
ApilaOperando (a)
Case "b"
ApilaOperando (b)
Case "c"
ApilaOperando (c)
Case "*"
If Top() = "/" Then
Operador = DesApilaOperador()
Operando2 = DesApilaOperando()
Operando1 = DesApilaOperando()
ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
End If
ApilaOperador (Parsed)
Case "/"
If Top() = "/" Then
Operador = DesApilaOperador()
Operando2 = DesApilaOperando()
Operando1 = DesApilaOperando()
ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
End If
ApilaOperador (Parsed)
Case "+"
If Top() = "*" Or Top() = "/" Or Top() = "-" Then
Operador = DesApilaOperador()
Operando2 = DesApilaOperando()
Operando1 = DesApilaOperando()
ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
End If
ApilaOperador (Parsed)
Case "-"
If Top() = "*" Or Top() = "/" Or Top() = "-" Then
Operador = DesApilaOperador()
Operando2 = DesApilaOperando()
Operando1 = DesApilaOperando()
ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
End If
ApilaOperador (Parsed)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
constanteTexto = ""
Do While Parsed = "0"
constanteTexto = constanteTexto & Parsed
indice = indice + 1
Parsed = Mid(e, indice, 1)
Loop
indice = indice - 1
ConstanteDoble = CDbl(constanteTexto)
ApilaOperando (ConstanteDoble)
Case "("
ApilaOperador (Parsed)
Case ")"
Parsed = DesApilaOperador()
Do While Not Parsed = "("
Operando2 = DesApilaOperando()
Operando1 = DesApilaOperando()
Resultado = ResuelveUna(Operando1, Operando2, Parsed)
ApilaOperando (Resultado)
Parsed = DesApilaOperador()
Loop
'Parsed = DesApilaOperador()
End Select
Next
For indice = 2 To PilaOperadorLibre
Parsed = DesApilaOperador()
Operando2 = DesApilaOperando()
Operando1 = DesApilaOperando()
Resultado = ResuelveUna(Operando1, Operando2, Parsed)
ApilaOperando (Resultado)
Next
Resultado = DesApilaOperando()
End Function
Public Function ApilaOperando(x As Double)
PilaOperando(PilaOperandoLibre) = x
PilaOperandoLibre = PilaOperandoLibre + 1
End Function
Public Function ApilaOperador(x As String)
PilaOperador(PilaOperadorLibre) = x
PilaOperadorLibre = PilaOperadorLibre + 1
End Function
Public Function DesApilaOperando() As Double
PilaOperandoLibre = PilaOperandoLibre - 1
DesApilaOperando = PilaOperando(PilaOperandoLibre)
End Function
Public Function DesApilaOperador() As String
PilaOperadorLibre = PilaOperadorLibre - 1
If PilaOperadorLibre = 0 Then PilaOperadorLibre = 1
DesApilaOperador = PilaOperador(PilaOperadorLibre)
End Function
Public Function Top() As String
If PilaOperadorLibre = 1 Then
Top = "Vacía"
Exit Function
End If
Top = PilaOperador(PilaOperadorLibre - 1)
End Function
Public Function ResuelveUna(Op1 As Double, Op2 As Double, Operador As String) As Double
Dim Resultado As Double
Select Case Operador
Case "*"
Resultado = Op1 * Op2
Case "/"
Resultado = Op1 / Op2
Case "+"
Resultado = Op1 + Op2
Case "-"
Resultado = Op1 - Op2
End Select
ResuelveUna = Resultado
End Function
Public Function Result(c_real As Single) As Double
Dim Cal As Integer
Cal = 1
If c_real >= 25 Then
Result = Cal * 0.015
Else
If c_real >= 20 Then
Result = Cal * 0.012
Else
If c_real >= 15 Then
Result = Cal * 0.009
End If
End If
End If
End Function
Hola:
He probado con a+b+5 y da error 13 en tiempo de ejecución (No coinciden los tipos) en la linea:
ConstanteDoble = CDbl(constanteTexto).
Si me das tu mail te puedo enviar la BD Access donde estoy probándolo.
De todos modos no te compliques tanto, sino se puede hacer metiendo las constantes en las variables.
Saludo
Ya que llegamos hasta aquí ...
Yo lo probé, no me da error, seguramente te falta incorporar alguna biblioteca. Te pido lo siguiente, enviame toda la expresión que usaste, hacé la prueba desde la ventana Inmediato (desde la ventana de código Ctrl + G) yo probé
?Resultado(1,2,3,"a+b+5")
y me dió 8.
Otra cosa, cuando da el error supongo que te aparece la opción "Depurar", "Finalizar" si es así elegí Depurar y podrás mirar los valores que lleva el programa, en tal caso simplemente poné elpuntero sobre la variable constanteTexto y anotá (y pásamelo) el valor que te da.
Última cosa: para ver si te falta alguna biblioteca:
1° En la ventana Inmediato probá
? Cdbl("5")
Y fíjate qué pasa.
2° Yo tengo incorporadas las siguientes bibliotecas (para ver las tuyas desde la ventana de código Herramientas/Referencias, valen las que están tildadas)
OLE Automation
Microsoft ActiveX Data Objects 2.1 library (puede ser otra versión)
Microsoft Access 11.0 Object library
(Hay otras pero no creo que sean las que importan)
Ultra Última cosa: ¿Qué versión de Office estás usando?
Mandame tu dirección de correo
Hola de nuevo:
Paso a responder tus preguntas:
* Al probar  ?Resultado(1,2,3,"a+b+5") da error 13 y en depuración constanteTexto contiene "".
* ?cdbl("5")  devuelve 5
* Versión de Access 2003
* Las bibliotecas que me dices están todas marcadas.
* Mi email:  [email protected]
Saludos.
Bien, te mando correo en privado. M
A continuación pongo la función que resuelve el problema, la anterior debe tener algún carácter erróneo y daba error si se copiaba y pegaba directamente. Porque librerías e instalación eran correctas.
SOLUCIÓN válida:
Option Compare Database
Option Explicit
Dim PilaOperando(10) As Double
Dim PilaOperador(10) As String
Dim pilaNivel(10) As Integer
Dim PilaOperandoLibre As Integer
Dim PilaOperadorLibre As Integer
Public Function Resultado(a As Double, b As Double, c As Double, e As String) As Double
    Dim largo As Integer
    Dim indice As Integer
    Dim Parsed As String
    Dim Operador As String
    Dim Operando1 As Double
    Dim Operando2 As Double
    Dim constanteTexto As String
    Dim ConstanteDoble As Double
    PilaOperandoLibre = 1
    PilaOperadorLibre = 1
    largo = Len(e)
    For indice = 1 To largo
        Parsed = Mid(e, indice, 1)
        Select Case Parsed
            Case "a"
                ApilaOperando (a)
            Case "b"
                ApilaOperando (b)
            Case "c"
                ApilaOperando (c)
            Case "*"
                If Top() = "/" Then
                Operador = DesApilaOperador()
                Operando2 = DesApilaOperando()
                Operando1 = DesApilaOperando()
                ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
            Case "/"
                If Top() = "/" Then
                    Operador = DesApilaOperador()
                    Operando2 = DesApilaOperando()
                    Operando1 = DesApilaOperando()
                    ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
            Case "+"
                If Top() = "*" Or Top() = "/" Or Top() = "-" Then
                    Operador = DesApilaOperador()
                    Operando2 = DesApilaOperando()
                    Operando1 = DesApilaOperando()
                    ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
            Case "-"
                If Top() = "*" Or Top() = "/" Or Top() = "-" Then
                Operador = DesApilaOperador()
                Operando2 = DesApilaOperando()
                Operando1 = DesApilaOperando()
                ApilaOperando (ResuelveUna(Operando1, Operando2, Operador))
                End If
                ApilaOperador (Parsed)
            Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
                constanteTexto = ""
                Do While Parsed = "0"
                    constanteTexto = constanteTexto & Parsed
                    indice = indice + 1
                    Parsed = Mid(e, indice, 1)
                Loop
                indice = indice - 1
                ConstanteDoble = CDbl(constanteTexto)
                ApilaOperando (ConstanteDoble)
            Case "("
                ApilaOperador (Parsed)
            Case ")"
                Parsed = DesApilaOperador()
                Do While Not Parsed = "("
                    Operando2 = DesApilaOperando()
                    Operando1 = DesApilaOperando()
                    Resultado = ResuelveUna(Operando1, Operando2, Parsed)
                    ApilaOperando (Resultado)
                    Parsed = DesApilaOperador()
                Loop
                'Parsed = DesApilaOperador()
         End Select
    Next
    For indice = 2 To PilaOperadorLibre
        Parsed = DesApilaOperador()
        Operando2 = DesApilaOperando()
        Operando1 = DesApilaOperando()
        Resultado = ResuelveUna(Operando1, Operando2, Parsed)
        ApilaOperando (Resultado)
    Next
    Resultado = DesApilaOperando()
End Function
Public Function ApilaOperando(x As Double)
  PilaOperando(PilaOperandoLibre) = x
  PilaOperandoLibre = PilaOperandoLibre + 1
End Function
Public Function ApilaOperador(x As String)
  PilaOperador(PilaOperadorLibre) = x
  PilaOperadorLibre = PilaOperadorLibre + 1
End Function
Public Function DesApilaOperando() As Double
    PilaOperandoLibre = PilaOperandoLibre - 1
    DesApilaOperando = PilaOperando(PilaOperandoLibre)
End Function
Public Function DesApilaOperador() As String
    PilaOperadorLibre = PilaOperadorLibre - 1
    If PilaOperadorLibre = 0 Then PilaOperadorLibre = 1
    DesApilaOperador = PilaOperador(PilaOperadorLibre)
End Function
Public Function Top() As String
    If PilaOperadorLibre = 1 Then
        Top = "Vacía"
        Exit Function
    End If
    Top = PilaOperador(PilaOperadorLibre - 1)
End Function
Public Function ResuelveUna(Op1 As Double, Op2 As Double, Operador As String) As Double
    Dim Resultado As Double
        Select Case Operador
            Case "*"
                Resultado = Op1 * Op2
            Case "/"
                Resultado = Op1 / Op2
            Case "+"
                Resultado = Op1 + Op2
            Case "-"
                Resultado = Op1 - Op2
        End Select
        ResuelveUna = Resultado
End Function
Public Function Result(c_real As Single) As Double
    Dim Cal As Integer
    Cal = 1
    If c_real >= 25 Then
        Result = Cal * 0.015
    Else
        If c_real >= 20 Then
            Result = Cal * 0.012
        Else
            If c_real >= 15 Then
                Result = Cal * 0.009
            End If
        End If
    End If
End Function

No me queda más que agradecer a Marciana, la experta, por el código desarrollado, su tiempo y su rapidez de respuesta.
¡PERFECTO!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas