Notifications
Clear all

PLANTÃO QUINZENAL - RODÍZIO

12 Posts
2 Usuários
0 Reactions
3,711 Visualizações
(@canastra)
Posts: 10
Active Member
Topic starter
 

Pessoal, estou tentando criar uma planilha de rodízio quinzenal. São dias corridos, incluindo fim de semana e feriados.

Quando chegar no último, volta para o primeiro e assim sucessivamente.

Os nomes das pessoas eu coloquei nas linhas e datas inicial e final nas colunas.

Depois de muito bater cabeça, cheguei ao código abaixo, ainda incompleto. Imagino que seja necessário um loop de datas, que ainda não consigo fazer. Talvez um for next com if then ou select case.

Também não consegui colocar o "on error" em msgbox ;).

Alguém pode dar um help?!

Obrigado e desculpem os erros grosseiros, pois sou apenas curioso em VBA :mrgreen:

Sub PLANTAO()

Dim DATA_INICIAL As Date

Dim DATA_FINAL As Date

Range("b4:c9").ClearContents

On Error GoTo fim

DATA_INICIAL = InputBox("Digite a data inicial:", "Escala de Plantão")

Range("b4").Value = DATA_INICIAL
For i = ...

Next
fim:
Exit Sub

End Sub

 
Postado : 31/07/2015 1:59 pm
(@canastra)
Posts: 10
Active Member
Topic starter
 

Fiz alguns pequenos avanços:

1- consegui colocar o on error em msgbox

2 - já consegui fazer um loop. Só que as datas INICIAL e FINAL repetem o mesmo valor nas células seguintes

DATA INICIAL está B4 e DATA FINAL em C4

Cheguei até esse código:

	
Sub PLANTAO()

Dim DATA_INICIAL As Date

Dim DATA_FINAL As Date

Range("B4:Q37").ClearContents

On Error GoTo fim

DATA_INICIAL = InputBox("Digite a data inicial:", "Escala de Plantão")
DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)
    
    For X = 4 To 19
        
        Cells(X , 2) = DATA_INICIAL
        Cells(X, 3) = DATA_FINAL
 
    Next
Exit Sub
fim:

MsgBox ("Por favor, digite uma data válida!")

End Sub
	

Ajuda aí, meu povo! :D

 
Postado : 03/08/2015 6:29 pm
(@edcronos)
Posts: 1006
Noble Member
 

o ideal seria vc postar uma planilha de exemplo com alguns dados fictícios e demostrar oq vc quer
seguir a ideia por uma macro as vezes dá preguiça

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 03/08/2015 7:34 pm
(@canastra)
Posts: 10
Active Member
Topic starter
 

Segue o anexo.
Fiz apenas a primeira parte do loop que está repetindo os valores nas células seguintes. Acho que falta aí um array ou algo parecido...
Obrigado pela dica.

 
Postado : 03/08/2015 8:04 pm
(@edcronos)
Posts: 1006
Noble Member
 

tá, mas oq é para fazer com os nomes ?
vc não colocou um exemplo de como é para ficar

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 03/08/2015 8:06 pm
(@canastra)
Posts: 10
Active Member
Topic starter
 

Desculpe se não me fiz entender.

Os nomes seriam os colaboradores que ficam de plantão a cada 15 dias. Eu preenchi manualmente para se ter uma ideia de como ficaria. Segue o anexo.

A particularidade em relação ao nomes seria automatizar a planilha sempre que alguém fosse incluído (no início, meio ou fim da lista), ajustando as datas de plantão dos demais, sempre em rodízio de 15 dias corridos.

Sem querer abusar da boa vontade, ainda teria que excluir do rodízio o período de 20/12/yyyy a 06/01/yyyy, porque esse período seria outra escala :oops:

Assim, ao chegar em 19/12 pularia para 07/01 do ano seguinte e voltara a rodar os 15 dias

Obrigado pela força! :)

 
Postado : 04/08/2015 5:58 am
(@edcronos)
Posts: 1006
Noble Member
 

e pq não fazer por formula?

na data inicial a partir do segundo nome
=SE(E(MÊS(C4)=12;DIA(C4)>19);"07/01/" & ANO(C4)+1;C4 +1)
arraste para baixo
sem ajuste de fim de ano seria =C4 +1

na data final de plantao a partir do primeiro nome
=SE(E(MÊS(B4)=12;DIA(B4)>19);"07/01/" & ANO(B4)+1;B4 +14)
arraste para baixo
sem ajuste de fim de ano seria =B4 +14

na data inicial do primeiro nome se coloca a data que vai iniciar o plantão manualmente
não sou muito bom de formulas e talvez precise de ajuste para o caso de

mas e caso um plantão comece antes que acabe o ano, no caso fique o plantão termine no proximo ano?

se não servir por formula depois eu implemento a macro

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 04/08/2015 6:51 am
(@edcronos)
Posts: 1006
Noble Member
 

com macros acho que oq vc quer é algo como

Sub PLANTAO()

    Dim DATA_INICIAL As Date, DATA_FINAL As Date
L = 4 '------ Linha de inicio
    Range("B4:Q37").ClearContents

    On Error GoTo fim

    DATA_INICIAL = InputBox("Digite a data inicial:", "Escala de Plantão")
    Cells(L, 2) = DATA_INICIAL
    DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)
    Cells(L, 3) = DATA_FINAL

    For n = 1 To 13
        DATA_INICIAL = DateAdd("d", 1, DATA_FINAL)
        Cells(L + n, 2) = DATA_INICIAL
        DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)
        Cells(L + n, 3) = DATA_FINAL
    Next
    Exit Sub
fim:
    MsgBox ("Por favor, digite uma data válida!"), vbOKOnly, "Atenção"


End Sub

não implementei o fim de ano pq não sei oq é para fazer no caso de alguem pegar fração de escala

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 04/08/2015 7:17 am
(@canastra)
Posts: 10
Active Member
Topic starter
 

Ficou show de bola, Edcronos. Era isso mesmo. Parabéns!

No caso do fim de ano, é o seguinte: são os mesmos 15 dias corridos, excluindo o período de #20/12/yyyy# a 06/01/yyyy#

Caso a pessoa comece dia 16/12/2015, ela vai até 19/12/2015, salta para 07/01/2016 até completar os 15 dias dela (17/01/2016). A partir daí, a escala segue normal

Aí, continua normal o rodízio de 15 dias.

Se pudesse adicionar essa regra eu ficaria imensamente agradecido.

Obrigado pela ajuda

 
Postado : 04/08/2015 1:00 pm
(@edcronos)
Posts: 1006
Noble Member
 

tinha até esquecido

Sub PLANTAO()

    Dim DATA_INICIAL As Date, DATA_FINAL As Date
    L = 4    '------ Linha de inicio
    Range("B4:Q37").ClearContents

    On Error GoTo fim

    DATA_INICIAL = InputBox("Digite a data inicial:", "Escala de Plantão")
    Cells(L, 2) = DATA_INICIAL
    DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)
    Cells(L, 3) = DATA_FINAL

    For n = 1 To 13
        DATA_INICIAL = DateAdd("d", 1, DATA_FINAL)
        If Month(DATA_INICIAL) = 12 And Day(DATA_INICIAL) > 19 Then
            DATA_INICIAL = DateValue("06/01/" & Year(DATA_INICIAL) + 1)
        End If
        Cells(L + n, 2) = DATA_INICIAL
        
        
        DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)
        
        If Month(DATA_FINAL) = 12 And Day(DATA_FINAL) > 19 Then
            dd = DateDiff("d", DATA_INICIAL, DateValue("19/12/" & Year(DATA_INICIAL)))
            DATA_FINAL = DateAdd("d", (15 - dd), DateValue("07/01/" & Year(DATA_INICIAL) + 1))
        End If
        Cells(L + n, 3) = DATA_FINAL

    Next
    Exit Sub
fim:
    MsgBox ("Por favor, digite uma data válida!"), vbOKOnly, "Atenção"
End Sub

para ajustar alguma diferença de dias do fim de ano mexa nas datas dessas linhas onde tem a cor vermelha
dd = DateDiff("d", DATA_INICIAL, DateValue("19/12/" & Year(DATA_INICIAL)))
DATA_FINAL = DateAdd("d", (15 - dd), DateValue("07/01/" & Year(DATA_INICIAL) + 1))

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 05/08/2015 6:46 am
(@edcronos)
Posts: 1006
Noble Member
 

Acho qwue consegui ajustar "sou péssimo em matemática"

Sub PLANTAO()

    Dim DATA_INICIAL As Date, DATA_FINAL As Date
    L = 4    '------ Linha de inicio
    Range("B4:Q37").ClearContents

    On Error GoTo fim

    DATA_INICIAL = InputBox("Digite a data inicial:", "Escala de Plantão")
    Cells(L, 2) = DATA_INICIAL
    DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)
    If Month(DATA_FINAL) = 12 And Day(DATA_FINAL) > 19 Then
        dd = DateDiff("d", DATA_INICIAL, DateValue("19/12/" & Year(DATA_INICIAL)))
        DATA_FINAL = DateAdd("d", (14 - dd), DateValue("06/01/" & Year(DATA_INICIAL) + 1))
    End If
    Cells(L, 3) = DATA_FINAL

    For n = 1 To 13
        DATA_INICIAL = DateAdd("d", 1, DATA_FINAL)
        If Month(DATA_INICIAL) = 12 And Day(DATA_INICIAL) > 19 Then
            DATA_INICIAL = DateValue("06/01/" & Year(DATA_INICIAL) + 1)
        End If
        Cells(L + n, 2) = DATA_INICIAL


        DATA_FINAL = DateAdd("d", 14, DATA_INICIAL)

    If Month(DATA_FINAL) = 12 And Day(DATA_FINAL) > 19 Then
        dd = DateDiff("d", DATA_INICIAL, DateValue("19/12/" & Year(DATA_INICIAL)))
        DATA_FINAL = DateAdd("d", (14 - dd), DateValue("06/01/" & Year(DATA_INICIAL) + 1))
    End If
        Cells(L + n, 3) = DATA_FINAL
    Next
    Exit Sub
fim:
    MsgBox ("Por favor, digite uma data válida!"), vbOKOnly, "Atenção"


End Sub

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 05/08/2015 7:09 am
(@canastra)
Posts: 10
Active Member
Topic starter
 

Excelente! Resolveu o problema e ainda aprendi bastante coisa.
Obrigado e parabéns pelo trabalho.

 
Postado : 05/08/2015 10:13 am