Página 1 de 1

Criar série histórica (banco de dados) através de link DDE?

Enviado: 17 Out 2018 às 16:08
por rafadeggau
Boa tarde,

Eu tenho uma planilha que recebe dados de um link DDE.

Estes dados estão classificados em 8 colunas A1 até H1.
A linha 1 possui informação estática em formato de texto que descrevem os dados recebidos.
Os dados dinâmicos, provenientes do link DDE, estão na linha 2 ( de A2 até H2 ) respectivamente abaixo de suas descrições.
O que está acontecendo é que estes dados da linha 2 estão constantemente sendo atualizados (menos de 1 segundo para cada atualização).
O que eu queria fazer era inserir uma nova linha 2 a cada atualização e que a linha 2 antiga fosse deslocada para o lugar da linha 3 e assim sucessivamente, dando origem a uma lista de dados com o histórico das atualizações em ordem decrescente de aparição na tela, da mais recente (linha2) para a mais antiga (última linha com dados).

Obrigado

AT
Rafael Deggau Marques

Re: Criar série histórica (banco de dados) através de link D

Enviado: 17 Out 2018 às 21:54
por osvaldomp
Faça um teste inicial. Instale os dois códigos abaixo no módulo da planilha, dispare o link DDE e observe se alguma mensagem aparece, e qual.

Instale os códigos abaixo no módulo da planilha que recebe os dados do link, assim:
1. copie os códigos daqui
2. clique com o direito na guia da planilha de interesse 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_Calculate()
 MsgBox "calculate"
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
 MsgBox "change"
End Sub

Re: Criar série histórica (banco de dados) através de link D

Enviado: 18 Out 2018 às 09:46
por rafadeggau
Amigo osvaldomp,

Antes de prosseguir com minha resposta, desejo agradecer pela atenção em tentar solucionar minha dúvida.

O acontecimento gerado pela inserção da sua instrução é o aparecimento de uma mini janela com o texto "calculate" e interrupção das atualizações.

Ao clicar no botão disponível "OK" inicia-se um "loop eterno" de ida, ao módulo do visual basic, e imediato retorno à Planilha de Trabalho aonde fica permanentemente disponível a mini janela que descrevi acima só que agora com os dados atualizados até o clique, porém sem atualizações automáticas.

Obrigado

Re: Criar série histórica (banco de dados) através de link D

Enviado: 18 Out 2018 às 10:46
por osvaldomp
Olá, Rafael.
Com base nas suas informações, me parece que a entrada de dados do link provoca o recálculo da planilha, então a ideia é aproveitar o disparo do evento Calculate e nele colocar um comando para inserir linha na linha 2, conforme abaixo.
A dúvida é se o tempo gasto pelo código para inserir a linha será menor do que o intervalo entre as entradas do link. Se houver algum conflito experimente aumentar o intervalo de entrada, se possível, ao menos para efeitos de teste.

Instale o código abaixo no lugar dos dois anteriores, acione o link e veja o resultado.
Código: Selecionar todos
Private Sub Worksheet_Calculate()
 Application.EnableEvents = False
 Rows(2).Insert
 Application.EnableEvents = True
End Sub

Re: Criar série histórica (banco de dados) através de link D

Enviado: 18 Out 2018 às 12:33
por rafadeggau
Com esta nova instrução, a linha 2 fica em branco, embora eu perceba que os dados continuam chegando devido a eu ver o cursor piscar (evidenciando que operações de processamento estão acontecendo).
Por curiosidade, digitei uma letra na linha 6 e conforme os dados chegam esta linha, com a letra inserida manualmente, é deslocada para baixo, demonstrando que a inserção de uma nova linha 2 está funcionando, porém não existem dados visíveis. Os dados que chegam automaticamente não ficam visíveis.
Eu não tenho controle sobre o tempo de chegada destes dados, são aleatórios.

Re: Criar série histórica (banco de dados) através de link D

Enviado: 18 Out 2018 às 21:44
por osvaldomp
Há fórmulas na planilha?

Experimente o código abaixo em uma planilha vazia. Está sem o comando que inibe eventos e por isso talvez provoque "loop infinito", aí chuta a tomada pra interromper o loop :(
Código: Selecionar todos
Private Sub Worksheet_Calculate()
 Rows(2).Insert
End Sub
Uma outra tentativa seria colocar uma fórmula na linha 1. Se o link lança os dados em A2:H2, coloque por exemplo em A1 =A2

Re: Criar série histórica (banco de dados) através de link D

Enviado: 19 Out 2018 às 11:19
por rafadeggau
Bom dia osvaldo,

Gravei um vídeo da tela porque acho que será melhor aproveitado do que as minhas respostas.
Enviarei o link para visualização.

*Obs.: Eu esqueci de informar no vídeo e você, certamente perceberá, que os dados estão chegando com vários sinais de "@" (arroba).

Isto acontece pois a realização de negócios acontece em milisegundos e não é possível apresentar um após o outro e desta maneira eles são apresentados ao mesmo tempo separados pelo "@".
Esta será uma nova etapa a superar, a de arrumar os negócios apresentados lado a lado separados por arroba, como resultados individuais um abaixo do outro.

Obrigado

https://mega.nz/#!63xCka6I!yvrXiUTncOGs ... uVc9zuMt8M

Re: Criar série histórica (banco de dados) através de link D

Enviado: 19 Out 2018 às 21:10
por osvaldomp
rafadeggau escreveu: Gravei um vídeo da tela porque acho que será melhor aproveitado do que as minhas respostas.
Ótima ideia e excelente a qualidade do vídeo e das explicações. Sem dúvida foi mais bem aproveitado do que seria somente com os textos. :P :geek:
Ao ver o vídeo me parece que o problema ocorre devido à inserção de linha na linha 2. Assim, ao copiar os títulos da caixa de diálogo do aplicativo e colar na linha 1 da planilha, o intervalo A1:H1 fica automaticamente vinculado ao link e passa a receber os dados. Porém ao copiar e assinalar a opção Títulos de Colunas e colar na linha 1, o vínculo se estabelece no intervalo A2:H2, e aí a cada inserção de linha na linha 2 o vínculo é deslocado para baixo. Como o link foi orientado para lançar os dados no intervalo vinculado, então inicia-se a perseguição, e em consequência a linha 2 fica vazia.

Seguem abaixo duas opções para testes.
O primeiro código insere linha na linha 4 e replica nela os dados recebidos do link (A2:H2). Optei pela linha 4 para deixar uma linha vazia (linha 3) e assim facilitar a visualização, mas poderá ser em qualquer linha a partir da 3.
O segundo não insere linha, e sim replica os dados do link na primeira linha vazia. Por não inserir linha este é aproximadamente 10 vezes mais rápido do que o anterior e seria uma alternativa se o tempo do primeiro não for compatível com o intervalo do link. Neste caso, se quiser deixar uma linha vazia selecione A3, insira um espaço e Enter. Os dados na tabela resultante estarão na ordem inversa do primeiro código, ou seja, o primeiro registro da tabela será o último recebido. Mas, se necessário, é facinho inverter a ordem depois de desligar o link.
Código: Selecionar todos
Private Sub Worksheet_Calculate()
 Rows(4).Insert
 Range("A4:H4").Value = Range("A2:H2").Value
End Sub
Código: Selecionar todos
Private Sub Worksheet_Calculate()
 Cells(Rows.Count, 1).End(3)(2).Resize(, 8).Value = Range("A2:H2").Value
End Sub
Eu acredito que nenhum dos códigos acima irá provocar loop infinito, mas caso ocorra, experimente os dois códigos abaixo, que são cópias dos dois acima porém com o comando para desativar eventos e assim inibir o loop.
Código: Selecionar todos
Private Sub Worksheet_Calculate()
 Application.EnableEvents = False
  Rows(4).Insert
  Range("A4:H4").Value = Range("A2:H2").Value
 Application.EnableEvents = True
End Sub
Código: Selecionar todos
Private Sub Worksheet_Calculate()
 Application.EnableEvents = False
  Cells(Rows.Count, 1).End(3)(2).Resize(, 8).Value = Range("A2:H2").Value
 Application.EnableEvents = True
End Sub