Crear condición en un rango mediante vba

Para Dante. Amor

He creado una macro para que cuando no se cumpla una condición aparezca un mensaje de error, en este caso la condición es cuando no se cumpla que deben existir dos periodos en blancos en un día y dentro de esos dos periodos en blanco, uno de ellos debe tener un valor de como mínimo de 6. En caso de no cumplir con estos requisitos debe aparecer un mensaje de error, es decir debo tener 2 periodos de descanso (blanco) y uno de ellos como minimo de 6 horas.

Es el mismo archivo que se ha enviado al correo (erpunta) y la macro se encuentra en la hoja "Descanso"

2 respuestas

Respuesta
1

H o l a:

La hoja "descanso" tiene fórmulas con referencias circulares, por ejemplo, esta fórmula está en la celda DA13 y dentro de la fórmula hace referencia a la misma celda DA13

=SI(COLUMNAS($CZ13:DA13)>$CY13,"",INDICE(ENTERO(_xlfn.MODE.MULT(SI.ERROR(1/(1/FRECUENCIA(SI($B13:$Y13="",COLUMNA($B13:$Y13)),SI($B13:$Y13<>"",COLUMNA($B13:$Y13))))+10^-TRANSPONER(COLUMNA($B13:$Y13))*{1;1},""))),COLUMNAS($CZ13:DA13)))

Otro detalle que hay en la hoja "descanso", es que, cada vez que selecciono una celda, se ejecuta el evento "Worksheet_SelectionChange" y empieza a enviar muchos mensajes de error.

Todo eso complica un poco la labor sobre la hoja "descanso".


Regresando a tu pregunta, necesitas explicarme con lujo de detalle qué necesitas, es decir, explica con ejemplos, con datos, con celdas, con colores y con comentarios qué es lo que tienes, en esos ejemplos explica cuándo si cumple y cuándo no cumple los requisitos; si pudieras explicar varios ejemplos para que sea más claro.

Sal u dos

Ahora mismo estoy sin red en casa, en cuanto me reestablezcan el servicio enviaré el programa actualizado E indicando exactamente lo solicitado

Gracias

Buenas tardes

Después de resuelta la incidencia paso a describir lo solicitado. Ante todo pedir disculpas por tanta pregunta, pero por ejemplo hace una semana no sabia manejar un Userform y ahora a medida que descubro cosas sigo investigando y como en el circo intento "el mas difícil todavía"

1. Como bien indicas "Dante" dentro del programa, una hoja de calculo ("Descanso") se colocan las "x", lo de las horas (columnas) se ponen en "horas enteras" para cuando se revisen se sepan sobre que horas sucedió lo acontecido, no es necesario especificar tanto. Mientras que en la hoja de calculo ("Horas") si es necesario especificar las "horas" porque en base a esas horas a final de mes se cobrara. Es por esto el motivo por el que se solicita que dependiendo de la hoja de calculo en uno se coloquen "x" con horas enteras y en la otra hoja de calculo se coloquen las horas exactas.

Nota: Por cierto como se podría eliminar una "x"? Si en el Userform escribo el dia 3 de 12 a 16 horas, la macro coloca cinco "x" y para mi calculo debería colocar solo cuatro, porque yo indico es que se trabajo de 12 a 16 y eso son 4 horas (cuatro x)

2. Hoja de calculo "Descanso" o las famosas "x" aparecen continuos mensajes de error porque en cuanto se incumple alguna de las condiciones establecidas aparecen mensajes predeterminados. Lo único no se si existe algún método para una vez aceptado el mensaje no vuelva a surgir.

Por eso las referencias circulares son formulas para calcular los valores que son necesarios para saber si cumplo o no. Se ha de tener en cuenta que en cualquier periodo de 24 horas que se compute, se debe descansar como mínimo he de descansar 10 horas (columna BC-BE), otra condición es que en un día de trabajo (de 0 a 23) se deben tener 2 periodos en blanco (descanso) y además uno de esos periodos en blanco debe ser de como mínimo de 6 horas (en el programa enviado reformado al correo, la tabla que abarca CW13 hasta DW43. Fijate en la fila 18 tengo 2 periodos en blanco pero de 5 horas cada uno, con lo que debería aparecer un mensaje de error, mientras que en la fila 19 se cumplen los 2 periodos en blanco y se cumple que uno de ellos es de como minimo de 6 horas. En la fila 20 no se cumplen los 2 periodos en blanco, dado que existen 3, aunque alguno de ellos es superior a 6).  Y la tercera condición es que se debe descansar como minimo 77 horas semanales (columnas BF13-BH43).

Por motivo de algunas de estas condiciones se realizan las referencias circulares.Estos incumplimientos deben mirarse por separado, por lo que los mensajes de error deben aparecer por separado y por eso existe tantas macros en la hoja de calculo "Descanso"

Espero que ahora quede mas claro lo que estoy buscando, es un programa para controlar las horas de trabajo y descanso que se realizan por cada trabajador durante un mes.

He vuelto a enviar el archivo con los ejemplos.

Nuevamente Gracias.

H o l a:

Disculpa, pero ahora estoy más perdido. Creo que no respondiste a esto:

"

Explica con ejemplos, con datos, con celdas, con colores y con comentarios qué es lo que tienes, en esos ejemplos explica cuándo si cumple y cuándo no cumple los requisitos; si pudieras explicar varios ejemplos para que sea más claro

"

Lo importante en la explicación que pongas, tienes que poner ejemplos.

Envíame tu archivo con ejemplos, y dime qué esperas de resultados.

Si quieres, o más bien, en otra hoja, me explicas qué necesitas, pero con ejemplos. Ya que la hoja "Descanso" tiene demasiados errores y no puedo trabajar así, mejor te desarrollo lo que necesitas en una hoja sin errores y después lo adaptas a tu hoja "Descanso".

Recuerda poner en el asunto del correo tu nombre de usuario.

Sal u dos

¡Gracias!

Ya He enviado un archivo e intentando explicar todo.

solo me falto lo del userforM, como quitar una x de lo que coloca actualmente.

H o l a:

Te anexo el código para verificar las 3 condiciones:

Sub VerificarDescansos()
'Por.Dante Amor
    For i = 2 To 32
        cad = ""
        If VerificaPer(i, "B", "Y") <> 2 Then
            cad = "No hay 2 periodos en blanco" & vbCr
        End If
        If VerificaDia(i, "B", "Y") < 10 Then   'verificar 10 días
            cad = cad & "No hay un mínimo de 10 días" & vbCr
        End If
        If VerificaHor(i, "B", "Y") = False Then
            cad = cad & "No hay un mínimo de 6 horas"
        End If
        '
        If cad <> "" Then
            MsgBox "En la fila: " & i & vbCr & cad
        End If
    Next
End Sub
'
Function VerificaPer(i, ini, fin)
'Por.Dante Amor
    ant = "x"       'Cambiar a blanco para no contar la fila vacía
    For j = Columns(ini).Column To Columns(fin).Column
        If Cells(i, j) = "" And ant <> "" Then
            tot = tot + 1
        End If
        ant = Cells(i, j)
    Next
    VerificaPer = tot
End Function
'
Function VerificaDia(i, ini, fin)
'Por.Dante Amor
    VerificaDia = 24 - WorksheetFunction.CountA(Range(Cells(i, ini), Cells(i, fin)))
End Function
'
Function VerificaHor(i, ini, fin)
'Por.Dante Amor
    VerificaHor = False
    For j = Columns(ini).Column To Columns(fin).Column
        If Cells(i, j) = "" Then
            tot = tot + 1
            If tot > 5 Then
                VerificaHor = True
                Exit For
            End If
        Else
            tot = 0
        End If
    Next
End Function

He separado en 3 funciones cada una de las verificaciones, de esa forma puedes emplearlas como las necesites, solamente tienes que enviarles como parámetros la fila, la columna inicial y la columna final.


':)
':)
Respuesta

¿Podrás poner algún ejemplo?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas