Ir ao conteúdo
  • Cadastre-se

Excel Gravação Dinâmica Excel - DDE


Posts recomendados

Salve pessoal!

 

Estou com a seguinte situação precisando de ajuda.

Tenho uma planilha que recebe registros de um software em tempo real (através de DDE) e estes registros são atualizados no mínimo 4 vezes por segundo.

Preciso que estes registros que são atualizados sejam todos armazenados em uma planilha separada para consulta posterior.

A planilha anexo contempla os campos e as abas existentes.

 

Alguma ideia¿

 

 

Exemplo Quotes.xlsx

Link para o comentário
Compartilhar em outros sites

Tem algumas maneiras diferentes de criar um código pra fazer isso.

Só que, pra ter certeza que a macro vai rodar no mínimo 4 vezes por segundo vai depender de vários fatores, inclusive o hardware da máquina que vai executá-la.

Repare também que ao executar a macro 4 vezes por segundo, guardando registros, você terá em torno de 115 mil registros a cada 8 horas (4*60*60*8). Lembre-se que o Excel possui apenas 2^10 linhas (em torno de 1 milhão). Assim, se você precisar dessas informações armazenadas por mais de 80 horas, seria necessário buscar outra solução.

Além disso, essa execução virtualmente inutiliza a máquina pra qualquer outra atividade.

 

Feitas todas as ressalvas, a macro abaixo será executada até as 17:59:59:

Sub Atualiza()
Hora_Fim = 18 'Altere esse valor para outros horários de fechamento

Do While Hour(Now) < Hora_Fim 'Repetir até a Hora_Fim
    'Este bloco simplesmente copia e cola os dados pra outra planilha
    Sheets("Fonte").Select
    Range("A2:H2").Copy
    Sheets("Registro Historico").Select
    If Range("A2").Value = "" Then 'Tratamento para quando não houver valor na primeira linha do histórico
        Range("A2").Select
        Selection.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    Else
        Range("A1").End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
        Selection.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
    
    'Esperar 1 segundo dividido por 4
    Application.Wait (Now + TimeValue("00:00:01") / 4)
Loop

End Sub

Qualquer dúvida, avise.

Abraços!

 

EDIT: Não fiz nenhum tratamento para iniciar o procedimento. Dessa forma, é necessário incluir um Call em outro código qualquer, ou simplesmente criar um botão, atribuí-lo à macro e clicar nele, para que seja iniciada.

Link para o comentário
Compartilhar em outros sites

Em 08/03/2019 às 18:44, Hanner disse:

Tem algumas maneiras diferentes de criar um código pra fazer isso.

Só que, pra ter certeza que a macro vai rodar no mínimo 4 vezes por segundo vai depender de vários fatores, inclusive o hardware da máquina que vai executá-la.

Repare também que ao executar a macro 4 vezes por segundo, guardando registros, você terá em torno de 115 mil registros a cada 8 horas (4*60*60*8). Lembre-se que o Excel possui apenas 2^10 linhas (em torno de 1 milhão). Assim, se você precisar dessas informações armazenadas por mais de 80 horas, seria necessário buscar outra solução.

Além disso, essa execução virtualmente inutiliza a máquina pra qualquer outra atividade.

 

Feitas todas as ressalvas, a macro abaixo será executada até as 17:59:59:


Sub Atualiza()
Hora_Fim = 18 'Altere esse valor para outros horários de fechamento

Do While Hour(Now) < Hora_Fim 'Repetir até a Hora_Fim
    'Este bloco simplesmente copia e cola os dados pra outra planilha
    Sheets("Fonte").Select
    Range("A2:H2").Copy
    Sheets("Registro Historico").Select
    If Range("A2").Value = "" Then 'Tratamento para quando não houver valor na primeira linha do histórico
        Range("A2").Select
        Selection.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    Else
        Range("A1").End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
        Selection.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
    
    'Esperar 1 segundo dividido por 4
    Application.Wait (Now + TimeValue("00:00:01") / 4)
Loop

End Sub

Qualquer dúvida, avise.

Abraços!

 

EDIT: Não fiz nenhum tratamento para iniciar o procedimento. Dessa forma, é necessário incluir um Call em outro código qualquer, ou simplesmente criar um botão, atribuí-lo à macro e clicar nele, para que seja iniciada.

Bom dia Hanner!

 

Vi somente agora pela manhã sua resposta e agradeço imensamente o apoio.

 

Rodei a rotina que me enviou e realmente ficou extremamente pesada... então alterei a gravação dos registros para 1 segundo e o resultado que chegou foi o seguinte:

image.png.a1135ff913a5fe4a0e81c47521d21193.png

 

Como pode ser percebido, as linhas estão sendo registradas, porém com todas as linhas repetidas, sem alteração nos preços...

 

pode me ajudar?

 

De antemão, agradeço imensamente
 

Link para o comentário
Compartilhar em outros sites

@Punisher76 Bom dia!

Infelizmente, não sei como é feita a recuperação dos pela planilha e não tenho como testar isso por aqui sem o teu software.

Geralmente, como você faz pros dados aparecerem atualizados na Fonte? Pensei na possibilidade de você estar usando cálculo manual, mas provavelmente não é o caso uma vez que a hora tá saindo atualizada.

De qualquer forma, experimenta colocar um Calculate logo depois de selecionar a aba Fonte. O começo do código ficaria assim:

Sub Atualiza()
Hora_Fim = 18 'Altere esse valor para outros horários de fechamento

Do While Hour(Now) < Hora_Fim 'Repetir até a Hora_Fim
    'Este bloco simplesmente copia e cola os dados pra outra planilha
    Sheets("Fonte").Select
    Calculate
    Range("A2:H2").Copy

...

Abraço!

Link para o comentário
Compartilhar em outros sites

39 minutos atrás, Hanner disse:

@Punisher76 Bom dia!

Infelizmente, não sei como é feita a recuperação dos pela planilha e não tenho como testar isso por aqui sem o teu software.

Geralmente, como você faz pros dados aparecerem atualizados na Fonte? Pensei na possibilidade de você estar usando cálculo manual, mas provavelmente não é o caso uma vez que a hora tá saindo atualizada.

De qualquer forma, experimenta colocar um Calculate logo depois de selecionar a aba Fonte. O começo do código ficaria assim:


Sub Atualiza()
Hora_Fim = 18 'Altere esse valor para outros horários de fechamento

Do While Hour(Now) < Hora_Fim 'Repetir até a Hora_Fim
    'Este bloco simplesmente copia e cola os dados pra outra planilha
    Sheets("Fonte").Select
    Calculate
    Range("A2:H2").Copy

...

Abraço!

Hanner, 

 

o código mesmo com o CALCULATE permanece replicando a primeira atualização do registro.

encontrei na net dias atras o seguinte codigo:

 

Private Sub Worksheet_Calculate()
  Dim LR As Long
    LR = Cells(Rows.Count, 1).End(xlUp).Row
      If LR < 3 Then LR = 3
        Cells(LR + 1, 1) = Date
        Cells(LR + 1, 2) = Time
        Cells(LR + 1, 3) = [A1]
End Sub

 

 

ele até faz a gravação dos registros, mas não faz de modo automático a cadas "x" tempo e também não está copiando as células que preciso

 

se não for pedir demais, pode tentar adaptar esse código juntamente com o seu para atender minha necessidade?

 

eu realmente não entendo nada de programação...

 

adicionado 0 minutos depois

ah, faltou dizer que a atualização dos dados é de forma automática através de uma conexão DDE 

Link para o comentário
Compartilhar em outros sites

Pra você ficar por dentro, vamos fazer um procedimento diferente. Em lugar de deixar um loop rodando, faremos um código ser executado toda vez que houver um cálculo na Fonte.

A primeira parte (o que chama o código principal) deve ser inserida como código da própria Sheet conforme abaixo:

 

Spoiler

Fonte.png.dc80115e48a39eac763c166250a10c05.png

 

Isso vai apenas chamar o código principal, neste exemplo no módulo 1:

Spoiler

165794052_Mdulo1.png.0080fed1e156a6ab7a6b4005ecba0560.png

 

Aqui o código principal, pra facilitar:

Sub Atualiza()
Sheets("Fonte").Select
Range("A2:H2").Copy
Sheets("Registro Historico").Select
If Range("A2").Value = "" Then 'Tratamento
    Range("A2").Select
    Selection.PasteSpecial xlPasteValues
    Application.CutCopyMode = False
Else
    Range("A1").End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
    Selection.PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End If
End Sub

 

Link para o comentário
Compartilhar em outros sites

Não sei mesmo =/

Tenho uma última sugestão, que atualiza as fontes de dados externas. Pode ser o que tava faltando. Se isso não resolver realmente não sei o que fazer hahaha.

Tenta inserir a função "ActiveWorkbook.RefreshAll" assim que selecionar a "Fonte". O início do código principal ficaria assim:

Sub Atualiza()
Sheets("Fonte").Select
ActiveWorkbook.RefreshAll
Range("A2:H2").Copy

 

Link para o comentário
Compartilhar em outros sites

Só pra adicionar: Se o ArtiveWorkbook.RefreshAll não funcionar, tenta também o "ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources" no lugar dele.

Como eu disse, não tenho mais conhecimento pra te ajudar. Então tô tentando alguns métodos conhecidos de atualização de valores de fontes externas.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!