Convertir a Numero desde VBA

Como puedo convertir los datos a Números, me explico, supóngase que por alguna razón descargo un archivo de texto a excel, el numero no es un numero sino texto.
Primero: supuestos caracter decimal el punto
A1: 12.234.345,34 el numero correcto seria 12,234,345.34 o 12234345.34
A2: 12,234 el numero correcto seria 12.234
En otra maquina puedo tener la siguiente situación:
A1: 12,234,345.34 el numero correcto seria 12.234.345,34 o 12234345,34
A2: 12,234 el numero correcto seria 12,234
como puedo construir una función que me ayude a convertir el numero que esta como texto a Numero independiente del carácter decimal que se este manejando, en pocas palabras que me haga la ssutitucion dependiendo del carácter decimal que este manejando el excel. En buena teoría esta función me servía solo que el algunos casos en donde el carácter decimal coincidía con el numero solo que había espacios en blanco delante del numero la función no me funciona.
Public Function Cambio_A_Num_II(ByVal pNum As String) As String
Dim sOrden As String, sCarac As String, sCaracContra As String
   pNum = VBA.Trim(pNum)
   If pNum = "" Then
      pNum = 0
   Else
      sCarac = Application.International(Excel.xlDecimalSeparator)
      sOrden = IIf(sCarac = ".", ".,", ",.")
      sCaracContra = IIf(sCarac = ".", ",", ".") 'sCarac)
      Dim sSort As String, nCan As Integer
      If Habe_Punt_Coma(pNum, sCarac, sSort, nCan) Then
         Dim sLetra As String, i As Byte
         For i = 1 To 2
            sLetra = VBA.Mid(sOrden, i, 1)
            If i = 1 Then pNum = VBA.Replace(pNum, sLetra, "")
            If i = 2 Then pNum = VBA.Replace(pNum, sLetra, sCarac)
         Next i
      Else
         If sCarac = sSort Then
            If nCan > 1 Then
               pNum = VBA.Replace(pNum, sCarac, "")
            Else
               pNum = pNum
            End If
            'pNum = pNum
         Else
            Select Case sSort
               Case "."
                  If nCan > 1 Then
                     pNum = VBA.Replace(pNum, sCarac, "")
                  Else
                     If nCan = 0 Then
                        pNum = VBA.Replace(pNum, ".", sCarac)
                     End If
                  End If
               Case ","
                  'If nCan > 1 Then
                     pNum = VBA.Replace(pNum, sCaracContra, "")
                  'End If
            End Select
         End If
      End If
   End If
   'MsgBox VBA.CDbl(pNum)
   'Debug.Print VBA.FormatNumber(pNum, 2)
   Cambio_A_Num_II = pNum
End Function

1 respuesta

Respuesta
1
Yo esas cosas las hago de otra manera. El único problema es el separador decimal ya que el de miles lo pone Excel si no existe.
Supongamos que me llega el formato con . para miles y, para decimales cuando a mi me interesa al revés:
Selecciono toda la hoja y hago una acción temporal:
->Cambio el . por una ##
->Cambio la coma por una!
Si te fijas uso combinaciones que no espero encontrar en los datos.
Luego arreglo las cosas para que queden como como me interese
Cambio los ## por nada
Cambio los !! por el punto decimal.
Formateo a números con separador de miles y ya está.
Puedes grabar la acción para el caso o los casos que te convengan.
¿Pero eso lo haces desde el VBA?
Una cosa más, ¿vos sabes como hace la celda de excel para saber si el numero que esta en dicha celda es numero o es texto? Porque el texto lo alinea a la izquierda y si es numero lo alinea a la derecha.
He buscado la forma de ver como hace la celda para identificarlo pero sin éxito.
Si la importación es de muy higos a brevas lo hago a mano. Si es algo que hago de continuo programo un parser para que modifique primero el .txt pero podrías grabar la macro en excel y ya la tienes 'facil'
No se cual es el modo en que Excel decide lo que es texto o número, supongo que todo lo que 'encaje' en un formato numérico lo toma como numero y el resto a texto.
También podrías cambiar los formatos de las regional settings pero al final te puede dar problemas con otras cosas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas