
Extracción del número completo de un decimal en VBA
A veces deseamos extraer el número completo de un valor decimal.
Así que diga que está haciendo un aritmático como:
43/5
Que devuelve un valor de:
8.6
Y desea extraer únicamente el número entero, por lo que desea obtener:
8
Aquí hay algunas técnicas que puede emplear en VBA.
Los enfoques disponibles
Hay 3 enfoques que conozco para devolver el número completo de un valor decimal: int (), fix () y el operador de división entera. Todos funcionan de manera similar, pero hacen de diferentes maneras, ¡así que tenga cuidado de cuál adopta en su código!
Función int
Int(43/5) ' => 8
Función de reparación
Fix(43/5) ' => 8
Operador de división entera/operador de barras de granño
Aquí hay una posibilidad menos conocida. ¿Sabías que hay un ‘operador de división entera’? Entonces, en lugar de usar / (operador de división), realmente usa el \ (operador de división entera).
43 ' => 8
Negativo
Como siempre, tenga en cuenta la forma en que funcionan cada uno de estos enfoques para asegurarse de que está utilizando el enfoque de código adecuado para satisfacer sus necesidades.
Por ejemplo, si miramos int () vs. Fix vs. \ por un momento, para números negativos, difieren:
- Int () Devuelve el primer entero negativo menor o igual al número (redondea).
Int(-43/5) ' => -9
- Fix () Devuelve el primer entero negativo mayor o igual al número (redondeado).
Fix(-43/5) ' => -8
- El operador de la división entera.
-43 ' => -8
Ten cuidado con el pensamiento
Exploremos por un minuto un valor de 8.6 y queremos extraer la porción 8. Presta atención a los resultados de los diversos enfoques.
Podríamos hacer:
Int(8.6) ' => 8
Fix(8.6) ' => 8
8.6 ' => 9
Entonces, la forma en que cada enfoque maneja el redondeo puede afectar la salida resultante.
Una función definida por el usuario
Solo por diversión, como demostración, aquí una forma de crear su propia función de número completo donde puede personalizar la salida (agregue el redondeo de su elección, …)
Function WholeNumber(dNumber As Double) As Long Dim sNumber As String Dim lDecimalPosition As Long sNumber = CStr(dNumber) ' Convert to a string lDecimalPosition = InStr(sNumber, ".") ' Locate the Decimal If lDecimalPosition = 0 Then WholeNumber = dNumber ' Already a whole number Else WholeNumber = CLng(Left(sNumber, lDecimalPosition - 1)) End If End Function
Y si realizamos las mismas pruebas que anteriormente, obtenemos:
WholeNumber(43/5) ' => 8
WholeNumber(-43/5) ' => -8
WholeNumber(8.6) ' => 8
Algunos recursos

