Formateo automático para decimales (Microsoft Excel)
John tiene una hoja de trabajo de ingreso de datos que permite a los usuarios ingresar información.
Le gustaría que una celda se formatee automáticamente para mostrar exactamente el número de decimales que escribe un usuario. Por ejemplo, si el usuario escribe «12.345», le gustaría que la celda se formatee automáticamente para mostrar 3 decimales. John sabe que podría usar el formato General para una celda (lo que hace esto muy bien), pero ese enfoque no funciona si el usuario ingresa un valor que termina en 0, como «12.34500», que le gustaría formatear (automáticamente) para mostrar 5 lugares decimales.
Si está pensando que podría usar un formato personalizado para abordar la necesidad, eso no funcionará. Con cada formato personalizado que se nos ocurra, Excel elimina los ceros finales de lo que muestra. (O, a la inversa, si el formato personalizado incluye «0» como marcador de posición, agrega ceros al final de la entrada).
La forma más fácil de manejar esto, sinceramente, es simplemente formatear las celdas como Texto antes de comenzar a ingresar información. De esa manera, Excel simplemente aceptará lo que se ingrese, incluidos los ceros finales, y lo guardará en la celda. Además, puede alinear a la derecha el contenido de las celdas para que al menos se parezcan un poco más a valores numéricos.
El inconveniente de esto es que debe tener cuidado al usar los valores en las fórmulas. La forma más segura es simplemente rodear cualquier referencia a la celda dentro de la función VALOR, de esta manera:
=VALUE(A1) * 1.375
Otro enfoque es crear una macro que verifique lo que se ingresa en un rango de celdas. Comience formateando las celdas como Texto y luego cree un rango con nombre (Entrada de datos) a partir de esas celdas. Luego puede agregar el siguiente código a la hoja de códigos de la hoja de trabajo que está utilizando:
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range Dim sEntry As String Dim dEntryNumber As Double Dim arr If Not Intersect(Target, Range("DataEntry")) Is Nothing Then Application.EnableEvents = False For Each c In Target.Cells If IsEmpty(c) Then c.NumberFormat = "@" ' Reset to Text format Else If IsNumeric(c) Then If Len(c.Value) = 0 Then c.NumberFormat = "@" ' Reset to Text format Else sEntry = c.Value dEntryNumber = CDbl(sEntry) arr = Split(sEntry, ".") If UBound(arr) = 1 Then ' Change NumberFormat in accordance with ' the number of digits after the decimal point c.NumberFormat = "0." & String(Len(arr(1)), "0") c.Value = dEntryNumber End If End If End If End If Next c Application.EnableEvents = True End If End Sub
La macro se activa cada vez que algo cambia en la hoja de trabajo. Luego verifica si ese cambio ocurrió en una de las celdas en el rango de entrada de datos. Si es así, examina lo que se ingresó en la celda (que Excel trata como texto, ya que así se formateó la celda)
y determina si es un número y además cuántos dígitos hay a la derecha del lugar decimal. A continuación, formatea la celda para que se muestren tantos lugares decimales y vuelve a introducir el valor numérico en la celda.
La única condición en la que este enfoque no funcionará es si coloca un valor en una celda en el rango de entrada de datos (que convierte la celda a un formato numérico) y luego ingresa un valor numérico diferente en la misma celda. La macro no tiene forma de saber, en ese caso, si se están ingresando ceros finales. (Recuerde que los ceros finales solo se conservan si la celda tiene el formato Texto. Dado que la celda no lo es, Excel elimina los ceros finales y la macro funciona con ese valor como si se hubiera introducido).
_Nota: _
Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.
link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador]
.
ExcelTips es su fuente de formación rentable en Microsoft Excel.
Este consejo (1963) se aplica a Microsoft Excel 2007, 2010, 2013 y 2016.