25 septiembre, 2023

EJEMPLO PRÁCTICO EN VBA: OBTENER FECHAS EN HISTÓRICOS CON ERRORES DE EXTRACCIÓN

Hola a todos:

Hoy voy a publicar en VBA!, ya llevo varias semanas tocando otros lenguajes y es momento de mostrar un poco de Visual Basic en una ejemplo práctivo.

Cuando hablo de datos y realizo publicaciones, en la mayor parte de las ocasiones la información está muy bien confeccionada, no contiene errores y permite realizar el ejemplo con una gran claridad.

Pero esto en la vida real, como sabéis, no siempre pasa, más bien, es al contrario, la información con la que trabajamos suele tener errores, incoherencias, etc. Los motivos suelen ser varios:

  • Un error en la extracción de los datos.
  • un error en el análisis funcional de la aplicación que recopila y genera los datos.
  • Etc

Periódicamente este tipo de problemas me llegan en forma de consulta a Excel Signum y os puedo asegurar que algunas veces se vuelve muy complejo el poder llegar a obtener la información (y más aún automatizar).

Os pondré un ejemplo:

Imaginad que necesitáis obtener de una serie de usuarios desde cuándo lleva en su ubicación geográfica actual. Y nos envían esta información:

Como podéis observar nos encontramos con la información desordenada y con registros repetidos con fechas distintas. para resolver este problema, lo primero que debemos hacer es ordenar los datos. En primer lugar, la fecha por orden descendente y en segundo lugar el Id por orden ascendente:

Esto nos mostrará la información así:

Mirad por ejemplo el caso del ID C0001, ha estado en Álava y Ávila y lo que necesitamos es conocer es desde cuándo lleva en su ubicación actual, es decir, desde el 01/01/2019. Notad que los literales de provincia tienen errores y en algunos casos se han creado varios registros por ubicación.

Para resolverlo es necesario detectar la lógica o la pauta y programar un algoritmo que nos puede ayudar. Que ordene los datos, recorra los ID y por cada uno realice un loop por cada ID LUGAR.

Este sería el código:

Sub EJEMPLO_PRACTICO()
    Dim i As Long, j As Long, cont As Long
    Dim fin As Long
    'Ordenamos
    With Sheets("Hoja1").Range("A1")
        .Sort Key1:=Range("D1"), Order1:=xlDescending, Header:=xlYes
        .Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
    End With
    With Sheets("Hoja1")
        fin = Application.CountA(.Range("A:A"))
        'Analizamos registro actual y posterior
        For i = 2 To fin
            If .Cells(i, 1) <> .Cells(i + 1, 1) Then
                For j = 2 + cont To fin
                    If .Cells(j, 2) <> .Cells(j + 1, 2) Or (.Cells(j, 2) = .Cells(j + 1, 2) And .Cells(j, 1) <> .Cells(j + 1, 1)) Then
                        .Cells(j, 5) = "X"
                        Exit For
                    End If
                Next j
                cont = i - 1
            End If
        Next i
    End With
End Sub

Y este es el resultado:

Hemos detectado las fechas correctas y ya podemos trabajar con tranquilidad con nuestros datos.

Obviamente esto se puede realizar también con otros lenguajes, pero yo normalmente recurro a Visual porque me resulta sencillo y me da mucha libertad a la hora de programar.

Descarga el archivo de ejemplo pulsando en: EJEMPLO PRÁCTICO: OBTENER FECHAS EN HISTÓRICOS CON ERRORES DE EXTRACCIÓN

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

Un comentario en «EJEMPLO PRÁCTICO EN VBA: OBTENER FECHAS EN HISTÓRICOS CON ERRORES DE EXTRACCIÓN»

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies