consultar datos de la web, comas y puntos.

Mediante una consulta de datos externos Excel nos permite analizar datos que se encuentran en otro lugar, y esto incluye desde bases de datos a archivos de texto. Sin duda es una herramienta muy poderosa para poder utilizar toda la capacidad que sabemos emplear de Excel, pero manteniendo los datos originales en su sitio.
Sin embargo, cuando los datos se encuentran en una página web tenemos un problema añadido, y es el de los separadores decimales y de miles.
Con la macro que propongo a continuación, se pueden definir estos separadores para poder leer los datos configurando adecuadamente los separadores.

Siempre lo digo, los ordenadores trabajan con el punto como separador decimal, por mucho que la configuración regional trate de hacernos ver otra cosa. Es normal, todo esto parte de los Estados Unidos, así que internamente las máquinas están en sistema americano nos guste o no.

Y esto qué quiere decir, pues que si la máquina espera un punto como separador decimal, y espera las fechas como mes, día, año. salvo que le digamos otra cosa.

Excel es bastante leal y casi siempre toma la configuración del sistema, con lo que se supone que entiende las cosas tal y como a ti te gusta trabajar, así que suele entender las comas y los puntos de acuerdo a la configuración regional de tu sistema.

Con la mayor parte de las consultas de datos este problema no existe. Si los datos están en una base de datos, los números son números, se guardan como números, así que el decimal está siempre en el sitio correcto y excel lo entiende bien. Incluso en la configuración de un archivo de texto es posible definir los separadores decimales y de miles para que lo lea correctamente independientemente de la configuración regional.

Sin embargo con las consultas Web no podemos definir el separador decimal igual que ocurre con las consultas a un archivo de texto. No entiendo por qué no se puede, cuando es algo bastante parecido.

Solución al problema

Lo que sí permite Excel es definir configuración de comas y puntos diferente de la del sistema.
esto está en Opciones de Excel>Avanzadas>Opciones de Edición>...

configurar separadores diferentes a los del sistema

Por defecto tenemos activada la opción de utilizar los separadores del sistema (es lo más lógico), pero podemos cambiarlo si en algún caso necesitamos manipular algún archivo que tenga otra configuración.

Para no tener que andar modificando manualmente la configuración, con la siguiente macro realizo este cambio, luego actualizo la consulta y una vez actualizada, se vuelve a dejar la configuración como estaba.

Para poder reutilizarla empleo tres argumentos:

 MiConsulta: es un objeto que representa la consulta que se quiere actualizar.
 SepDecimalDatos: es el separador decimal que tienen los datos en la web
 SepMilesDatos: es el separador de miles que tienen los datos en la web, es opcional, si no hay separador de miles en los datos no es necesario utilizarlo

Sub ActualizarConsultaSeparadores(MiConsulta As Object, SepDecimalDatos As String, Optional SepMilesDatos As String = "")
' Ya sé Excel, pero necesito más: www.necesitomas.com/excel

' macro para entender separadores de miles y decimal en consultas (especialmente las web, que no permiten definirlo).
' inspirado en (y corrigiendo un poco) lo que vi en http://msdn.microsoft.com/en-us/library/aa203721(office.11).aspx
    Dim strDecimal, strThousand, boolUseSystem
   
    With Application
        'Guardamos la configuración para luego poder restituirla cuando terminemos
        strDecimal = .DecimalSeparator
        strThousand = .ThousandsSeparator
        boolUseSystem = .UseSystemSeparators
       
        'Establecemos los separadores según los argumentos de la función, para que
        ' coincidan con los de la página web
        .DecimalSeparator = SepDecimalDatos
        .ThousandsSeparator = SepMilesDatos
        .UseSystemSeparators = False
       
        'Ingoramos los errores
        On Error Resume Next
       
        'Actualizamos la consulta, esperamos que termine
        MiConsulta.Refresh BackgroundQuery:=False
       
        'Restituimos la configuración inicial.
        .DecimalSeparator = strDecimal
        .ThousandsSeparator = strThousand
        .UseSystemSeparators = boolUseSystem
    End With
End Sub

Si tenemos pocas tablas, por supuesto que también podemos utilizar este cambio de configuración en el evento BeforeRefresh del objeto QueryTable que nos interese, y utilizar el evento AfterRefresh para dejarlo como estaba.

Espero que os resulte de utilidad.

Si quieres dejar un comentario, aquí puedes hacerlo:

Temática: 

Comentarios