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.
¡¡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
Buenos días:
Solo quería agradecerles todos estos aportes que realizas.
Saludos.