Macro que busque y ordene

Hola Dam, necesito que me ayudes con una macro de Control de asistencia la cual tiene que hacer lo siguiente:

ordenar registro descendente según: {Nro. ID, Fecha/Hora}

recorrer registro completo
si es dia laboral (lunes, martes, miércoles, jueves y viernes):
contar cantidad registros del dia por ID (el id es el identificador del usuario y deberían haber 4 registros diarios, entrada y salida MAÑANA, y entrada y salida TARDE)
si cantidad es menor o diferente a 4:
ejecutar dia_laboral_incompleto() (indicar cual es el id que esta incompleto)


si es dia_sabado:

contar cantidad registros del dia por ID ( aquí deben haber 2 registros Entrada y salida Mañana)
si cantidad es menor o diferente a 2:
ejecutar dia_sabado_incompleto()
sino:
ejecutar sub val_eventos_dia_sabado()

----------

Espero se entienda.

Esta es la tabla a la cual hay que aplicar los datos.

http://dl.dropbox.com/u/31683777/Prueba2.xlsx

**Ya tengo las lineas para ordenar descendente, son estas:

Sub ordenar()
Range("a2").CurrentRegion.Sort key1:=Range("a2"), _
order1:=xlDescending, key2:=Range("b2"), _
order2:=xlDescending, Header:=xlYes, ordercustom:=1, _
Orientation:=xlTopToBottom
Rows("1:1").Select
Selection.Delete Shift:=xlUp
End Sub

1 respuesta

Respuesta
1

Te anexo la macro, ya incluye el código para ordenar.

En las columnas C, D y E te pone el resultado. En el código puse el comentario del lugar donde tienes que poner las llamadas a tus macros.

ejecutar dia_laboral_incompleto()

ejecutar dia_sabado_incompleto()

Sub controlasis()
'calcula control de asistencia
'Por.dam
id_ant = Range("A2")
fe_ant = Range("B2")
cuenta4 = 0
cuenta2 = 0
j = 2
Range("C:E").Clear
    Columns("A:B").Select
    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, _
        Key2:=Range("B2"), Order2:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row + 1
    If id_ant = Cells(i, "A") And _
       fe_ant = Cells(i, "B") Then
       Select Case Weekday(fe_ant, 1)
            Case 1 'Domingo
            Case 2, 3, 4, 5, 6 'Lun, mar, mie, jue, vie
                cuenta4 = cuenta4 + 1
            Case 7 'Sabado
                cuenta2 = cuenta2 + 1
        End Select
    Else
       Select Case Weekday(fe_ant, 1)
            Case 1 'Domingo
            Case 2, 3, 4, 5, 6 'Lun, mar, mie, jue, vie
                If cuenta4 <> 4 Then
                    'ejecutar dia_laboral_incompleto()
                    Cells(j, "C") = id_ant
                    Cells(j, "D") = fe_ant
                    Cells(j, "E") = "Id incompleto"
                    j = j + 1
                End If
            Case 7 'Sabado
                If cuenta2 <> 2 Then
                    'ejecutar dia_sabado_incompleto()
                    Cells(j, "C") = id_ant
                    Cells(j, "D") = fe_ant
                    Cells(j, "E") = "Id incompleto"
                    j = j + 1
                End If
        End Select
        id_ant = Cells(i, "A")
        fe_ant = Cells(i, "B")
        cuenta4 = 1
        cuenta2 = 1
    End If
Next
End Sub

Saludos.Dam
Si es lo que necesitas.

Me da error en el tiempo de ejecución.

¿En qué fila empiezan tus datos?

Hola dam, disculpa por no responderte rapido.

Mis datos comienzan en la fila 2.

Revisa que desde la fila 2 y en todas las filas las columna B tengan fechas, si no tiene fecha te va a enviar error

Saludos. Dam

Todas las filas B tienen fechas. con el siguiente formato:

martes-01-22 20:08
miércoles-01-23 09:08

viernes-01-23 09:10

El error problema sigue.

Lo que pasa es que no está reconociendo como fecha, ¿no lo tienes como valor? ¿O cómo texto?

Prueba en 2 ó 3 celdas poniendo una fecha, por ejemplo 05/ene/2013, 06/ene/2013, 07/ene/2013

Para que veas el funcionamiento de la macro y después revisamos el formato que tienes en esa columna

Le coloque en formato fecha las 3 que me indicas arriba, pero aun asi no pasa.

05/ene/2013

06/ene/2013

07/ene/2013

Si quieres pruebalo tu con el archivo excel que te adjunte en dropbox.

Pues algo tiene tu fecha o el inicio donde están tus datos, porque a mí me funciona bie.

No veo la liga

Envíamelo a mi correo

[email protected]

Saludos. Dam

Te envié mi archivo para que hagas tu prueba.

Saludos. Dam

Si es lo que necesitas.

Acabo de enviarte los 2 archivos (macro dam y el excel con los id y fecha).

¿Probaste mi archivo?

Si, funciona bien tu archivo, el problema que tengo es que necesito hacer una comparación entre 3 datos, ID, fecha y hora, esos 3 datos corresponden a un empleado X el cual registra sus datos de asistencia en una maquina biometrica. Estos datos son 4 registros diarios por usuario de entrada y salida (DIA) y entrada y salida (TARDE). ENtonces tenemos un problema porque los empleados tienes q presionar el boton de entrada (cuando tienen que registrar su ingreso) y el boton salida (cuando tienen que registrar su salida laboral).

Entonces con la macro prentendo indentificar cuales son las personas que no estan marcando las 4 veces en el dia.

Otra cosa que necesito es modificar los I(de entrada) y los O( de salida) estas letras van en una columa al lado del registro de asistencia (fecha y hora), pero eso se desordena porque a veces los empleados se olvidan de presionar el boton entrada y salida cuando lo tienen que hacer.

Con esta informacion que me entrega la maquina pretendo que me ayudes con un macro el cual tome el registro,lo ordene y haga lo siguiente:

**ESTO ES PARA LOS DIAS DE LUNES A VIERNES

Si hora es = o mayor a 8:30 y es inferior a 9:30

Entonces agregar letra I(entrada) en una columna aparte al lado de la hora (esto para indicar que en ese rango de hora se considera como "entrada")

Si hora es = o mayor a 13:30 y es inferior a 14:30

Entonces agregar letra O(salida)

Si hora es = o mayor a 15:30 y es inferior a 16:30

Entonces agregar letra I(entrada)

Si hora es = o mayor a 19:00 y es inferior a 20:00

Enronces agregar letra O(salida)

**DIAS SABADOS**

para el sabado es asi:

Si hora es = o mayor a 9:30 y es inferior a 10:30

Entonces agregar I(entrada)

Si hora es = o mayor a 12:30 y es inferior a 13:30

Entronces agregar O (Salida)

---

Ademas de indicar cuales fueron los dias que no se marco 4 veces en 1 dia. (eso ya esta lo tienes echo)

Este es un pantallazo del software que emite la informacion:

https://dl.dropbox.com/u/31683777/Captura.PNG

En una columna muestra todo junto (fecha/hora) nose si ese es el problema porque a mi no me resultaba tu macro.

Con todo gusto te sigo apoyando, también entiendo que al pasar la macro a otras validaciones no esté completa, pero la petición original era validar 4 movimientos, la macro cumple con ese objetivo; así que vamos por partes, podrías finalizar estar pregunta y crear una nueva por cada petición.

Añade tu respuesta

Haz clic para o