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.
#60399
Fala Galera, alguém pode ajudar?

Tenho uma pasta de trabalho com duas planilhas

Na plan1 eu uso 7 colunas (A:G)

Sendo que a coluna B é formato de data (m/d/aaaa h:mm:ss AM/PM) e será usada como fonte do critério a ser validado

Eu preciso copiar, através de um comando de macro, o Intervalo (AX:GY) e inserir em plan2.

X = primeira linha com conteúdo contendo dados do minuto passado { Now - TimeVallue(“00:01:00”) }

Y = última linha com conteúdo do minuto passado

Após este comando de selecionar o intervalo com os dados do minuto passado (que estou pedindo a vocês) eu queria usar este código abaixo para inserir antes dos outros dados em plan2:

Sheets(“Plan2”).Select
Range(“A1”).Select
Selection.Insert Shift:=xlDown
ActiveSheet.Paste
Application.CutCopyMode = False

Obrigado
#60435
Bom dia,

Eu estava relendo minha postagem e percebi que uma orientação que dei não está correta.

A instrução { Now - TimeVallue(“00:01:00”) } não representa o que eu quero buscar.

Exemplo: Se agora= 07:48:26, então o intervalo que será calculado será o que estiver entre 07:47:26 até NOW

Não é isso que eu quero. O resultado que eu quero é o que está entre 07:47:00 e 07:47:59

Busco o resultado do minuto anterior “completo” (do 00 seg até os 59 segundos)
#60437
Sugestão: disponibilize diretamente aqui no fórum uma amostra do seu arquivo Excel com alguns dados (máximo de 10 linhas) e coloque na própria planilha dois ou três exemplos do resultado desejado.
rafadeggau agradeceu por isso
#60492
Poderia ser um módulo contendo uma macro que seria chamada manualmente por um botão.

O intervalo analisado seria A:G da Plan1 até a última linha com dados (se ficar mais fácil, pode limitar até a linha 5000, neste caso A1:G5000) lembrando que a primeira linha é um cabeçalho, então A2:G5000

A coluna com o tempo a ser procurado sempre será a B em Plan1

Os dados são dispostos em ordem decrescente de tempo e sempre ordenados, isto é, o mais recente na primeira linha e o mais antigo na última linha. Por isso os extremos do intervalo alvo sempre serão 00 segundos (em baixo) e 59 segundos (em cima)

Após selecionar este intervalo (do minuto anterior ao clique no botão que aciona a macro) preciso que seja inserida uma cópia desta seleção na célula A1 da Plan2 deslocando os dados existentes para baixo.
#60513
O código abaixo serve somente para testes na planilha que você disponibilizou. Ele adota o horário que está em J7 para a formação do critério. Antes de fazer os testes adicione PM ao horário daquela célula para ficar compatível com os horários da coluna B que são todos PM. Deverá ficar assim 03:19:37 PM.
Sem qualquer outra alteração na planilha você poderá testar também após alterar J7 para 03:18:xx PM e 03:20:xx PM (xx ~~~> qualquer valor entre 0 e 59).
Se o resultado for o desejado então teste e utilize o segundo código abaixo.
Código: Selecionar todos
'este código considera hora e minuto de J7
'(acrescentar PM naquela célula antes de testar)
Sub ReplicaDados_HoraJ7()
 Dim DHi As Double, DHf As Double
  Application.ScreenUpdating = False
  ActiveSheet.AutoFilterMode = False
  DHi = DateSerial(Year([B2]), Month([B2]), Day([B2])) + _
   TimeSerial(Hour([J7]), Minute([J7]) - 2, 59)
  DHf = DateSerial(Year([B2]), Month([B2]), Day([B2])) + _
   TimeSerial(Hour([J7]), Minute([J7]) - 1, 59)
  If Evaluate("SUMPRODUCT((B2:B" & Cells(Rows.Count, 2).End(3).Row & ">" & Replace(DHi, ",", ".") & _
    ")*(B2:B" & Cells(Rows.Count, 2).End(3).Row & "<=" & Replace(DHf, ",", ".") & "))") = 0 Then Exit Sub
  Range("A1:G1").AutoFilter Field:=2, Criteria1:=">" & Replace(DHi, ",", "."), Operator:=xlAnd, _
    Criteria2:="<=" & Replace(DHf, ",", ".")
  Range("A2:G" & Cells(Rows.Count, 1).End(3).Row).Copy
  Sheets("Plan2").Range("A2").Rows("1:1").Insert Shift:=xlDown
  ActiveSheet.AutoFilterMode = False
End Sub
@@@
@@@

O código abaixo adota o horário do SO da máquina, conforme o seu pedido, então obviamente os horários da coluna B da planilha devem ser compatíveis com a hora atual.
O resultado é igual ao resultado do código acima.
Código: Selecionar todos
'este código considera hora e minuto da máquina (SO)
Sub ReplicaDados_HoraSistema()
 Dim DHi As Double, DHf As Double
  Application.ScreenUpdating = False
  ActiveSheet.AutoFilterMode = False
  DHi = DateSerial(Year([B2]), Month([B2]), Day([B2])) + _
   TimeSerial(Hour(Now), Minute(Now) - 2, 59)
  DHf = DateSerial(Year([B2]), Month([B2]), Day([B2])) + _
   TimeSerial(Hour(Now), Minute(Now) - 1, 59)
  If Evaluate("SUMPRODUCT((B2:B" & Cells(Rows.Count, 2).End(3).Row & ">" & Replace(DHi, ",", ".") & _
    ")*(B2:B" & Cells(Rows.Count, 2).End(3).Row & "<=" & Replace(DHf, ",", ".") & "))") = 0 Then Exit Sub
  Range("A1:G1").AutoFilter Field:=2, Criteria1:=">" & Replace(DHi, ",", "."), Operator:=xlAnd, _
    Criteria2:="<=" & Replace(DHf, ",", ".")
  Range("A2:G" & Cells(Rows.Count, 1).End(3).Row).Copy
  Sheets("Plan2").Range("A2").Rows("1:1").Insert Shift:=xlDown
  ActiveSheet.AutoFilterMode = False
End Sub
Kledison agradeceu por isso
#60527
Amigo osvaldomp, estou sem palavras para poder te agradecer.

Além de fornecer o código que funciona com a hora real ainda fez um de teste.

Que Deus te proteja e ilumine sempre teu caminho.

Confesso que espalhei esta solicitação em outros fóruns, quero saber se você autoriza a divulgação desta solução nestes locais com a informação da fonte? Assim eu encerro o tópico por lá.

Penso que ajudará outras pessoas e pode atrair mais inscritos para o site.

Um grande abraço.
Kledison, osvaldomp agradeceu por isso
#60529
Olá, Rafa.
Grato pelas suas palavras. Ficamos contentes em saber que a sua demanda foi resolvida.

Fique à vontade para publicar os códigos onde desejar pois isso poderá ajudar outras pessoas no futuro já que as postagens ficam disponíveis para as pesquisas na WEB.

God bless you too.
rafadeggau agradeceu por isso
#70532
@osvaldomp
:D
Olha eu aí de novo!!!
Neste código que você desenvolveu, seria possível apresentar os resultados da coluna TEMPO somente as horas e minutos no formato 24hs (sem data e sem os segundos)?
Estou tentando usar os dados desta coluna porém quando configuro para mostrar como tempo (HH:mm), o resultado que fica para efeito de cálculos em outras fórmulas é HH:mm:ss :cry:
Isto eu consegui automatizar no código, mas não funcionou.
Quando eu paro o código e transformo os dados desta coluna com a fórmula: =TEMPO(HORA(B471);MINUTO(B471);) eu consigo usar o resultado em outra fórmula, pois o resultado saiu como HH:mm.
Por favor, você poderia ajustar o código para apresentar o resultado como HH:mm?
#70539
Salve, @rafadeggau .

Acrescente as partes em vermelho, conforme abaixo. Vale para os dois códigos que passei antes.

Dim DHi As Double, DHf As Double, x As Long

x = ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count
Range("A2:G" & Cells(Rows.Count, 1).End(3).Row).Copy


ActiveSheet.AutoFilterMode = False
With Sheets("Plan2").Range("B2:B" & x)
.Value = Evaluate("=TIME(HOUR(Plan2!B2),MINUTE(Plan2!B2),0)")
.NumberFormat = "hh:mm"
End With

End Sub
#70542
rafadeggau escreveu: 01 Mai 2022 às 16:34 Fiz conforme orientação e...
Não exatamente. Você não colocou a linha vermelha na posição que indiquei, conforme abaixo. ;)
x = ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count
Range("A2:G" & Cells(Rows.Count, 1).End(3).Row).Copy
#70543
@osvaldomp,
Sem comentários, eu estava desatento, desculpe. Corrigi, mas agora na planilha 1 as linhas 2à7 e 16à19, correspondentes ao tempo diferente do critério de cópia foram "escondidas" e foi criada uma tabela dinamica, eu acho, com cabeçalho filtrado.
Mesmo erro, !Object Variable or With block variable not set
Imagem
Imagem
#70544
rafadeggau escreveu: 01 Mai 2022 às 17:41 ...mas agora na planilha 1 as linhas 2à7 e 16à19, correspondentes ao tempo diferente do critério de cópia foram "escondidas" e foi criada uma tabela dinamica,...
Ôxi ... isso pode ser obra de Duende infiltrado ... :D :D :D
Por favor disponibilize o seu arquivo Excel com o código que você utilizou e com essas "anomalias" que você comentou acima.
#70547
rafadeggau escreveu: 01 Mai 2022 às 17:41 ... mas agora na planilha 1 as linhas 2à7 e 16à19, correspondentes ao tempo diferente do critério de cópia foram "escondidas" e foi criada uma tabela dinamica, eu acho, com cabeçalho filtrado.
Nada de errado. Possivelmente a execução foi interrompida e o Filtro ficou ativo na Plan1 e algumas linhas permaneceram ocultadas. Ao rodar o código novamente todas as linhas serão reexibidas.

Mesmo erro, !Object Variable or With block variable not set
Possivelmente esse erro ocorreu porque você rodou o código com a Plan2 ativa. Sempre rode o código com a Plan1 ativa pois em J7 dessa planilha que o código lê a hora de referência.
Para testar limpe a Plan2 e rode o código. Em seguida altere a hora em J7 e rode quantas vezes quiser.
#70548
@osvaldomp
Entendi,
Eu poderia contornar esta "obrigação" de estar ativo na plan1 para rodar o código, atribuindo o caminho completo nas intruções?
Outra coisa, se eu usar estas células da coluna B da plan2 em fórmulas, o resultado vai conter os segundos, veja no anexo.
Tem como apresentar o resultado como hh:mm em modo texto? se for como tempo, vai ficar sempre subentendido que é hh:mm:ss, não é?
Hmmm, estou editando a resposta, agora que vi que os segundos estão "zerados", amanhã vou testar.
Imagem
#73737
osvaldomp escreveu: 15 Nov 2020 às 21:12
Código: Selecionar todos
'este código considera hora e minuto de J7
'(acrescentar PM naquela célula antes de testar)
Sub ReplicaDados_HoraJ7()
 Dim DHi As Double, DHf As Double
  Application.ScreenUpdating = False
  ActiveSheet.AutoFilterMode = False
  DHi = DateSerial(Year(['Plan1'!B2]), Month(['Plan1'!B2]), Day(['Plan1'!B2])) + _
   TimeSerial(Hour([J7]), Minute([J7]) - 2, 59)
  DHf = DateSerial(Year(['Plan1'!B2]), Month(['Plan1'!B2]), Day(['Plan1'!B2])) + _
   TimeSerial(Hour([J7]), Minute([J7]) - 1, 59)
  If Evaluate("SUMPRODUCT(('Plan1'!B2:B" & Cells(Rows.Count, 2).End(3).Row & ">" & Replace(DHi, ",", ".") & _
    ")*('Plan1'!B2:B" & Cells(Rows.Count, 2).End(3).Row & "<=" & Replace(DHf, ",", ".") & "))") = 0 Then Exit Sub
  Sheets("Plan1").Range("A1:G1").AutoFilter Field:=2, Criteria1:=">" & Replace(DHi, ",", "."), Operator:=xlAnd, _
    Criteria2:="<=" & Replace(DHf, ",", ".")
  Sheets("Plan1").Range("A2:G" & Cells(Rows.Count, 1).End(3).Row).Copy
  Sheets("Plan2").Range("A2").Rows("1:1").Insert Shift:=xlDown
  ActiveSheet.AutoFilterMode = False
End Sub

Gostaria de saber se eu quisesse colocar esta macro em outra planilha ou em um módulo, bastaria eu acrescentar as referencias Sheets("Plan1") e 'Plan1'! nos locais que coloquei?

O código quando roda na planilha 1 executa normalmente, mas quando  eu rodo este código em outra planilha/aba mas ainda buscando dados na plan1 não funciona!

A maneira como eu fiz referencia à plan1 está correta?
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