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.
#37833
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
#37839
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
#37857
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
#37859
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
#37865
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.
#37873
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
#37886
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
#37894
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
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