Visual Basic para Aplicaciones - rol de turnos

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 21
Ha aumentado su posición en 2 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por mauricio (8 intervenciones) el 20/07/2020 17:19:08
Buen dia

Mi tema es el siguiente:
Tengo un rol de turnos en el rango de las cuatro semanas
que comienza del lunes de la primera hasta terminar en domningo
de la ultima semana.(Tomando en cuenta la primera fila como ejemplo)
En cada celda existe una formula, que calcula el turno seleccionado
el apartado turno en color azul.Si se cambia de turno en cualquiera
de los parametros(sem1,sem2,sem3,sem4),en automatico se cambiara en la tabla general.
El apartado Descanso que esta en la columna "D",se puede elegir el dia de descanso
y cuando se elija se reflejara en la tabla general con la letra "D".

El detalle esta eske cuando relleno alguna celda de la tabla general manualmente, como es obvio se elimina la formula
y al intentar cambiar el dia de descanso en la celda editada manualmente,no realiza el cambio.("D")

Si me pudieran apoyar a resolver este dilema.

les agradezco.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 8
Ha disminuido su posición en 9 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por joel (1 intervención) el 20/07/2020 19:01:06
estaria bien que mostraras tu código, o adjuntaras el archivo de excel... sin verlo, la verdad no se porque no te funciona!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 2 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por mauricio (8 intervenciones) el 21/07/2020 17:43:31
Pero es necesario que tenga la posibilidad de cambiar los datos de forma manual.


Si se proteje no tendra esa posibilidad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por Antoni Masana (498 intervenciones) el 21/07/2020 21:33:11
O pones formula o lo modificas de forma manual.

Esto es lo que se hace en Excel, lo que quieres hacer no se si es posible ni si es muy ortodoxo, tampoco estoy seguro que esta sea la palabra más adecuada.

Entiendo que lo que deseas es una macro que al salir de una celda de un rango de datos determinado si la celda esta vacía y no tiene fórmula se la ponga, la que le corresponda.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 2 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por mauricio (8 intervenciones) el 21/07/2020 21:38:39
se me ocurre algo asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Range("D6") = "lun" Then
 
Range("I6").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(AND(RC[-4]=1,R5C10=RC[-5]),RC[-4],IF(R5C9=RC[-5],""D"",IF(AND(RC[-4]=2,R5C10=RC[-5]),RC[-4],IF(AND(RC[-4]=3,R5C10=RC[-5]),RC[-4],RC[-4]))))"
 
  Range("P6").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(R5C16=RC[-12],""D"",IF(R5C17=RC[-12],RC[-10],IF(R5C15=RC[-12],RC[-10],RC[-10])))"
 
Range("W6").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(R5C23=RC[-19],""D"",IF(R5C24=RC[-19],RC[-16],IF(R5C22=RC[-19],RC[-16],RC[-16])))"
 
 Range("AD6").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(R5C30=RC[-26],""D"",IF(R5C31=RC[-26],RC[-22],IF(R5C29=RC[-26],RC[-22],RC[-22])))"


AGREDEZCO EL AOPOYO



como meteria este codigo en un for para ir recorriendo las filas,alguna idea amigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por Antoni Masana (498 intervenciones) el 21/07/2020 22:52:55
Es un trabajo muy entretenido.

Para a que entiendas lo que tienes que hacer en la macro te tengo que explica varias cosas:

Las macros las escribes y las ves asi en el libro: (Estas macros son las de la columna I a la M desde la fila 4.

1
2
3
4
5
I - =SI(Y(E6=1;$J$5=D6);E6;SI($I$5=D6;"D";SI(Y(E6=2;$J$5=D6);E6;SI(Y(E6=3;$J$5=D6);E6;E6))))
J - =SI($J$5=D6;"D";SI(Y(D6<>$I$5;D6=$K$5);E6;SI(Y($I$5=D6;$K$5<>D6);E6;E6)))
K - =SI($K$5=D6;"D";SI(Y(E6=1;$J$5=D6);F6;SI($I$5=D6;E6;SI(Y(E6=2;$J$5=D6);F6;SI(Y(E6=3;$J$5=D6);F6;SI(Y($J$5=D6;$I$5<>D6);F6;E6))))))
L - =SI($L$5=D6;"D";SI($M$5=D6;E6;SI($K$5=D6;F6;SI(Y($M$5<>D6;$I$5=D6);E6;SI($N$5=D6;E6;SI($O$5=D6;E6;F6))))))
M - =SI($M$5=D6;"D";SI(Y($L$5=D6;$N$5=D6);E6;SI(Y($L$5<>D6;$N$5=D6);E6;SI(Y($L$5=D6;$K$5<>D6);F6;SI(Y($K$5<>D6;$J$5<>D6;$O$5<>D6);E6;SI($O$5=D6;E6;F6))))))

Pero excel las ve asi y para él las de una columna son todas iguales:

1
2
3
4
5
I - =SI(Y(FC[-4]=1;F5C10=FC[-5]);FC[-4];SI(F5C9=FC[-5];"D";SI(Y(FC[-4]=2;F5C10=FC[-5]);FC[-4];SI(Y(FC[-4]=3;F5C10=FC[-5]);FC[-4];FC[-4]))))
J - =SI(F5C10=FC[-6];"D";SI(Y(FC[-6]<>F5C9;FC[-6]=F5C11);FC[-5];SI(Y(F5C9=FC[-6];F5C11<>FC[-6]);FC[-5];FC[-5])))
K - =SI(F5C11=FC[-7];"D";SI(Y(FC[-6]=1;F5C10=FC[-7]);FC[-5];SI(F5C9=FC[-7];FC[-6];SI(Y(FC[-6]=2;F5C10=FC[-7]);FC[-5];SI(Y(FC[-6]=3;F5C10=FC[-7]);FC[-5];SI(Y(F5C10=FC[-7];F5C9<>FC[-7]);FC[-5];FC[-6]))))))
L - =SI(F5C12=FC[-8];"D";SI(F5C13=FC[-8];FC[-7];SI(F5C11=FC[-8];FC[-6];SI(Y(F5C13<>FC[-8];F5C9=FC[-8]);FC[-7];SI(F5C14=FC[-8];FC[-7];SI(F5C15=FC[-8];FC[-7];FC[-6]))))))
M - =SI(F5C13=FC[-9];"D";SI(Y(F5C12=FC[-9];F5C14=FC[-9]);FC[-8];SI(Y(F5C12<>FC[-9];F5C14=FC[-9]);FC[-8];SI(Y(F5C12=FC[-9];F5C11<>FC[-9]);FC[-7];SI(Y(F5C11<>FC[-9];F5C10<>FC[-9];F5C15<>FC[-9]);FC[-8];SI(F5C15=FC[-9];FC[-8];FC[-7]))))))

Para verlas de esta segunda forma hay que ir a la pestaña Archivo - Opciones - Formulas y marcar Estilo referencia F1C1

Ahora que mas o menos entiendes esto, desde una macro las fórmulas se escriben en este segundo formato.

La macro que necesitas es esta pero debes completarla tu mismo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Fil As Integer, Col As Integer
 
    Fil = Target.Row
    Col = Target.Column
 
    If Fil > 4 And Fil <= 305 And Col >= 9 And Col <= 36 Then
        If Len(Target.Text) = 0 Then
            Range(Target.Address).Select
 
            If Fil = 4 Then ActiveCell.FormulaR1C1 = "=SI(F2C16+F[-1]C<=F2C20;TEXTO(F2C16+F[-1]C;""DD"");"""")"
            If Fil = 5 Then ActiveCell.FormulaR1C1 = "=SI(F2C16+F[-2]C<=F2C20;TEXTO(F2C16+F[-2]C;""ddd"");"""")"
 
            If Col = 09 Then ActiveCellFormulaR1c1 = "=SI(Y(FC[-4]=1;F5C10=FC[-5]);FC[-4];SI(F5C9=FC[-5];""D"";SI(Y(FC[-4]=2;F5C10=FC[-5]);FC[-4];SI(Y(FC[-4]=3;F5C10=FC[-5]);FC[-4];FC[-4]))))"
            If Col = 10 Then ActiveCellFormulaR1c1 = "=SI(F5C10=FC[-6];""D"";SI(Y(FC[-6]<>F5C9;FC[-6]=F5C11);FC[-5];SI(Y(F5C9=FC[-6];F5C11<>FC[-6]);FC[-5];FC[-5])))"
            If Col = 11 Then ActiveCellFormulaR1c1 = "=SI(F5C11=FC[-7];""D"";SI(Y(FC[-6]=1;F5C10=FC[-7]);FC[-5];SI(F5C9=FC[-7];FC[-6];SI(Y(FC[-6]=2;F5C10=FC[-7]);FC[-5];SI(Y(FC[-6]=3;F5C10=FC[-7]);FC[-5];SI(Y(F5C10=FC[-7];F5C9<>FC[-7]);FC[-5];FC[-6]))))))"
            If Col = 12 Then ActiveCellFormulaR1c1 = "=SI(F5C12=FC[-8];""D"";SI(F5C13=FC[-8];FC[-7];SI(F5C11=FC[-8];FC[-6];SI(Y(F5C13<>FC[-8];F5C9=FC[-8]);FC[-7];SI(F5C14=FC[-8];FC[-7];SI(F5C15=FC[-8];FC[-7];FC[-6]))))))"
            If Col = 13 Then ActiveCellFormulaR1c1 = "=SI(F5C13=FC[-9];""D"";SI(Y(F5C12=FC[-9];F5C14=FC[-9]);FC[-8];SI(Y(F5C12<>FC[-9];F5C14=FC[-9]);FC[-8];SI(Y(F5C12=FC[-9];F5C11<>FC[-9]);FC[-7];SI(Y(F5C11<>FC[-9];F5C10<>FC[-9];F5C15<>FC[-9]);FC[-8];SI(F5C15=FC[-9];FC[-8];FC[-7]))))))"
            (etc)
        End If
    End If
 
    If Target.Row > 6 And Target.Row <= 305 And Target.Column >= 38 And Target.Column <= 49 Then
        Range(Target.Address).Select
 
        If Col = 38 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-29]:FC[-2];DATOS!F8C14)*(DATOS!F8C18+DATOS!F8C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F9C14)*(DATOS!F9C18+DATOS!F9C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F10C14)*(DATOS!F10C18+DATOS!F10C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F11C14)*(DATOS!F11C18+DATOS!F11C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F12C14)*(DATOS!F12C18+DATOS!F12C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F13C14)*(DATOS!F13C18+DATOS!F13C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F14C14)*(DATOS!F14C18+DATOS!F14C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F15C14)*(DATOS!F15C18+DATOS!F15C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F16C14)*(DATOS!F16C18+DATOS!F16C19/60)+" & _
                                                  "CONTAR.SI(FC[-29]:FC[-2];DATOS!F7C14)*(DATOS!F17C18+DATOS!F17C19/60)"
 
        If Col = 40 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-30]:FC[-3];1)"
        If Col = 41 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-31]:FC[-4];2)"
        If Col = 42 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-32]:FC[-5];3)"
        If Col = 43 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-34]:FC[-7];5)"
        If Col = 44 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-35]:FC[-8];6)"
        If Col = 45 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-36]:FC[-9];7)"
        If Col = 46 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-37]:FC[-10];8)"
        If Col = 47 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-38]:FC[-11];9)"
        If Col = 48 Then ActiveCellFormulaR1c1 = "=CONTAR.SI(FC[-39]:FC[-12];10)"
        If Col = 49 Then ActiveCellFormulaR1c1 = "=SUMA(FC[-10]:FC[-1])&"" Dias"""
    End If
End Sub

Del primer bloque debes completar las formulas, es un copiar y pegar.
Si dentro de la formula hay comillas hay que ponerlas dobles

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 2 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

rol de turnos

Publicado por mauricio (8 intervenciones) el 22/07/2020 00:38:08
muchas gracias

Gracias por intentar apoyarme le agradezco demasiado

Les agradezco el apoyo,como comento soy nuevo en esto de las macros,

le comento el tema resumido

la funcion esta asi:

.en la columna "D": Se colocara el dia de descanso correspondiente al trabajador de esa fila.
.En el la celda (e6)se coloca el turno y en los demas campos ya nose coloca nada, ya que al
generar el rol con el boton(GENERAL ROL), se llena en automatico(sem2,sem3,sem4),el autorelleno ya esta definido,
ejemplo(cuando E6 sea igual a 1 entonces,rellenar en forma desendente y asi con cada numero que se ingrese,por ejemplo si se ingresara el 2,seria (2,1,3,2)).
y asi con las demas filas,pero hasta el momento lo tengo hasta la fila 3 como ejemplo.

todo mi, "formulerío" es administrado por lo que contienes en el rango de columnas D : H.
.como consiguiente:
las celdas que se encuentren antes de la primera "D", corresponden a sem1(E6),cuando se encuemtre la segunda "D",las celdas posteriores corresponderan a sem2(F6)
y asi sucecivamente.si en dado caso que en la primera semana(semana1), no exista ningun turno antes de la primera "D", entonces las celdas siguientes tomaran el valor de sem1(E6), y cuando se encuemtre la segunda "D",las celdas posteriores corresponderan a sem2(F6) y asi sucecivamente

despues de generar el rol, se puede modificar el rango D:H con valores diferentes y en la tabla general debe cambiar.en automatico.

el tema es que: depues de haber ejecutado el boton (GENERAL ROL),de ahi,cuando ingreso un valor manual en cualquier celda de la fila en cuestion,se elimina la formula, y cuando intento cambiar el dia de descanso en (D6) y resulta que el dia de descanso(seleccionado en D6) corresponde a la celda editada, no ejecuta la formula, por que se elimino al ingresar el dato manual.todo esto es depues de ejecutar el boton "GENERAL ROL"



no se si me explique bien.
eske lo veo algo complejo.

les envio el ejemplo.

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar