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...
Insertamos el siguiente procedimiento 'CambioPuntoxComa' y la función 'NumTexto_a_Num' en un módulo estándar:
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...
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...
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 FunctionTras 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...




No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.