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

Executar uma função quando o site terminar de carregar.

Dúvidas gerais sobre Excel
Juinkus
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Seg Out 22, 2018 9:17 am

Executar uma função quando o site terminar de carregar.

Mensagem por Juinkus »

Bom dia pessoal!

Estou com uma dúvida em relação a uma macro. Resumidamente a mesma funciona da seguinte forma:

1 - Ao clicar no botão o aplicativo da internet explorer irá executar;
2 - Acessará o site "www.e-danfe.com.br"
3 - Digitará no espaço em branco a chave de acesso de uma nota fiscal;
4 - Clicará no botão para prosseguir.

Bom, eu gostaria de saber se existe alguma função que permita que "uma determinada função só seja executada quando o site terminar de carregar", este problema se deu por conta de que, quando eu preencho o campo com o número da chave de acesso e clico em prosseguir, ele demora um pouco para carregar a outra página. Eu consegui suprir esta necessidade usando a função "Application.wait", porém, ela não foi muito viável pois, quando a internet fica um pouco lenta a função "detecta" isto, fazendo com que a função continue e acaba por "quebrar" a macro.

Segue abaixo a macro:

Private Sub CommandButton1_Click()
Dim IE As Object
Dim Button As Object
Set IE = CreateObject("internetexplorer.application")
IE.Visible = True
'---------------------------
For i = 2 To 1000
If Cells(i, 2) <> "" Then
With IE
.Visible = True
.Navigate ("www.e-danfe.com")
While .busy Or .readystate <> 4:
DoEvents:
Wend
.Document.getelementbyid("chave-input").Focus
.Document.getelementbyid("chave-input").Value = Cells(i, 2)
.Document.all("continuarAba1").Click
While .busy Or .readystate <> 4:
DoEvents:
Wend
Debug.Print .locationURL
End With
'---------------------------
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 5
newSecond2 = Second(Now()) + 20
waitTime = TimeSerial(newHour, newMinute, newSecond)
waitTime2 = TimeSerial(newHour, newMinute, newSecond2)
Application.Wait waitTime

'---------------------------
For Each Button In IE.Document.GetElementsByClassName("download-nf btn btn-success")
Button.Click
Next
Application.Wait waitTime2
Application.SendKeys "%s", True
'---------------------------
Else
MsgBox "Processo conclu?do com sucesso!"
Exit Sub
End If
Next
End Sub

Desde já agradeço!


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.


Avatar do usuário
PRMPOKER
Consultor
Consultor
Mensagens: 206
Registrado em: Ter Dez 04, 2012 8:57 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por PRMPOKER »

Prezados, Bom dia!

Caro Juinkus ,

Controlar o carregamento do site não é uma opção com o controle "Application.wait", pois o mesmo não testa o status da requisição http, e sim, apenas determina um tempo a esperar antes de seguir com o código.

Utilize em suas rotinas um método de verificação do STATUS de carregamento da requisição, o ReadyState. Faça um loop que irá verificar o status de carregamentoe, enquanto não estiver carregado, irá desafogar os processos do windows:

Código: Selecionar todos

Do While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Se você analisar, você já está utilizando este método na sua rotina. ;)

Coloca este loop em substituição ao que está em amarelo na sua rotina. Tenta alterar para esta forma, testa, e me diz se conseguiu.

Um abraço!


Paulinho Monteiro.


Juinkus
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Seg Out 22, 2018 9:17 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por Juinkus »

Boa tarde Paulo!

Primeiramente gostaria de agradecer pela ajuda, muito obrigado msm! =D

Eu fiz oq vc pediu e a macro não acusou erros, mas agora ele carrega a chave de acesso e não clica mais no próximo botão.

macro:

Private Sub CommandButton1_Click()
Dim IE As Object
Dim Button As Object
Set IE = CreateObject("internetexplorer.application")
With IE
.Visible = True
.Navigate ("www.e-danfe.com")
While .Busy Or .readyState <> 4:
DoEvents:
Wend
.Document.getelementbyid("chave-input").Focus
.Document.getelementbyid("chave-input").Value = "29181012469182000123550010000000561000000560"
.Document.all("continuarAba1").Click
While .Busy Or .readyState <> 4:
DoEvents:
Wend
Debug.Print .locationURL
End With
'---------------------------
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
'---------------------------
For Each Button In IE.Document.GetElementsByClassName("download-nf btn btn-success")
Button.Click
Next
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Application.SendKeys "%s", True
'---------------------------
End Sub


Avatar do usuário
PRMPOKER
Consultor
Consultor
Mensagens: 206
Registrado em: Ter Dez 04, 2012 8:57 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por PRMPOKER »

Prezados, Boa Noite!

Caro Juinkus ,

Tentei testar seu código, mas não possuo uma chave de NF, então, não tenho como seguir.

Vamos tentar algumas coisas aqui?

Inicialmente, o método de verificação de carregamento da requisição HTML daria sim, conta do recado, mas algumas vezes nem mesmo a lógica, tem lógica! Kkkkkkkk...

Nos meus projetos onde tenho essa necessidade, utilizo da seguinte maneira

Código: Selecionar todos

Do While oBrowser.Busy
	DoEvents
Loop
Do
Loop Until oBrowser.readyState = READYSTATE_COMPLETE
Exatamente nesta ordem.
Porém, já tive casos onde foi necessário utilizar um temporizador sim. E neste caso, te aconselho a utilizar uma FUNÇÃO (Public) que pode ser reaproveitada em qualquer parte do teu projeto, além de te deixar um código mais enxuto:
Insira este código abaixo em um novo módulo.

Código: Selecionar todos

Public Function WaitingLoad(ByVal pSeconds As Integer) As Boolean
    Dim Start As Double
    Start = VBA.Timer
    Do While Timer < Start + pSeconds: DoEvents: Loop
    WaitingLoad = True
End Function
Após, chame a função, passando como parâmetro a quantidade de segundos que você desejar:

Código: Selecionar todos

Call WaitingLoad(2) ' Aqui estamos definindo 2 segundos de espera
Sugiro que utilize os dois loops e em seguida, a função WaitingLoad.

Tente fazer sua alteração e nos conte se funcionou.

Se me passares um modelo da planilha, posso tentar ajudar.

Um abraço.

Paulinho Monteiro.


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.


Juinkus
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Seg Out 22, 2018 9:17 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por Juinkus »

Boa noite meu amigo PRMPOKER!

Primeiramente gostaria de pedir desculpas por não te responder antes, pois aqui no trabalho está uma correria kkkk

Meu amigo, eu testei aqui o que você pediu e também estudei sobre os mesmos pela lógica realmente era para funcionar mas como você mesmo disse "Algumas vezes nem mesmo a lógica, tem lógica" kkkkkkkkk

Quando eu depurei o mesmo para verificar o que estava acontecendo, o mesmo ficou em um Loop eterno mesmo o site já ter carregado.

Vou deixar em anexo a planilha para que você possa analisar, e agradeço desde já cara porque eu já estou ficando doido kkkkk

VLW!
Anexos
Planilha.rar
Planilha
(17.35 KiB) Baixado 276 vezes


Avatar do usuário
PRMPOKER
Consultor
Consultor
Mensagens: 206
Registrado em: Ter Dez 04, 2012 8:57 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por PRMPOKER »

Prezados, Bom dia!

Caro Juinkus, não esqueci de você, apenas estou um pouco atarefado, mas pretendo te responder com a solução hoje a noite.

Há duas maneiras de fazer isso: abrindo o browser e manipulando o IE ou por requisição MSXML2, o que certamente é a melhor opção, já que o que você precisa é fazer o download da DANFE, correto?

Mais tarde quando eu estiver em casa eu te passo um exemplo.

Grande abraço!

Paulinho Monteiro.


Juinkus
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Seg Out 22, 2018 9:17 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por Juinkus »

Boa tarde meu amigo!

Tranquilo meu amigo eu fico no aguardo, forte abraço!


Avatar do usuário
PRMPOKER
Consultor
Consultor
Mensagens: 206
Registrado em: Ter Dez 04, 2012 8:57 am

Re: Executar uma função quando o site terminar de carregar.

Mensagem por PRMPOKER »

Prezados, Boa tarde!

Caro Juinkus, finalmente, hehehehehe...

Seguindo a linha que eu havia comentado mais cedo, fiz aqui uma planilha com duas soluções. Ao abrir, vais ver que coloquei dois botões de comando para chamar as duas rotinas mas não mexi no seu userform.

A primeira rotina abre o IE e executa todo o processo. Note que modifiquei a forma como ele requisita o http, pois nestes casos de interação com a web, há caminhos muito mais interessantes do que abrir o browser, instanciar e interagir com os elementos. Este site faz a requisição via get e manda a chave da DANFE na URL, possibilitando assim este tipo de solução.

Veja que basta que coloques todas as DANFES que pretendes consultar, conforme seu próprio modelo, na planilha e que execute em seguida, os códigos.

No primeiro exemplo, terás um contratempo: ao enviar o sendkeys para executar o download, abrirá uma janela de confirmação do processo, o que exigirá outro sendkeys. Parei aqui e deixo por tua conta.

Por outro lado, desenvolvi uma segunda rotina que vai fazer o download diretamente, sem que precises abrir nenhuma janela.

Veja que só precisarás informar na célula D2 o caminho completo da pasta onde queres salvar teus arquivos.

Na coluna C, receberás o retorno VERDADEIRO, quando o donwload foi feito com sucesso ou FALSO quando houver alguma falha.

Terás também uma INPUTBOX para informar quantos registros desejas processar, já que poderás em algum momento ter milhares de consultas a fazer e por conveniência, decidas fazer somente em partes.

Dá uma avaliada se a solução te atende.

Um abraço.

Paulinho Monteiro.
Anexos
PlanilhaII.rar
(29.71 KiB) Baixado 328 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.


Responder