miércoles, 1 de abril de 2015

Convertir Números como texto a números (puntos por comas).

En alguna ocasión, al trabajar con datos importados de orígenes dispares nos hemos encontrado con valores numéricos (supuestamente) con los separadores decimales o de miles intercambiados.
En la entrada de hoy veremos un procedimiento que ajusta estos valores a nuestra configuración, intercambiando sin error los separadores.

La clave de este ejercicio reside en la función personalizada 'NumTexto_a_Num' con la que 'partimos' el supuesto dígito en la parte Entera y la parte Decimal, obtenida al separar el valor por el separador decimal.


Veamos el fichero de partida, donde se mezclan importes con los separadores cambiados e importes correctamente importados, con otros datos de texto o incluso fechas...

Convertir Números como texto a números (puntos por comas).



Insertamos el siguiente procedimiento 'CambioPuntoxComa' y la función 'NumTexto_a_Num' en un módulo estándar:

Sub CambioPuntoxComa()
'controlamos el rango sobre el que trabajar
Set rngceldas = Range("A2").CurrentRegion
'recorremos todas las celdas del rango
For Each celda In rngceldas
    'cambiamos el valor de la celda por el que devuelva la función personalizada NumTexto_a_Num
    'dejamos fuera las celdas con valores de texto, lógicas, fechas...
    If IsNumeric(celda.Value) = True Then
        'para descartar lo que ya son números!!
        If Application.WorksheetFunction.IsText(celda.Value) Then
            celda.Value = NumTexto_a_Num(celda.Value, ".")
            celda.NumberFormat = "#,##0.00"
        End If
    End If
Next celda
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function NumTexto_a_Num(NumText As String, SepDec As String) As Double

Dim Entero As String, Decimales As String, SepMiles As String
'Array temporal para tratar la parte entera y Decimal
Dim Temp() As String

'gestionamos qué aparece como Separador de miles en los valores a tratar...
'si el separador decimal es el punto, entonces el de miles será la coma
'en otro caso el de miles sería el punto
If SepDec = "." Then
    SepMiles = ","
Else
    SepMiles = "."
End If

'completamos la matriz/array temporal con las partes del valor...
Temp = Split(NumText, SepDec, -1)
'desterminamos la parte entera del número
'reemplazando el Separador de miler por nada.. para dejarlo 'limpio'
Entero = WorksheetFunction.Substitute(Temp(0), SepMiles, "")

'finalmente devolvemos el valor a la función
Select Case WorksheetFunction.CountA(Temp)
    'si la matriz/array tiene un elemento, entonces
    'es un número entero, sin decimales
    Case Is = 1
        NumTexto_a_Num = Val(numInt)
    Case Else
    'en otros casos, es un número con parte decimal
    'y componemos el valor....
        Decimales = Temp(1)
        NumTexto_a_Num = Val(Entero & SepDec & Decimales)
End Select
  
End Function



Tras ejecutar el procedimiento obtendremos lo deseado... los valores que ya eran numéricos lo seguirán siendo (permanecerán intactos), mientras que los números 'cambiados' se habrán convertido a números...

Convertir Números como texto a números (puntos por comas).

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.