Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
#70359
Pessoal, Tenho uma tabela que é atualizada a cada 10 min. Gostaria que ao atualizar e o valor de uma celula mudasse, ele criaria um registro da data/hora e o novo status (texto) da celula alterada.

Em anexo está a tabela com as informações certinha.
Você não está autorizado a ver ou baixar esse anexo.
Editado pela última vez por AndreSpecker em 22 Abr 2022 às 21:57, em um total de 3 vezes.
#70364
Experimente:
Código: Selecionar todos
Sub InsereDataHora()
 Dim lote As Range, LR As Long
  With Sheets("Consulta")
   Set lote = .Range("D4:D" & .Cells(Rows.Count, 4).End(3).Row).Find(Sheets("RegistroLote").[B1])
   If Not lote Is Nothing Then
    LR = Sheets("RegistroLote").Cells(Rows.Count, 4).End(3).Row + 1
    If Sheets("RegistroLote").Cells(LR, 5) = lote.Offset(, 2).Value Then
     Sheets("RegistroLote").Cells(LR, 4) = Now
    End If
   End If
  End With
 End Sub
#
Coloque a chamada do código acima na Macro1, conforme abaixo.
Código: Selecionar todos
Sub Macro1()
 ActiveWorkbook.RefreshAll
 InsereDataHora
End Sub
#70385
AndreSpecker escreveu: 21 Abr 2022 às 16:41 ...tenho que deixar a coluna "E" do RegistroLote já com os valores?
Sim, conforme está na planilha que você disponibilizou e conforme o seu comentário (O STATUS SEGUE ESSE PADRÃO FIXO DE SEQUENCIA QUE ESTÁ AQUI AO LADO, CASO SEJA MELHOR COM VALOR FIXO).

funcionamento - ao rodar o código que passei, será buscado o status atual do LOTE 157186 na planilha Consulta, que é PRÉ-TINTURARIA.

Em seguida o código irá buscar a primeira linha vazia na coluna D da planilha RegistroLote e irá inserir data/hora na coluna D somente se na linha correspondente o status for igual . Fiz dessa forma considerando que a sequência do status irá seguir a lista que está na planilha.

No seu exemplo, limpe RegistroLote!D8 e rode o código.

Se você quiser que a data/hora sobreponha a existente, se houver, então retorne para ajustes no código.

Lembrando que ara efeitos de testes o código pode ser executado diretamente, independente da Macro1.
#70391
O código foi escrito com base nesta sua afirmação que "O STATUS SEGUE ESSE PADRÃO FIXO DE SEQUENCIA".

No vídeo, o LOTE que você está colando possui o status PÓS TING. RAMA, no entanto esse status não obedece a sequência da sua lista, pois o status que corresponde à célula na qual você está colocando o LOTE é PROGRAMAÇÃO, por isso o código não insere a data/hora. E da forma que você está fazendo também não bate com a sua condição que " SE O VALOR STATUS FOR ALTERADO", pois se a data/hora que corresponde a certo status já estiver preenchida, então isso significa que não houve mudança de status.

Preencha D10 com qualquer valor e faça a colagem que você mostra no vídeo, aí sim o código irá funcionar.

Se não for dessa forma que você quer, então explique com exatidão e com exemplos, indicando nome da planilha e endereço de célula.
#70392
Perdão, expliquei de forma errada então, vamos lá...

Minha tabela é atualizada a cada 15 minutos, toda vez que ela atualiza, a coluna "F" STATUS muda o nome do texto, eu gostaria que na aba "RegistroLote" ao colocar o numero do lote no "B1" ela buscasse no mesmo valor da coluna "E" STATUS e colocasse a data/hora em que a celula da tabela "Consulta" foi alterada.

Ex.:
Suponhamos que eu coloquei para "acompanhar" o lote 156925 lá na B1, e as 14:15 ela atualizou/mudou o valor (na celula F7) de PÓS TING. RAMA para PÓS TING. TUB SEC então lá na aba "RegistroLote" ele iria verificar na coluna "E" o mesmo nome PÓS TING. TUB SEC e colocar ao lado a data/horario, que no caso seria 21/04 14:15
#70398
Experimente este abaixo no lugar do anterior.
Código: Selecionar todos
Sub InsereDataHoraV2()
 Dim loteO As Range, loteD As Range
   Set loteO = Sheets("Consulta").Range("D4:D" & Sheets("Consulta").Cells(Rows.Count, 4).End(3).Row).Find(Sheets("RegistroLote").[B1])
   If Not loteO Is Nothing Then
    Set loteD = Sheets("RegistroLote").Range("E2:E" & Sheets("RegistroLote").Cells(Rows.Count, 5).End(3).Row).Find(loteO.Offset(, 2).Value)
    If Not loteD Is Nothing Then loteD.Offset(, -1) = Now
   End If
 End Sub
#70400
Só um pequeno detalhe, teria como ele manter a data/hora da ultima atualização até o Status alterar? Pois a cada atualização ele está sobrescrevendo com data/hora que a macro foi executada, ou seja

Se atualizou e mudou o Status ele insere a data/hora da mudança.
Se atualizou e não mudou o Status, fica a mesma data/hora
#70408
E como o código irá saber se o status mudou ?
#70409
O código que vc fez já está fazendo isso, não? Só teria que por (acredito eu) um "IF" para que SE a célula já contem uma data (não vazia), ele não sobrescreve, inserindo a data apenas se a celula estiver em branco.

Por exemplo na imagem, as 16:29 ele atualizou e inseriu a data/hora, a próxima atualização seria as 16:39, então se o Status continuasse o mesmo "TINGIMENTO", ele não sobrescreveria novamente a célula com a data/hora.

Imagem
#70410
AndreSpecker escreveu: 22 Abr 2022 às 16:40 Por exemplo na imagem, as 16:29 ele atualizou e inseriu a data/hora, a próxima atualização seria as 16:39, então se o Status continuasse o mesmo "TINGIMENTO", ele não sobrescreveria novamente a célula com a data/hora.
É exatamente assim que o primeiro código que passei trabalha. ;)

Primeiramente o código irá ler o LOTE em RegistroLote!B1, que é o ponto de partida.
Em seguida irá procurar esse LOTE em Consulta!D:D.
Ao encontrar o LOTE irá verificar o status correspondente em Consulta!E:E.

De volta em RegistroLote, irá buscar a primeira célula vazia abaixo dos dados na coluna D, onde existem datas/horas, e irá verificar se o status à direta dessa célula vazia bate com o status detectado em Consulta!E:E.
Se o status bate então insere data/hora.

Essa sequência que o código faz garante que será inserida data/hora somente após a mudança de status, obedecendo à sequência que você colocou na planilha, e não ocorrerá sobreposição de data/hora.
____________________________________________________________________________________________________

Faça os testes aí.
Nesse último exemplo que você postou a imagem, mantenha o LOTE em B1 e mantenha o status em Consulta. Rode o primeiro código quantas vezes quiser. O código não irá efetuar qualquer ação, pois não houve mudança de status.

Em seguida altere manualmente o status em Consulta para PÓS TING. TUB MOL, correspondente ao LOTE de B1 . Rode o código. Agora será lançada data/hora à esquerda de PÓS TING. TUB MOL pois houve mudança de status. Rode o código quantas vezes quiser, a data/hora não será alterada.

Agora novamente altere o status manualmente em Consulta para PÓS TING. RAMA, rode o código e veja o resultado.

Resumo, o primeiro código que passei irá lançar data/hora, obedecendo a sua sequência dos status, somente após a mudança do status.
#70411
Executei aqui agora, o Status continuou o mesmo porem ele atualizou a data/hora.
No gif, após 10 seg. ele demora um pouquinho pra carregar (só pra não achar que terminou sem sentido ;) ).

Obs.: Quando há mudança de Status ele funciona perfeitamente, ele pula a linha e insere no lugar correto
Imagem
#70412
Você está testando com o primeiro código?

O primeiro código é o que está no post #70364.
#70413
Nossa mill perdões, eu li sua mensagem 3 vezes e não percebi que vc tinha escrito É exatamente assim que o primeiro código que passei trabalha. ;)

Realmente o primeiro codigo funcionou, da primeira vez não foi pq no caso o codigo vai buscando etapa por etapa, e na ocasião quando houve a atualização ela já tinha puxado os dados com duas etapas já avançadas, por isso não inseriu a data.

No caso só vai inserir corretamente a data se o lote começar estando com PROGRAMAÇÃO, nao consigo "registrar" com um que já esta com etapas avançadas, mas é tranquilo, ai eu coloco valores fictícios na data para corrigir.

Mas perfeito então, vou colocar para atualizar com menos tempo, para dar tempo de puxar os dados corretamente

Muito Obrigado :D e perdão a burrice hehe
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord