Redondeo de un resultado sin perder la fórmula

¿Hay algún forma de redondear el resultado de un fórmula a dos decimales sin que se pierda la expresión de ésta?
He estado utilizando:
??ActiveCell.Value = Application.WorksheetFunction.RoundUp(ActiveCell, 2)
Pero al quedarse sólo con el valor, el resultado no varía al cambiar los datos fuente.
Tampoco me serviría el truco de poner en dos decimales el formato numérico porque el resultado lo muestro mediante la variable "maximo" en la siguiente forma:
Range(rango_respuesta_mayoritaria) = ActiveCell.Value & Chr(32) & "(" & (maximo) & "%" & ")"

1 Respuesta

Respuesta
1
A ver si me aclaro. La línea "ActiveCell.Value = Application.WorksheetFunction.RoundUp(ActiveCell, 2)" pone como valor de la celda el valor anterior redondeado a dos decimales.
Si lo que haces es asignar algo al 'valor' de la celda, las posibles fórmulas que existieran antes se pierden.
La posible solución es, si no hay nada más que se me escape, bastante sencilla. ¿Por qué no utilizas la función 'redondear' dentro de la fórmula de la celda y te dejas de modificarla a través del código.
También podrías incluir la función redondear 'en la propia fórmula' de la celda a través del código con algo así:
Sub incluirRedondeo2decimalesEnCeldaActiva()
    Dim txtFormula As String
    txtFormula = ActiveCell.Formula
    If txtFormula = "" Then Exit Sub ' la celda está en blanco
    If Left$(txtFormula, 1) <> "=" Then Exit Sub 'No tiene ninguna fórmula (debería empezar por el signo igual)
    ' Comprobaremos si ya está redondeando a 2 decimales toda la fórmula
    If Len(txtFormula) >= 11 Then ' Si mide menos no puede estar redondeada
        If UCase$(Left$(txtFormula, 7)) = "=ROUND(" And UCase$(Right$(txtFormula, 4)) = ", 2)" Then
            Exit Sub ' Empieza por Round y termina redondeando a 2 decimales. Ya está hecho
        End If
    End If
    ' Si llega hasta aquí no está redondeando. Añadiremos la función
    txtFormula = "=round(" & Right$(txtFormula, Len(txtFormula) - 1) & ", 2)"
    ' Asignamos la nueva fórmula a la celda
    ActiveCell.Formula = txtFormula
End Sub
Hola Santiago,
Salvando otro de mis fallos de concepto (poder redondear directamente en la fórmula y no en el resultado), sigo teniendo el problema de que se actualice el valor de la variable máximo. Lo he intentado de esta forma:
Range(rango_respuesta_mayoritaria).Value=WorksheetFunction.max(Range(rango_calc_graf))
maximo = Range(rango_respuesta_mayoritaria).Formula
Range(respuesta) = range("A2").value & Chr(32) & "(" & maximo & "%" & ")"
Pero a modificar valores dentro del rango_calc_graf, no me modifica el valor de máximo. ¿Hay forma de hacerlo? O mejor dicho, ¿en qué estoy metiendo la pata ahora?
Muchas gracias como siempre, y un saludo.
En ese caso estás haciendo lo mismo: asignar a la celda el valor del resultado de la fórmula para calcular el máximo en lugar de asignar la fórmula.
Imagina que en A1 tienes 2 y en A2 tienes 5. Si pones que Range("A3"). value = range("A1"). value+range("A2"). Value, el resultado será 7 pero habrás puesto un 7 en la celda, no la fórmula que lo calcula.
Para poner la fórmula tendrías que poner: range("A7").formula="=A1+A2". De esta forma, si varías A1 o A2, la celda A3 cambiará su valor.
Prueba a poner:
    Range(rango_respuesta_mayoritaria).Formula="=max(" & rango_calc_graf & ")"
Con eso se actualizará el máximo en la celda 'rango_respuesta_mayoritaria'.
Y si pones esto:
    Range(respuesta).formula = "=A2 & "" ("" & rango_respuesta_mayoritaria & "")"""
En la celda "respuesta" te pondrá la fórmula que, si no me equivoco, estás buscando.
Después de no sé ni cuántas pruebas, no consigo acertar con la sintaxis de esta línea:
Range(rango_respuesta_mayoritaria).Formula = "= "& respuesta_mayoritaria &" & Chr(32) &"("& ""("" & maximo & "")"" & "%)""
Lo que quiero es que en la celda quede algo como:
18-25 AÑOS
(68%)
Siendo:
respuesta_mayoritaria="18-25 AÑOS"
maximo = WorksheetFunction.max(Range(rango_calc_graf))
Y suponiendo que el valor de máximo fuera ese 68
Mil gracias por la ayuda!
Por lo que veo las variables 'respuesta_mayoritaria' y 'maximo' contienen los valores correspondientes y no las celdas donde se calculan.
Si las utilizas así, cuando alguien modifique algún dato no se modificará la celda del resultado, ya que estás poniendo una fórmula referida a valores fijos y no a las celdas.
Lo que deberías poner, si vas a usar los valores fijos y no las celdas, es lo siguiente:
Range(rango_respuesta_mayoritaria) = respuesta_mayoritaria & " (" & maximo & "%)"
Es posible que la variable "maximo" tenga un valor real en 'tanto por uno' en lugar de un 'tanto por cien'. En ese caso, deberías poner 'máximo*100' y arreglado.
Si lo que quieres es que la celda varíe cuando cambien los datos, tendríamos que poner en unas celdas los valores de 'respuesta_mayoritaria' y 'maximo', y después construir el texto que quieres basándonos en dichas celdas. Dime si es esto y vemos como hacerlo.
Hola Santiago,
Lo primero, perdón por la tardanza. He estado liada con otras partes de la macro.
Y lo segundo, he seguido tu consejo, y he asignado el valor del máximo a una celda, sustituyendo después la variable máximo por el range. value de ésta. Pero tampoco se actualizan los valores al cambiar los datos.
También he probado a meter la función directamente:
Range("G4") = ActiveCell.Value & Chr(32) & "(" & WorksheetFunction.max(Range("F4:F9")) & "%" & ")"
Pero nada.
¿Estoy haciendo algo mal? ¿Hay alguna otra forma de hacerlo?
Muchas gracias de antemano!
Para calcular el máximo en una celda y que se actualice automáticamente, lo que tienes que hacer es poner la fórmula en dicha celda. Puedes hacerlo de dos formas: escribiéndola directamente en la hoja de cálculo o bien, a través de VBa, modificando la propiedad 'formula' de la celda.
Lo que creo entender que quieres hacer con la línea...
Range("G4") = ActiveCell.Value & Chr(32) & "(" & WorksheetFunction.max(Range("F4:F9")) & "%" & ")"
... pienso que será...
range("G4").formula="=""("" & F4 & "" de "" & MAX(F4:F9) & "")"""
Prueba este código que, si no me equivoco, podría servirte de pista.
    Dim i As Integer
    Dim miFormula As String
    For i = 4 To 9
        miFormula = "=F" & i & " & "" de "" & MAX(F4:F9)"
        Range("G" & i).Formula = miFormula
    Next i
Si con eso no consigues lo que quieres, envíame la hoja de cálculo (comprimida en zip) al correo ([email protected]) y la echo un vistazo.
Si ocupa más de 500 kb mándala a [email protected] comprimida y con una clave (sino hotmail no deja descargarlo) y me mandas un aviso a mixmail.
A ver si resolvemos ese problemilla.
Hola Santiago!
Gracias por responder tan rápido. Te voy a enviar el archivo al correo (en cuanto vuelva a conseguir una versión gratuita del zip y te prepare una versión corta de la macro con esa parte en concreto) porque ahora sí me actualiza el valor de máximo, pero no es lo único que tiene que hacer (el activecell. value en realidad recoge el texto que corresponde a esa opción mayoritaria).
De todas formas, ya cierro y te evalúo con la misma puntuación de siempre.
Felices fiestas igualmente!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas