Gráfico com entrada...
 
Notifications
Clear all

Gráfico com entrada de dados "eterna"

6 Posts
2 Usuários
0 Reactions
1,878 Visualizações
(@wluis)
Posts: 8
Active Member
Topic starter
 

Prezados(as),

Estou com uma situação que tem impedido o desenrolar de um projeto:

Tenho uma Pasta de Trabalho, e nelas algumas planilhas. Em uma dessas planilhas, recebo (via DDE) informações em tempo real (Mercado Financeiro). Criei uma macro que é executada a cada segundo, copiando a hora atual e a informação (normalmente um preço) que chegou nesse segundo. Após copiado essas informações, a macro as copia para o fim dessa planilha (em uma região que denomino de "suporte", por exemplo, a partir da "A100").

E aí começa o problema:

Como a macro copia e cola os dados a cada segundo, e como são 8:30h de pregão na bolsa por dia, teremos: 60 (segundos) x 60 (minutos) x 8:30h = 30.600 registros / dia. A minha dificuldade está na montagem do gráfico para essa série de dados (Hora / Informação), dificuldade essa que pode ser dividida em duas:

1 - Como são muitos os dados recebidos durante o dia, cada vez que um "pacote" de dados chega, o cursor vai para a célula em que os dados foram colados (após terem sido copiados), ou seja, é impossível trabalhar, já que o cursor sempre pulando para uma linha abaixo, a cada pacote recebido. Precisaria que essa macro, ao ser rodada, não interferisse no trabalho na planilha. Já me disseram para rodá-la em segundo plano, mas não achei nada a respeito;

2 - Preciso montar um gráfico simples, de linha (somente com a informação). Como o espaço em que esse gráfico ficará é reduzido, precisaria que o gráfico fosse se auto-abastecendo a cada informação recebida, e em um determinado momento (quando extrapolasse o tamanho do espaço), que fosse possível uma barra de rolagem (assim os dados de momentos antes, já plotados no gráfico, poderiam ser visualizados).

Será que consegui ser claro?

Já agradeço e muito de ante-mão a ajuda, que é sempre bem vinda. Espero poder contribuir no futuro com alguma demanda que eu saiba o "caminho das pedras".

[]´s

 
Postado : 14/12/2011 9:08 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

WLuiz, não entendi muito bem o que vc quer, mas acredito que vc poss resolver seu problema colocando, no local do gráfico correspondente ao intervalo, a fórmula (ou alguma variação dela):

=INDIRETO(CONCATENAR(" 'NOMEDAABAONDEESTAOOSDADOS'!A100:A";CONT.VALORES(A100:A100000)-CONTAR.VAZIO(A100:A100000)+100)

Ou ainda:

=DESLOC(A100 (ou A99, ou A101, precisaria da planilha para testar);0;0;CONT.VALORES(A100:A100000);1)

A Fórmula de cima eu utilizo para definir um intervalo dinâmico em uma caixa de Validação de Dados; já a fórmula de baixo eu uso para definir um intervalo dinâmico para Tabela Dinâmica.

Nunca utilizei isso em gráfico, mas acho que pode dar certo.

De qualquer forma, precisando estamos a disposição.

 
Postado : 19/12/2011 10:15 am
(@wluis)
Posts: 8
Active Member
Topic starter
 

Valeu Bruno,

Nesse final de semana resolvi o problema da dúvida 2, usando o =Desloc(). Agora posso navegar no gráfico usando uma barra de rolagem. Usei como exemplo o vídeo desse link (muito bom por sinal): http://www.youtube.com/watch?v=QZVza4MexH4 .

Já o problema 1 ainda persiste, e mesmo usando o Application.ScreenUpdating (configurando para false e posteriormente para true), a tela insiste em piscar a cada vez que a macro roda (é verdade que a a tela não se mexe mais, indo para onda são plotados as informações, mas continua a piscar como uma "Árvore de Natal"). Como a macro roda a cada segundo (usando Application.OnTime Now + TimeValue("00:00:01"), "nome_da_sub") fica difícil trabalhar.

Se alguém tiver alguma sugestão para o problema número um, será muito bem vindo.

Thanks.

 
Postado : 19/12/2011 10:38 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Fala WLuiz!

Cara.... Fantástico esse gráfico! Não sabia que dava para utilizar dessa forma. As fórmulas e os comandos eu conhecia, mas a grande sacada é juntar tudo para dar esse resultado. Muito bom mesmo!

Quanto ao problema 1, pensei, pensei... a única coisa que me ocorreu foi o seguinte (as vezes uso este artifício): Pegue 2 planilhas. Em uma você deixa a macro rodando e alimentando com os dados, apenas isso. Na outra planilha, que é onde você terá todas as informações e gráficos, você cria uma aba Banco de Dados para que ela puxe as informações da planilha que está rodando a macro; as abas seriam idênticas, ou seja, "A1" de uma é igual a "A1" da outra, "B1" = "B1", "B2" = "B2, "C1000" = "C1000", e assim sucessivamente. A lógica de fazer isso é que enquanto uma planilha roda a macro a outra fica livre para trabalhar e é alimentada apenas pelo link. Mas isso só vai funcionar (eu acho) se você abrir as duas planilhas em pastas de trabalho diferentes, pois quando são abertas 2 planilhas na mesma pasta de trabalho uma interfere na outra.

Enfim... Espero ter ajudado.

Abçs!!!

 
Postado : 22/12/2011 3:21 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Olá Wluiz!

Conseguiu resolver o problema? Se sim, diga como, pois é algo interessante de se saber. Deu certo a sugestão que enviei?

Abraços!

 
Postado : 27/12/2011 8:03 pm
(@wluis)
Posts: 8
Active Member
Topic starter
 

Bruno,

Desculpe a demora em responder. Fim de ano é dose (literalmente). Eu já havia feito as duas experiências:

A - Rodar a macro em uma planilha que esteja na mesma pasta de trabalho. Resultado: O problema continua, pois uma, como você disse, interfere na outra;
B - Rodar a macro em uma planilha que esteja em uma pasta de trabalho diferente (arquivo diferente). Nesse caso funciona, já que bastaria "linkar" as células. Essa é a possibilidade mais remota, depois que tiver desistido de encontrar uma solução par ao problema. Mas é uma possibilidade.

O que me parece é que o "Application.OnTime" interfere no "Application.ScreenUpdating", já que após a Macro ser executada, o OnTIme a chama de volta (após 1 segundo). Esse loop fica "eterno" até que o apareça o comando (acionado por um botão que chama a Macro para desligar o OnTime):

Application.OnTime EarliestTime:=Now + TimeValue("00:00:01"), Procedure:="Pressão", Schedule:=False.

Abaixo segue o código da Macro que insiste em continuar piscando a tela. Com o código talvez ajude a decifrar o problema.

Valeu pela ajuda, que é sempre bem vinda.

-------------------------------------
Sub Pressão()

'On Error Resume Next

Application.ScreenUpdating = False

v_linha = 111
v_coluna = 2

Do While Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna).Value <> ""
v_linha = v_linha + 1

Loop

Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 1).Value = Date
Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 2).Value = Time

Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna) 'Status
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 1).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 1) 'Data
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 2).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 2) 'Hora
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 3).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 3) 'Compra
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 4).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 4) 'Corr. C.
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 5).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 5) 'Venda
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 6).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 6) 'Corr. V.
Worksheets("Recepção & Base de Dados").Cells(v_linha, v_coluna + 7).Value = Worksheets("Recepção & Base de Dados").Cells(109, v_coluna + 7) 'Último IBOV"

'Application.ScreenUpdating = True

Application.OnTime EarliestTime:=Now + TimeValue("00:00:01"), Procedure:="Pressão"

Application.ScreenUpdating = True

End Sub

-------------------------------------

 
Postado : 28/12/2011 12:44 pm