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.
Por afelizardo
Posts
#33469
Boa tarde,

Preciso da vossa ajuda. Tenho uma excel em que tem uma formula simples, SE(PROCV($A2;Folha2!$A:$C;3;0)=B$1;HOJE();"").
Quando a formula sair para Verdadeiro, eu gostaria que ele me fixa-se a data, na medida que a Sheet BaseDados irá ser substituída. O Objectivo é registar a data de alteração de Status.

Penso que a melhor forma era passar a formula para valores. Se fizer um Filtro para tudo o que seja diferente de zero copiar e colar para valores o excel dá erro.

Encontrei uma macro no Forúm mas está me a dar erro. Podem me ajudar?

Em anexo coloco o excel.
Você não está autorizado a ver ou baixar esse anexo.
Por mprudencio
Posts
#33472
Cole este codigo na planilha

A macro coloca a data na coluna A sempre que alterar a coluna B

Faça as devidas alterações.

2 é o numero da coluna que vai acionar a macro no caso B

A 1, B 2, C 3 e por ai vai.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub

If Range("B" & Target.Row).Value <> "" Then
Range("A" & Target.Row).Value = Date ' troque A pela letra da coluna que vai receber a data.

End If

End Sub
Por afelizardo
Posts
#33474
Está a dar erro a macro, pode por favor consultar o ficheiro.

eu vou todos os dias vou substituir a Basedados e os Status de Cada PA poderá alterar, sempre que alterar eu quero que registe a data.
Você não está autorizado a ver ou baixar esse anexo.
Por osvaldomp
#33475
Experimente:
Instale o código abaixo no módulo da planilha BaseDados, assim:
1. copie o código daqui
2. clique com o direito na guia daquela planilha e escolha 'Exibir código'
3. cole o código na janela em branco que vai se abrir
4. feito! 'Alt+Q' para retornar para a planilha e testar
Código: Selecionar todos
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim n As Long
 If Target.Count > 1 Then Exit Sub
 If Target.Column <> 3 Or Target.Value <> "Entrada" Then Exit Sub
 n = Sheets("Controlo de Status").[A:A].Find(Target.Offset(, -2).Value).Row
 Sheets("Controlo de Status").Cells(n, 2) = Date
End Sub
funcionamento - ao inserir o termo Entrada na coluna C da planilha BaseDados o código irá colocar a data do dia na coluna B da planilha Controlo de Status na linha correspondente ao PA que teve seu estatus alterado.
Por afelizardo
Posts
#33489
Muito Obrigada. :D Para fazer para os outros Status como faço? tentei colocar igual, alterando o nome do Status e a coluna, mas está me a dar erro. Como devo fazer?
Por osvaldomp
#33495
afelizardo escreveu:Muito Obrigada. :D
Você recebeu duas sugestões. A qual delas você se refere ?

Para fazer para os outros Status como faço?
Quais outros estatus ?

tentei colocar igual, alterando o nome do Status e a coluna, mas está me a dar erro. Como devo fazer?
Tentou colocar igual onde ? Alterou o estatus de qual nome para qual nome ? Em qual coluna ?
Disponibilize nova amostra do seu arquivo com as necessárias explicações para essas novas demandas.
Por afelizardo
Posts
#33506
Optei pela última opção. Na coluna C na Sheet "BaseDados", Tenho diversos Estados/Status (Entrada, Em Diagnóstico,...). Na Sheet "Controlo de Status", Coloquei em coluna os diferentes Estados que cada PA pode ter.
De acordo com a Código que me disponibilizou, ele quando encontra Entrada, ele coloca a data. Eu gostaria que fizesse o mesmo para os outros Estados "Com Orçamento", "Em Diagnóstico" (..).

Tentei repetir, mas dá me erro:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n As Long
If Target.Count > 1 Then Exit Sub
If Target.Column <> 3 Or Target.Value <> "Entrada" Then Exit Sub
n = Sheets("Controlo de Status").[A:A].Find(Target.Offset(, -2).Value).Row
Sheets("Controlo de Status").Cells(n, 2) = Date
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n As Long
If Target.Count > 1 Then Exit Sub
If Target.Column <> 3 Or Target.Value <> "Com Orçamento" Then Exit Sub
n = Sheets("Controlo de Status").[A:A].Find(Target.Offset(, -2).Value).Row
Sheets("Controlo de Status").Cells(n, 3) = Date
End Sub

(...)

Entretanto, se o Estado mantiver, eu não queria que ele alterasse a data. Acontece que eu todos os dias eu vou substituir a BaseDados, exemplo: Hoje o PA 10438 tem estado Entregue, amanhã quando actualizar a BaseDados, pode-se manter Entregue, no entanto, como actualizei, ele altera a data. O que eu pretendia era que se não existe alteração do Estado, então mantém a data anterior.

Pode ajudar?
Por osvaldomp
#33522
afelizardo escreveu:Acontece que eu todos os dias eu vou substituir a BaseDados, exemplo: Hoje o PA 10438 tem estado Entregue, amanhã quando actualizar a BaseDados, pode-se manter Entregue, ... O que eu pretendia era que se não existe alteração do Estado, então mantém a data anterior.
Entendi. Então o código que passei não serve, precisamos de outro caminho.

Dúvidas:
1. no seu exemplo, na coluna A da planilha Controlo de Status há 22 números de PAs, que são iguais aos primeiros 22 números da coluna A da planilha BaseDados. Essa igualdade sempre irá ocorrer ao substituir diariamente a planilha BaseDados ?
2. considerando que ao substituir a planilha Basedados pela primeira vez não haverá datas na planilha Controlo de Status, qual data você quer lançar nessa planilha, a data do dia ou a data que está na coluna B da Basedados ?
3. para não ocorrer a situação que comentei no item 2 (planilha BaseDados vazia) então você deverá preencher totalmente aquela planilha e disponibilizar aqui no fórum.
4. a cada substituição da planilha BaseDados se o estatus de algum PA mudou em relação ao estatus que consta na planilha Controlo de Status o que você quer fazer ?
primeiro exemplo ~~~> PA 108453 em 29-05-2018 era Entrada e passou em 30-05-2018 para Com Orçamento, neste caso lançamos a data 30-05-2018 na coluna Com Orçamento e limpamos a data 29-05-2018 na coluna Entrada ?
segundo exemplo ~~~> PA 108453 em 29-05-2018 era Entrada e permaneceu em 30-05-2018 como Entrada , neste caso lançamos a data 30-05-2018 na coluna Entrada ou mantemos a data 29-05-2018 na coluna Entrada ?
Por afelizardo
Posts
#33531
1. no seu exemplo, na coluna A da planilha Controlo de Status há 22 números de PAs, que são iguais aos primeiros 22 números da coluna A da planilha BaseDados. Essa igualdade sempre irá ocorrer ao substituir diariamente a planilha BaseDados ?

Não Irá acontecer. A minha ideia é colocar na Coluna A Nr sequencial crescente na Sheet "Controlo Status", na medida que todos os dias vão surgindo novos PA's na "BaseDados", e tem que existir correspondência no "Controlo Status", de forma a registar a data do Estado

2. considerando que ao substituir a planilha Basedados pela primeira vez não haverá datas na planilha Controlo de Status, qual data você quer lançar nessa planilha, a data do dia ou a data que está na coluna B da Basedados ?

A Data do Dia. O objectivo é conseguir ter a data de mudança de estado em cada coluna correspondete (controlo de Status), na medida que vou carregar todos os dias consigo obter a mudança

3. para não ocorrer a situação que comentei no item 2 (planilha BaseDados vazia) então você deverá preencher totalmente aquela planilha e disponibilizar aqui no fórum.

a BaseDados nunca irá ficar vazia, vai ser sempre subsituida pelo mesmos PA's e novos, com númeração crescente, conforme Excel que partilhei

4. a cada substituição da planilha BaseDados se o estatus de algum PA mudou em relação ao estatus que consta na planilha Controlo de Status o que você quer fazer ?
primeiro exemplo ~~~> PA 108453 em 29-05-2018 era Entrada e passou em 30-05-2018 para Com Orçamento, neste caso lançamos a data 30-05-2018 na coluna Com Orçamento e limpamos a data 29-05-2018 na coluna Entrada

Mantem 29-05-2018 na Coluna Entrada e acrescenta 30-05-2018 na coluna Com Orçamento

segundo exemplo ~~~> PA 108453 em 29-05-2018 era Entrada e permaneceu em 30-05-2018 como Entrada , neste caso lançamos a data 30-05-2018 na coluna Entrada ou mantemos a data 29-05-2018 na coluna Entrada ?

Mantemos a data 29-05-2018
Por osvaldomp
#33605
Instale o código abaixo em um módulo comum, assim:
1. copie o código daqui
2. a partir da planilha Controlo de Status tecle 'Alt+F11' para acessar o editor de VBA
3. no menu do editor >> Inserir >> Módulo
4. cole o código na janela em branco que vai se abrir
5. feito! 'Alt+Q' para retornar para a planilha e testar

para rodar o código:
6. tecle 'Alt+F8' >> selecione a macro correspondente >> Executar, ou insira um botão na planilha e vincule-o à macro ou vincule-a a um atalho de teclado (Alt+F8 > Opções).

Código: Selecionar todos
Sub AtualizaDataEstatus()
 Dim PA As Range, d As Range, s As String, c As Long
  For Each PA In Range("A2:A" & Cells(Rows.Count, 1).End(3).Row)
   Set d = Sheets("BaseDados").Range("A1:A" & Sheets("BaseDados").Cells(Rows.Count, 1).Row).Find(PA.Value)
   If Not d Is Nothing Then
    s = d.Offset(, 2).Value: c = Range("A1:O1").Find(s).Column
    If Cells(PA.Row, c) = "" Then Cells(PA.Row, c) = d.Offset(, 1).Value
   End If
  Next PA
End Sub

obs.
1. ao rodar o código a planilha Controlo de Status deverá ser a planilha ativa
2. para testar limpe as células C18 e D22 da planilha Controlo de Status e rode o código
3. todas as fórmulas da planilha Controlo de Status podem ser removidas
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