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 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...
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.