Página 1 de 1

Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 22 Jan 2018 às 19:29
por Choicekiller
Caros, boa noite

Venho novamente, solicitar a ajuda de vocês “experts”, no sentido de elaborar uma macro.

Estou encontrando dificuldades em criá-la em meu projeto. Em anexo a Planilha, caso fique confuso.

Segue os cenários:
Em “A2” tenho a data da solicitação. Exemplo: 30/12/2017

Em “B2” tenho o horário da solicitação. Exemplo: 13:18

Em “C2” tenho a data da entrega. Exemplo 01/01/2018

Em "I2:I30" tenho a LISTA DE FERIADOS. Exemplo “I2” 01/01/2018, “I3” 25/01/2018 e etc...

Questões:
Questão 1, Se, “A2” for sábado, domingo ou feriado, em “E2” tenho que ajustar a data para o próximo dia útil. Exemplo 02/01/2018

Questão 2, Se, “B2” for maior que 13:00 horas, em “E2” tenho que ajustar a data para o próximo dia útil. Exemplo: 02/01/2018

Questão 3, Se, “E2” for <> “A2”, em “F2” tenho que ajustar da data de entrega. Exemplo 04/01/2018.

Questão 4, Quantos dias úteis tenho de “E2” (02/01/2018) até “F2”(04/01/2018)? Excluindo sábado, domingo e feriado(s). Em “G2” teria o resultado 3

Observação:
Caso não seja necessário os ajustes na células “E2” e “F2”, essas células receberá o valor principal.
Exemplo: “E2” = “A2” e “F2 = “C2”, assim também obtenho a quantidade de dias úteis.

Simplificando, minha dificuldade está em excluir os finais de semana e feridos nos ajustes, em meio tantos “Se” e “Se Não”. Procurei, porém, não conseguir encontrar nada parecido, que pudesse adaptar.

Desde já, agradeço a atenção de todos.

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 22 Jan 2018 às 21:56
por gfranco
Boa noite.
Se entendi bem seu propósito, não precisa de macro para essa tarefa.
Veja no anexo e dê retorno.
Pintei de amarelo onde fiz as fórmulas.

Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 23 Jan 2018 às 06:03
por JCabral
GFRANCO, acho que está a faltar a parte das horas.

Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 23 Jan 2018 às 08:57
por gfranco
Bom dia.
Bem observado JCabral.
Vou adicionar essa parte pois realmente esqueci-me dela na construção da fórmula.

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 23 Jan 2018 às 09:06
por gfranco
Bom dia.
Segue um novo modelo que contempla a condição horária que eu havia me esquecido.
Faça testes e dê retorno.

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 23 Jan 2018 às 23:38
por Choicekiller
Gfranco e Jcabral, boa noite.
Primeiramente quero agradecer a atenção de vocês!

Testei as formulas, o ajuste na data de solicitação, ficou perfeito :D .
Como não dei maiores detalhes no ajuste da data de Entrega, alguns cenários ficaram divergentes.
Inserir cenários na planilha, assim poderá usá-los em seus testes.

O Porquê da macro?
Vem da necessidade de incluir no Laço For... Next que já alimenta a planilha com os dados. Meu objetivo é automatizar os ajustes durante a exceção da macro que contém o laço.

Essa planilha trata-se de um controle, onde devo mensurar os pedidos solicitados dentro dos critérios.

Vamos aos critérios:
A data da Solicitação não poderá acontecer no sábado, domingo ou feriado e sempre até às 13:00 horas. A data da Entrega será 3 dias úteis, a partir da data da solicitação.

Se verdadeiro, a solicitação estará ok, então...
Os campos de ajustes ficarão com os valores principais.
Senão, necessito dos ajustes, então?
Neste ponto estou mergulhado na minha ignorância, por isso recorri a vocês.


No exemplo, a solicitação aconteceu no sábado, sendo assim, devo ajustá-la para o próximo dia útil (02/01/2018). Entretanto, o horário da solicitação “B2” só deverá ser avaliado, se a solicitação em “A2” ocorrer em dia útil, assim não tenho o problema do reajuste.

Exemplo: o primeiro ajuste aconteceria em razão do final de semana, e consequentemente pelo horário, resultando 03/01/2018.

Dia 04/01/2018 será a data da Entrega ajustada, que sempre ocorrerá em dias úteis.

Espero ter esclarecido.
Desde já agradeço

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 24 Jan 2018 às 07:07
por gfranco
Bom dia Choicekiller
Consegui entender o porque da necessidade em se trabalhar numa solução em VBA.
Se eu entendi direito toda sua explicação a macro deve se comportar da seguinte forma:

Olhar para a data da Solicitação...Se esta ocorreu em dia NÃO ÚTIL (sábado/domingo/feriado) OU se ocorreu em DIA ÚTIL , porém APÓS às 13 horas, deverá ser ajustada essa data de solicitação para o próximo dia útil.
Se houver necessidade de ajuste, e apenas se houver essa necessidade, então a data da entrega deverá também ser ajustada para 3 dias úteis APÓS a data da solicitação ajustada.

É isso mesmo?
Eu entendi completamente seu objetivo?

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 24 Jan 2018 às 08:36
por gfranco
Estou enviando a planilha com o código estruturado da maneira que eu entendi (conforme descrevi acima)
Faça testes e dê retorno.
Giovani.

Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 28 Jan 2018 às 20:13
por Choicekiller
GFRANCO, boa noite!

Obrigado pela elaboração da macro. :D
Fiz os testes, a data de solicitação ficou perfeita!

A data de Entrega apresentou algumas variações.
De acordo com meus cálculos manuais, inserir na coluna(9) a data prevista da Entrega, com base na data ajustada.

Calculo utilizado na coluna "I":
Data ajustada + 2 dias, exceto finais de semana e feriados.


Desde já, agradeço mais uma vez.

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 28 Jan 2018 às 23:23
por osvaldomp
Experimente na planilha do primeiro post.
Código: Selecionar todos
Sub ProgramaDatas()
 Dim dsa As Date, dea As Date, c As Range, du As Long, m As Long
  For Each c In Range("A2:A" & Cells(Rows.Count, 1).End(3).Row)
   dsa = c.Value
   If c.Offset(, 1).Value > TimeValue("13:00") Then dsa = dsa + 1
   Do Until Weekday(dsa, 2) < 6 And Application.CountIf([I:I], dsa) = 0
    dsa = dsa + 1
   Loop
   c.Offset(, 2).Value = c + 2: c.Offset(, 4).Value = dsa
   dea = dsa: du = 1: m = 1
   Do While du < 3
    If Weekday(dea + m, 2) < 6 And Application.CountIf([I:I], dea) = 0 Then
     du = du + 1
    Else: m = m + 1
    End If
   Loop
   c.Offset(, 5).Value = dea + m + du - 2
   c.Offset(, 6).Value = 3
  Next c
End Sub

Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 29 Jan 2018 às 19:21
por Choicekiller
Osvaldo, boa noite.
Obrigado pela sua atenção!

Fiz o teste conforme sugeriu, funcionou perfeitamente. :)

Aí, não poderia ser diferente, rsss... Inseri sua macro na planilha do último post e obtive os seguintes resultados:

Os intervalos "C2:C5' e "C12:C15" foram alterados durante a execução da macro, porém, a coluna C não poderá sofrer alterações.

As células "I2", "I10" e "I16" não exibiram os mesmos resultados do Cálculo manual (Previsto), da coluna 9.

Para facilitar a análise, gravei uma macro que restaura os valores da C e inseri antes da exceção das macros contidas na planilha.

Estou muito feliz pelos resultados, meu desejo complexo, somando a dificuldade em expô-lo em palavras, está se tornando realidade , graças a paciência e disposição de vocês (Gfranco e Osvaldomp).

Meus agradecimentos.

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 29 Jan 2018 às 22:40
por osvaldomp
Por favor substitua o trecho correspondente pelo trecho abaixo e faça novos testes.
Código: Selecionar todos
...
...
   dea = dsa: m = 1
   Do
    If Weekday(dea + du + m, 2) < 6 And Application.CountIf([H:H], dea + m) = 0 Then
     du = du + 1: If du = 2 Then Exit Do
    Else: m = m + 1
    End If
   Loop
   c.Offset(, 5).Value = dea + m + du - 1: du = 0
...
...

Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 30 Jan 2018 às 13:46
por Choicekiller
Osvaldo, boa tarde!

Fiz a substituição, a data de entrega ficou perfeita. :D

:arrow: Um trecho do código, continua alterando os valores da coluna "C", nos seguintes intervalos: "C2:C5" e "C12:C15"

desde já, agradeço!

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 30 Jan 2018 às 14:21
por osvaldomp
O código lança na coluna C ~~~> (data da coluna A) + (2 dias) ~~~> não isso que você quer?

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 30 Jan 2018 às 15:48
por Choicekiller
Osvaldo, boa tarde!

A coluna "F" (Data de Entrega Ajustada) = Coluna "E" (Data da Solicitação Ajustada) + 2 dias (exceto finais de semana e feriados).
No post anterior informei que já funciona perfeitamente, após edição aquele trecho, como sugeriu.

Os dados originais da solicitação estão nas colunas A, B e C.
Essa colunas permanecem inalteradas, pois elas justificarão a necessidade dos ajustes feitos na coluna "E" e consequentemente na coluna "F".

Espero ter esclarecido.
Obrigado

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 30 Jan 2018 às 16:03
por osvaldomp
Se entendi corretamente o código não deve inserir conteúdo na coluna C, é isso?

Se sim, remova do código a parte em vermelho da linha abaixo.
c.Offset(, 2).Value = c + 2: c.Offset(, 4).Value = dsa

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 30 Jan 2018 às 19:55
por Choicekiller
Osvaldo, boa tarde!
Primeiramente, obrigado pela ajuda e elaboração do código, tudo funcionando perfeitamente! :D

Tenho duas dúvidas, favor, pode me orientar?
Observação: São perguntas complementares, pois o objetivo deste Tópico, foi atendido com êxito. :D

Pergunta 1 - Digamos que futuramente, seja necessário mudar a quantidade de dias da coluna "F" (exemplo abaixo). Qual parte do código devo alterar?

De: A coluna "F" (Data de Entrega Ajustada) = Coluna "E" (Data da Solicitação Ajustada) + 2 dias (exceto finais de semana e feriados).

Para: A coluna "F" (Data de Entrega Ajustada) = Coluna "E" (Data da Solicitação Ajustada) + 3 dias (exceto finais de semana e feriados).

Pergunta 2 - O valor inserido na coluna "G" (Total de Dias Úteis), é um valor padrão estabelecido pelo código?
Se sim, havendo a mudança acima, esse valor não representará o Total de Dias Úteis.
É possível torná-lo dinâmico?

Desde já, agradeço!

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 30 Jan 2018 às 21:28
por osvaldomp
du ~~~> é a variável que controla a quantidade de dias úteis a ser acrescida à Data Solicitação Ajustada.
No comando abaixo a variável está limitada ao valor 2, então se (futuramente ... ;) ) você quiser alterar para 3, basta substituir o 2 pelo 3
du = du + 1: If du = 2 Then Exit Do
du = du + 1: If du = 3 Then Exit Do
Como opção para (futuramente ... ;) ) você não precisar mexer no código caso queira alterar a quantidade de dias úteis, você pode colocar o valor em uma célula, por exemplo em K2, e aí altere o comando para:
du = du + 1: If du = [K2] Then Exit Do

Quanto ao lançamento da quantidade total de dias úteis em G, este é feito pelo comando abaixo
c.Offset(, 6).Value = 3
Sim, o valor lançado 3 é constante. Você pode substituir o número 3 por du+1.
c.Offset(, 6).Value = du + 1 ~~~> funciona independente da opção que você adotar para o item anterior (alteração de du)
Esse valor 1 adicionado a du corresponde à Data Solicitação Ajustada que também é dia útil, conforme critério que você estabeleceu, ou seja, atualmente o período completo é formado por 3 dias úteis.

Embora só futuramente :P você vá fazer eventuais alterações, sugiro que você faça os testes de imediato, e retorne se precisar de algum ajuste :) :P

Re: Adicionar 1 dia, exceto Final de Semana e Feriado VBA

Enviado: 31 Jan 2018 às 00:33
por Choicekiller
Osvaldo, boa noite!

Obrigado pelos esclarecimentos e as informações. :D

Realizei os testes, segue os resultados:
du = du + 1: If du = [K2] Then Exit Do: Funcionou perfeitamente. ;)

c.Offset(, 6).Value = du + 1
: Retornou o valor 1

Obs.
Posso estar enganado, mas olhando o código, notei que na linha anterior o du é zerado ( :du = 0). Sendo assim, capturar o valor do primeiro "du" da linha anterior, seria a solução. Estou certo?

:?: Vou estudar um meio de fazer e poder testar!

Desde já, agradeço!