Ir ao conteúdo
  • Cadastre-se

Auto-executar macro


breDAniel

Posts recomendados

Bom dia Pessoal,

Preciso criar uma planilha que vai funcionar para mim como um registrador. Ou seja, todo dia, a uma determinada hora, uma macro será executada automaticamente

Para isso utilizei duas macros. Uma, chamada "Gravar", que pega determinados valores de uma planilha, copia e cola estes valores em uma outra planilha, com data e hora do registro. A outra é a macro abaixo, que precisa comparar o valor da hora atual com a hora setada para registro e quando estes valores forem iguais, ela executa a macro Gravar.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

If Target.Address = "$C$4" Then

If Target.Value = C5 Then

Gravar

End If

End If

End Sub

A hora precisa ser apresentada na planilha da seguinte forma, pois os valores de C5, D5 e E5, são importados de um PLC (Controlador Lógico Programável):

7f4e8d95dd.jpg

Para isso, eu preciso comparar na macro anterior, os valores de 6 células, ou seja, a macro Gravar somente pode ser executada quando C5=C4, D5=D4 e E5=E4. Como vocês podem ver, a minha macro, somente compara C5 com C4. Como posso editá-la para comparar estas 6 células?

Link para o comentário
Compartilhar em outros sites

experimente

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

If Target.Address <> "$C$4" Then Exit Sub

If Range("C4").Value = Range("C5").Value And _
Range("D4").Value = Range("D5").Value And _
Range("E4").Value = Range("E5").Value Then

Gravar

End If

End Sub

Link para o comentário
Compartilhar em outros sites

experimente

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

If Target.Address <> "$C$4" Then Exit Sub

If Range("C4").Value = Range("C5").Value And _
Range("D4").Value = Range("D5").Value And _
Range("E4").Value = Range("E5").Value Then

Gravar

End If

End Sub

Osvaldo,

Valeu pela força.

Para dados inseridos manualmente, ou seja, eu vou lá, coloco o valor no campo de hora atual e dou ENTER, a macro roda perfeitamente. No entanto, quando utilizo de links do PLC que atualizam automaticamente estes campos, a macro não roda. Tentei mudar na rotina de .Value para .Text, mas mesmo assim não deu certo.

Mais alguma ideia?

Os links das células do campo Hora Atual, ficaram como:

Célula C4 >> =(RSLINX|'Fea2'!'DATA_HORA_CLP[3],L1,C1')-1

Célula D4 >> =RSLINX|'Fea2'!'DATA_HORA_CLP[4],L1,C1'

Célula E4 >> =RSLINX|'Fea2'!'DATA_HORA_CLP[5],L1,C1'

Grato

Link para o comentário
Compartilhar em outros sites

Daniel

Provavelmente, pelo seu relato, o Excel não interpreta a inserção do PLC como uma alteração de conteúdo capaz de disparar a execução da macro. Essa característica do Excel aplica-se também às alterações de conteúdo ocorridas como resultado de fórmula/função. O evento Worksheet_Change "não percebe" a alteração nesses casos.

Uma alternativa seria disparar a macro por cronômetro.

Talvez os colegas do fórum ofereçam outras soluções.

Caso você queira testar:

cole os códigos abaixo no módulo de EstaPasta_de_trabalho

Private Sub Workbook_Open()
Application.OnTime Now, "Compara"
End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime dTime, "Compara", , False
End Sub

cole o código abaixo em um módulo standard

Public dTime As Date

Sub Compara()
dTime = Now + TimeValue("00:00:15")
Application.OnTime dTime, "Compara"

With Sheets("NomeDaSuaPlanilha")

If Range("C4").Value = Range("C5").Value And _
Range("D4").Value = Range("D5").Value And _
Range("E4").Value = Range("E5").Value Then

Gravar
End If
End With

End Sub

1. a macro será disparada a cada 15 seg, altere no código se desejar, está no formato "hh:mm:ss"

2. substitua o NomeDaSuaPlanilha no código

3. salve e feche o arquivo

4. reabra para iniciar o disparo automático

5. para interromper os disparos coloque um apóstrofo antes de Sub Compara(), assim 'Sub Compara(), na mensagem de erro que vai surgir clique em Fim. Antes de salvar remova o apóstrofo. Só voltará a funcionar quando reaberto o arquivo

6. caso vá testar no arquivo já existente apague o código antes instalado (Worksheet_Change)

Se ocorrer conflito com a recepção dos dados do PLC enquanto roda a macro, poderia se pensar em utilizar uma segunda planilha. Assim, a macro rodaria somente nessa planilha que vincularia os dados lançados pelo PLC na primeira.

abraço

Link para o comentário
Compartilhar em outros sites

Funcionou perfeitamente Osvaldo e atende ao que eu preciso.

Agora, visando aperfeiçoar o trabalho, gostaria de associar este intervalo de tempo para registro (Ex: 00:00:15), a uma célula de uma planilha, para que eu possa tornar a regulagem mais prática e não tenha que alterar este tempo através do editor de VBA sempre que eu precisar.

Tentei algumas coisas, mas infelizmente eu sou muito ruim em VBA.

Tem alguma sugestão?

Link para o comentário
Compartilhar em outros sites

substitua esta linha

dTime = Now + TimeValue("00:00:15")

por esta

dTime = Now + TimeSerial(0, 0, Sheets("NomeDaSuaPlan").Range("A1").Value)

1. substitua o NomeDaSuaPlan nessa nova linha

2. o código lê o tempo setado em A1, se utilizar outra célula ajuste nessa nova linha do código

3. coloque o valor desejado para o intervalo em segundos, em forma de número, ex.:

. . . . . . intervalo de 23 segundos, coloque 23,

. . . . . . intervalo de 1 minuto e trinta segundos, coloque 90,

. . . . . . intervalo de 3 minutos, coloque 180

4. não testei pois não tenho aqui a outra macro (Gravar) que é chamada por este código , mas em princípio, as alterações em A1 poderão ser feitas com o código rodando

Link para o comentário
Compartilhar em outros sites

Osvaldo,

Você é o cara!!!

Funcionou direitim.

E somando todos os conhecimentos adquiridos através das suas instruções desde o início deste tópico, consegui fazer acontecer o que eu queria inicialmente, ou seja, informar para o excel uma hora para ele executar a macro.

Como eu fiz isso?

Em EstaPasta_de_trabalho eu coloquei

Private Sub Workbook_Open()

Application.OnTime Now, "Relogio"

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.OnTime dTime, "Relogio", , False

End Sub

Em Módulo 1 deixei minha macro Gravar

Em Módulo 2

Private dTime As Date

Sub Relogio()

dTime = Time + TimeValue("00:00:01")

Application.OnTime dTime, "Relogio"

Sheets("Tela Geral").Range("C7").Value = dTime

If Sheets("Tela Geral").Range("F5").Value = Sheets("Tela Geral").Range("C7").Value Then

Gravar2

End If

End Sub

E em Módulo 3

Sub Inserir_hora()

With Sheets("Tela Geral")

Range("F5").Value = TimeSerial(Range("C5").Value, Range("D5").Value, Range("E5").Value)

End With

End Sub

Certamente, apenas lendo as macros você já entendeu o que eu tentei fazer e deu certo.

Eu criei um botão na planilha "Tela Geral" que insere na célula F5 a hora que eu quero gravar. Na célula C7, uma outra macro atualiza constantemente a hora atual e compara esta com a hora que eu quero gravar. Quando estas duas horas estão iguais, ela executa minha macro Gravar.

Segue o print do que eu fiz

e28937f49e.jpg

Muito obrigado meu amigo

Pode ter certeza de que sua ajuda foi muito válida

Aprendi bastante e consegui concluir meu trabalho

Conte comigo no que precisar.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...