Vídeo recomendado
https://youtu.be/diWPPPhW-9E

RESOLVIDO! [Difícil!] Atualizar link RTD quando o LOOP está rodando

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
clovisdaniel
Acabou de chegar
Acabou de chegar
Mensagens: 7
Registrado em: Qui Dez 14, 2017 9:29 am

RESOLVIDO! [Difícil!] Atualizar link RTD quando o LOOP está rodando

Mensagem por clovisdaniel »

Bom dia.

Depois de pesquisar bastante na rede, por vários dias, resolvi pedir a ajuda no Fórum.
Estou com problema com minha planilha que utiliza um link RTD (Realtime data) para atualizar o preço de uma cotação da Bovespa.

O link funciona perfeitamente. O problema é que preciso rodar um Loop dentro de uma macro e, quando aciono o mesmo, ele trava o recebimento dos dados RTD. A célula onde está o link fica congelada com o último valor e não atualiza até que eu pare o Loop.

Eu preciso usar o Loop para um contador de tempo abaixo de 1 segundo (300 milissegundos par ser mais preciso) visto que o RTD atualiza a cada 200 milissegundos. Já tentei colocar o sinal do RTD dentro de uma variável no próprio loop mas o resultado é o mesmo: a célula fica apenas com o último valor.

Uma possível solução seria fazer a macro buscar o "value" desta célula com link em outra planilha numa outra janela do Windows (na mesma janela já tentei e trava do mesmo jeito). O Loop não interfere no link RTD que roda em outro processo (outra janela independente). Mas não consigo criar uma variável que busque algum dado numa planilha aberta em outro processo. Já encontrei para arquivos fechados mas, daí, o link RTD não estaria ativo.

Preciso que o loop rode sem interferir no recebimento do sinal. Alguém poderia me dar uma "luz"?
Editado pela última vez por clovisdaniel em Sex Ago 16, 2019 11:19 pm, em um total de 2 vezes.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: Atualizar link RTD quando o LOOP está rodando

Mensagem por srobles »

clovisdaniel,

Poderia explicar como esse link RTD funciona? Ele utilizar instruções VB para se conectar e atualizar os dados?
Caso ele utilize VB (macros), talvez você poderia adaptar o seu loop, inserindo as chamadas de rotina do link RTD ao loop e declarando DoEvents no inicio do loop.

Desculpe, mas não tenho muito conhecimento em links RTD e não sei como funcionam.

Abs


clovisdaniel
Acabou de chegar
Acabou de chegar
Mensagens: 7
Registrado em: Qui Dez 14, 2017 9:29 am

Re: Atualizar link RTD quando o LOOP está rodando

Mensagem por clovisdaniel »

Olá Saulo.
Obrigado pela sugestão.
Testei sua sugestão mas ainda não obtive o desejado.
O link RTD é o sucessor, por assim dizer, do link DDE. Ele recebe dados de um servidor e permite que você receba isto no Excel.
Estou postando meu código abaixo para ter ideia do problema:

Sub Automato()

If Range("k1") = 1 Then
Contador (1)

Call Automato
Else
End If
End Sub

_____________________________________________________________________
Sub Contador(Termino As Long)

Dim NowTick As Long
Dim EndTick As Long

EndTick = GetTickCount + (Termino * 300)

Do
DoEvents
Range("H4").Value = CSng([RTD("tryd.rtdserver",,"COT","WING18","Ult")])

NowTick = GetTickCount

'Incrementa a célula para eu ter noção de que o Loop está rodando.
Range("A1").Value = Range("a1").Value + 1

Loop Until NowTick >= EndTick

End Sub


clovisdaniel
Acabou de chegar
Acabou de chegar
Mensagens: 7
Registrado em: Qui Dez 14, 2017 9:29 am

Re: Atualizar link RTD quando o LOOP está rodando

Mensagem por clovisdaniel »

Bom dia, pessoal.
Descobri que o servidor RTD espera o Excel ficar ocioso para enviar as atualizações, como o Loop está rodando ele não consegue carregar. Então coloca em cache e quando o Excel pára uma atividade, ele carrega os novos valores.

Enquanto eu não descubro um jeito de driblar isto, talvez alguém pudesse me ajudar com uma "gambiarra" que também me atende. Vou descrevê-la:

- Clico em Iniciar, depois em Microsoft Excel e o sistema abre uma janela com uma planilha em branco;
- Clico novamente em Iniciar, depois em Microsoft Excel e o sistema abre uma outra janela com uma planilha em branco;
- Portanto, as planilhas estão em janelas do Windows diferentes. Pergunta:

Como posso usar o VBA para copiar algo de uma das planilhas das janelas (que já estão abertas) e mandar para uma célula na outra planilha?

Parece simples mas, não consigo resolver. Se estiverem na mesma janela do Windows é moleza. Quando estão em janelas separadas, como neste exemplo ele depura um erro.

Isto me ajudaria porque poderia colocar o link RTD para rodar numa planilha em separado e o meu Loop da outra planilha vem buscar o "value" a cada intervalo de tempo que eu desejar. Resolveria meu problema.

Alguém poderia me ajudar?


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: [Difícil!] Atualizar link RTD quando o LOOP está rodando

Mensagem por srobles »

clovisdaniel,

Desculpe a demora em responder amigo.

Estive pesquisando muito sobre o assunto, e aos mais experientes, corrijam-me se estiver errado, cheguei a conclusão que isso só será possível, se criarmos uma DLL ou Objeto COM usando VB.NET ou C#, para executarmos estas funções em multithread (simultaneamente) sem que esperemos uma ou outra rotina executar primeiro, pois nativamente, o VBA é singlethread.

Estive estudando este post https://stackoverflow.com/questions/572 ... ing-in-vba do fórum StackOverFlow (muito interessante por sinal) e creio que possa ajudar, caso tenha interesse e ainda não tenha solucionado a questão.

Quanto á questão de trabalhar / manipular duas ou mais instâncias do Excel, creio que teria de estudar a manipulação dos processos que estão sendo executados no Windows, para retornar e alternar entre os PID's de cada processo. Assim, talvez, seja possível elaborar uma rotina em uma determinada pasta que possa manipular esses PID's executando a cópia e transferência da informação obtida para a outra.

Espero que ajude.

Abs


clovisdaniel
Acabou de chegar
Acabou de chegar
Mensagens: 7
Registrado em: Qui Dez 14, 2017 9:29 am

Re: [Difícil!] Atualizar link RTD quando o LOOP está rodando

Mensagem por clovisdaniel »

Muito obrigado amigo. Vou estudar com atenção as sugestões.


flavioofernandes
Acabou de chegar
Acabou de chegar
Mensagens: 1
Registrado em: Seg Jul 01, 2019 1:35 am

Re: [Difícil!] Atualizar link RTD quando o LOOP está rodando

Mensagem por flavioofernandes »

clovisdaniel escreveu: Sex Dez 15, 2017 9:29 am Eu preciso usar o Loop para um contador de tempo abaixo de 1 segundo (300 milissegundos par ser mais preciso) visto que o RTD atualiza a cada 200 milissegundos. Já tentei colocar o sinal do RTD dentro de uma variável no próprio loop mas o resultado é o mesmo: a célula fica apenas com o último valor.
Por padrão, utilizando o RTD, o intervalo de atualização dos dados no Excel é de 2 segundos. Este intervalo pode ser alterado executando um comando simples no Excel.
Seguem os passos para executar o comando:

1.Teclar <Alt+F11> dentro do Excel, a tela Microsoft Visual Basic será aberta;

2.Teclar <Ctrl+G> dentro da tela que abriu, será aberta a tela Immediate (Verificação imediata);

3.Digitar o seguinte comando na tela Immediate: Application.RTD.ThrottleInterval = 200 (onde 200 é o tempo, em milissegundos, a ser definido)

4.Teclar Enter estando com o cursor de edição de texto imediatamente após o comando digitado.



Após executar estes passos corretamente o intervalo de atualização dos dados no Excel via RTD já estará alterado. Você já pode fechar a tela Microsoft Visual Basic.

Fonte:
https://www.tryd.com.br/manual/HTML/dde_rtd.htm?toc=0


clovisdaniel
Acabou de chegar
Acabou de chegar
Mensagens: 7
Registrado em: Qui Dez 14, 2017 9:29 am

Re: [Difícil!] Atualizar link RTD quando o LOOP está rodando

Mensagem por clovisdaniel »

Consegui resolver o problema com o próprio fantástico Excel. E o único jeito é utilizar o Worksheet_Calculate em alguma planilha.
Eu coloquei algum link RTD ou DDE numa célula qualquer da planilha e depois editei o Worksheet_Calculate() desta planilha. Depois criei uma Sub com visibilidade pública dentro da declaração do form que mandava o formulario reinicializar. Daí coloquei no Worksheet_Calculate supra citadado um Call para esta Sub. Assim atualiza automático. Com while e for não dá certo porque o Excel espera para atualizar o RTD enquanto o loop está rodando.

Aproveitando, alguém poderia responder um questionário simples para me ajudar no meu TCC? Estou me graduando em Engenharia de Software e estou fazendo uma pesquisa sobre Blockchain. Abaixo segue o link do Google Forms para a pesquisa:

https://forms.gle/mdyJsDB6SesAoxHy8

Obrigado.

Segue exemplo do código:

Código: Selecionar todos

Sub Worksheet_Calculate()
	
    If Sheets("Geral").Cells(1, 1).Value = "Liberado" Then     
   
            Call UserForm1.FormReload
        
        Else
    
    End If
    
End Sub
No formulário coloquei o link RTD entre brackets no caption de um Label:

Código: Selecionar todos

Private Sub UserForm_Initialize()
	Label1.Caption = [RTD("tryd.rtdserver", , "COT", "winfut", "Ult")]
End Sub
A Sub pública para atualizar os dados no form a cada atualização que chegar do link RTD (coloquei na declaração do form):

Código: Selecionar todos

Public Sub FormReload()
	UserForm_Initialize
End Sub


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder