Blog

Postado em em 10 de setembro de 2021

Série Automação Web Aula5 – Tratamento de Erros (On Error GoTo)

Essa é a Série Automação Web Aula5 e nessa aula eu vou te ensinar algo muito importante que é o tratamento de erros no VBA.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a quinta aula da Série Automação Web em VBA (Série Automação Web Aula5) e nessa aula nós vamos continuar com o web scraping no VBA, só que vamos abordar como tratar erros no VBA.

Como você deve saber nem todo código vai rodar 100%, em alguns casos vamos ter alguns erros e nós vamos conseguir fazer o tratamento de erros no VBA.

Esse tratamento vai ser feito com o On Error GoTo no VBA para que sempre que um erro ocorra no seu código, nós possamos escrever um código para ser executado ao invés do código parar de rodar.

Então vamos poder criar um código para esperar um determinado tempo, pois como você deve saber algumas páginas na internet não atualizam ou não abrem de forma instantânea. Com isso, erros poderiam ser gerados, e devemos tratá-los para que o código flua normalmente.

Temos, portanto, que esperar um tempo até que tudo da página fique visível/carregado para dar continuidade ao código.

Sub ComparadorDePreco()


Set objIE = CreateObject("InternetExplorer.Application")

objIE.Visible = True

'Buscando o preço na Amazon
objIE.Navigate "https://www.amazon.com.br/Fritadeira-sem-%C3%93leo-Mondial-AF-30I/dp/B07WFHZQ2T/ref=sr_1_1"

PassarErroEsperar:

On Error GoTo Esperar
precoProdutoAm = CDbl(Replace(objIE.document.getElementById("priceblock_ourprice").innerText, "R$ ", ""))
On Error GoTo 0


'Buscando o preço nas Lojas Americanas
objIE.Navigate "https://www.americanas.com.br/produto/204662938"

PassarErroEsperar1:
 
On Error GoTo Esperar1
precoProdutoLA = CDbl(Replace(objIE.document.getElementsByClassName("src__BestPrice-sc-1jvw02c-5 cBWOIB priceSales")(0).innerText, "R$ ", ""))
On Error GoTo 0


'Buscando o preço na Magazine Luiza
objIE.Navigate "https://www.magazineluiza.com.br/fritadeira-eletrica-sem-oleo-air-fryer-mondial-family-iv-af-30i-preta-35l-com-timer/p/023386000/ep/frel/"

PassarErroEsperar2:
 
On Error GoTo Esperar2
precoProdutoML = CDbl(objIE.document.getElementsByClassName("price-template__text")(0).innerText)
On Error GoTo 0


menorPreco = WorksheetFunction.Min(precoProdutoAm, precoProdutoLA, precoProdutoML)

objIE.Quit

Set objIE = Nothing

Exit Sub
 

Esperar:
    Application.Wait (Now + TimeValue("00:00:01"))
    Resume PassarErroEsperar
 

Esperar1:
    Application.Wait (Now + TimeValue("00:00:01"))
    Resume PassarErroEsperar1


Esperar2:
    Application.Wait (Now + TimeValue("00:00:01"))
    Resume PassarErroEsperar2

End Sub

Explicação do código acima (ComparadorDePreco):

  • Vamos “setar” uma variável chamada “objIE” que representará o objeto do programa do Internet Explorer em si, que vai ser criado no começo
  • Vamos fazer com que o objIE fique visível, para que possamos ver o resultado do código nele, colocando sua propriedade Visible como True
  • Enfim vamos fazer o Internet Explorer de fato ir até a página (método Navigate) informada pelo link que será representado pelo link do produto como texto. Ele será responsável por entrarmos nesse site específico e buscar o valor do produto daquela página, que primeiramente representa o produto na loja da Amazon
  • Antes de armazenar o que for encontrado pela navegação do objIE para o site da Amazon, vamos acrescentar uma label “PassarErroEsperar:”, que representa o começo da estrutura do nosso tratamento de erro (label de retorno do erro). Lembrando que o nosso erro se dá pelo fato de o código não dar tempo suficiente da página ser carregada para pegar o preço do produto
  • Na parte debaixo do código ficará a nossa label propriamente dita de tratamento do erro (label de ida). Observe:
  • A ordem é a seguinte: se o erro acontecer, o comando “On Error GoTo Esperar” vai forçar o código a pular todas as linhas imediatamente abaixo dela até onde está a nossa label “Esperar:”, lá embaixo
  • Estando lá embaixo, vamos fazer o Excel esperar 1 segundo com o comando Wait associado com a função Now (função AGORA no Excel) somada a 1 segundo dado pela função TimeValue, e através do comando “Resume” voltaremos à label inicial de PassarErroEsperar, para que o código possa prosseguir sem erro, com a página já carregada completamente.
  • O comando que fecha o nosso tratamento é o “On Error GoTo 0”, que é responsável por desabilitar qualquer comando de tratamento de erros aplicado no código, e retornará ao tratamento de erros normal do VBA, com as caixas de erro e as justificativas. Resumidamente atua autorizando os erros acontecerem e desabilita o comando aplicado de “On Error GoTo Label” criado anteriormente, porque podem existir outros erros além desses podemos querer entendê-los.
  • Vamos repetir essa mesma estrutura de tratamento de erros para o precoProdutoLA e para o precoProdutoML, com outras Labels (PassarErroEsperar1, Esperar1, PassarErroEsperar2 e Esperar2)
  • Vamos armazenar na variável precoProdutoAm o texto interno obtido do elemento de ID “priceblock_ourprice” da página acessada (através do link do produto da Amazon) pelo Internet Explorer (objIE)
  • Repare que usamos uma função para converter para número, a função CDbl (converter para Double no VBA), porque para essa variável é retornado um texto por padrão. Além disso, tivemos que substituir informações no VBA: “R$ “ por “” (nada), através da função Replace no VBA.
  • Em seguida vamos navegar para o site do produto nas Lojas Americanas, e repetir o processo descrito acima, e armazenaremos o valor na variável precoProdutoLA.
  • Apenas se atente ao fato de que no caso das Lojas Americanas, o produto é acessado pela sua classe “src__BestPrice-sc-1jvw02c-5 cBWOIB priceSales” (ByClassName), e ele é o primeiro elemento da classe: correspondência 0.
  • Em seguida vamos navegar para o site do produto na loja Magazinie Luiza, e repetir o processo descrito acima, e armazenaremos o valor na variável precoProdutoML, com a exceção da função de tirar o “R$ “, porque nesse caso o número vem como texto, sem o “R$”.
  • Apenas se atente ao fato de que no caso das Lojas Americanas, o produto é acessado pela sua classe ” price-template__text” (ByClassName), e ele é o primeiro elemento da classe: correspondência 0.
  • Tendo então os três valores buscados em cada loja, vamos fazer a comparação de qual é o menor valor entre eles, usando a função MÍNIMO (Min). O menor valor será armazenado na variável “menorPreco”
  • Em seguida aplicaremos o método Quit na variável que representa o Internet Explorer (objIE) para que ele seja fechado
  • Por boas práticas vamos esvaziar a variável “objIE” (Nothing) para que ela não fique armazenada o tempo inteiro na memória do computador enquanto o arquivo está aberto no Excel
  • Se encerra o código

Conclusão da Série Automação Web Aula5

Nessa aula demos continuidade à série de Web scraping VBA, e o principal tópico foi mostrar como tratar erros no VBA, para que você aplique nos seus outros códigos.

Esse tratamento vai ser feito com o On Error GoTo no VBA para que sempre que um erro ocorra, nós possamos escrever um código de alternativa para ser executado ao invés do código parar de rodar e exibir uma mensagem, como normalmente acontece.

No exemplo mostrado nós mostramos como faz para esperar um tempo no VBA utilizando a função AGORA no VBA (função NOW no VBA) + TimeValue no VBA que vai permitir fazer uma soma da hora atual com um tempo específico.

Até o próximo post da série! Fique ligado no nosso canal do Youtube para mais conteúdo de Excel e VBA toda semana! Um abraço!

Hashtag Treinamentos

Para acessar outras publicações de VBA, clique aqui!


Quer aprender mais sobre VBA com um Minicurso Gratuito?


Quer participar do maior evento de Power BI da América Latina? Só preencher seu e-mail abaixo que sua vaga estará garantida!