Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
breDAniel

[Resolvido] Auto-executar macro

Recommended Posts

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?

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

    Editado por breDAniel

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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?

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por Flavio Soares
    Remoção de e-mail

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Visitante
    Este tópico está impedido de receber novos posts.
    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×