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

Interação VBA com HTML, dúvida?

A Web está aí, não há como negar. Ela é onipresente em praticamente toda operação eletrônica realizada nos dias de hoje. Como não podia ser diferente, o Excel, ferramenta máxima para analistas e profissionais das mais diversas áreas do mercado precisa estar alinhado com esta necesssidade. E ele está! Neste forum, o debate é focado em expor dúvidas, sugestões, modelos de código e exemplos de uso do Excel na Integração com tecnologias Web.
Helder Petry
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Qua Out 18, 2017 3:33 pm

Interação VBA com HTML, dúvida?

Mensagem por Helder Petry »

ola, estou tentando fazer uma interação do vba com o html. Aonde inicio uma pagina, e coloco as informações no campo UF, puxando do Excel e clico em confirmar, até aqui tudo certo. Porém ao clicar em confirmar ele vai para uma outra tela, e nessa eu precisava fazer o download ("exportar Excel"), mas o vba não encontra o Id, o nome, (não encontra os document do html dessa nova tela).
minha duvida é se essa tem um comando que recarrega a pagina que esta aberta, ou outras sugestões.
depois disso não evolui. a ideia é fazer o download desse arquivo, se sabem como baixar em um endereço fixo.

site: https://sistemas.anatel.gov.br/stel/con ... ervico=010

Código: Selecionar todos

'Inclui referência ao Microsoft Internet Controls
Sub lReferenciaIE()
    Dim ObRef
    On Error Resume Next

    ThisWorkbook.VBProject.References.AddFromGuid "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 1, 1
End Sub

Sub lsPesquisar()
    'Inclui a referência se não houver
    lReferenciaIE
    
    Dim IE                  As InternetExplorer
    Dim lCidade             As String
    Dim lUF                 As String
    Dim lUltimaLinhaAtiva   As Long
    Dim lContador           As Long
        
    'Identifica a última célula ativa da lista
    lUltimaLinhaAtiva = Worksheets("Plan1").Cells(Worksheets("Plan1").Rows.Count, 1).End(xlUp).Row
    
    'Cria um objeto Internet Explorer
    Set IE = New InternetExplorer
        
    'Torna o objeto visível
    IE.Visible = True
    
    'Faz um loop por todas as linhas da planilha
    For lContador = 2 To lUltimaLinhaAtiva
        'Navega ao site
        IE.Navigate "https://sistemas.anatel.gov.br/stel/consultas/ListaEstacoesLocalidade/tela.asp?pNumServico=010"
        
        'Identifica se a página já foi totalmente carregada
        While IE.ReadyState <> READYSTATE_COMPLETE
        Wend
        sng = Timer
        Do While sng + 3 > Timer
        Loop
        
        'Carrega os dados de cidade e UF que serão preenchidos na página
        
        lUF = Range("A" & lContador).Value
        
        'Carrega os dados de cidade e UF na página e submente os dados do formulário
        IE.Document.all("pSiglaUF").Value = lUF 'coloca os dados da uf
        IE.Document.all("botaoFlatConfirmar").Click 'clica em confirmar
        IE.Document.all("botaoFlat&nbsp;&nbsp;ExportarExcel").Click
        'aqui da o erro, ele não realiza essa operação
        
        
        
    Next lContador
    
    MsgBox "Concluído!"
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.


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

Re: Interação VBA com HTML, dúvida?

Mensagem por PRMPOKER »

Boa noite, Helder, tudo bem?

A parte do HTML onde está seu botão é a seguinte:

Código: Selecionar todos


<td id="td">
<button type="button" id="botaoFlatConfirmar" onclick="if (critica('frmtela', 'True','', false,false, 'divparametro', this)) { consultar();; }" barraBotao="true" style="white-space: nowrap;background: buttonface url(/Apoio_SitarWeb/Includes/Interface/CoolBar/images/Confirmar.gif) 0px center no-repeat;  HEIGHT: 22px; FONT-FAMILY: Tahoma, Arial, Helvetica; FONT-SIZE: 8pt; FONT-COLOR: menutext; PADDING-LEFT: 12; MARGIN-LEFT: 0; " title="Confirmar">&nbsp;Confirmar&nbsp;</button>
</td>

Para efetuar o click, você pode utilizar a propriedade ID (id="botaoFlatConfirmar") e, utilizando o xpath, fazer o clique.

Código: Selecionar todos


Public Function getXPathElement(sXPath As String, objElement As Object) As HTMLBaseElement
Dim sXPathArray() As String

Dim sNodeName As String
Dim sNodeNameIndex As String
Dim sRestOfXPath As String
Dim lNodeIndex As Long
Dim lCount As Long

' Split the xpath statement
sXPathArray = Split(sXPath, "/")
sNodeNameIndex = sXPathArray(1)
If Not InStr(sNodeNameIndex, "[") > 0 Then
sNodeName = sNodeNameIndex
lNodeIndex = 1
Else
sXPathArray = Split(sNodeNameIndex, "[")
sNodeName = sXPathArray(0)
lNodeIndex = CLng(Left(sXPathArray(1), Len(sXPathArray(1)) - 1))
End If
sRestOfXPath = Right(sXPath, Len(sXPath) - (Len(sNodeNameIndex) + 1))

Set getXPathElement = Nothing
For lCount = 0 To objElement.ChildNodes().Length - 1
If UCase(objElement.ChildNodes().Item(lCount).nodeName) = UCase(sNodeName) Then
If lNodeIndex = 1 Then
If sRestOfXPath = "" Then
Set getXPathElement = objElement.ChildNodes().Item(lCount)
Else
Set getXPathElement = getXPathElement(sRestOfXPath, objElement.ChildNodes().Item(lCount))
End If
End If
lNodeIndex = lNodeIndex - 1
End If
Next lCount
End Function

Aqui postei a função, que você pode colocar em um módulo e então chamar, passando como parâmetro o xpath e também o id do elemento, conforme abaixo:

Código: Selecionar todos


Set ele = getXPathElement("/table/tbody[3]/tr[1]/td[2]/input[1]", HTMLDoc.getElementById("botaoFlatConfirmar"))
	If Len(ele) > 0 Then
		ele.Click
	End If

Aqui você informa o xpath do objeto: (getXPathElement("/table/tbody[3]/tr[1]/td[2]/input[1]")
Aqui você informa o ID do elemento a ser acessado: (HTMLDoc.getElementById("botaoFlatConfirmar")))

Só confirma o xpath direitinho. O ID já coloquei para você.

Dá uma olhada e diz se te ajudou.

Um abraço!


Helder Petry
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Qua Out 18, 2017 3:33 pm

Re: Interação VBA com HTML, dúvida?

Mensagem por Helder Petry »

Opa, tudo certo sim.
muito obrigado pela ajuda. O botão("botaoFlatconfirmar") eu já tinha conseguido executar com esse comando:

Código: Selecionar todos

IE.Document.all("botaoFlatConfirmar").Click
o que eu não consegui era após clicar no botão confirmar ele abre uma outra aba: e nessa aba quero clicar no botão exportar excel com a id("botaoFlat&nbsp;&nbsp;ExportarExcel")
Imagem

tentei utilizar esse comando que você passou para esse botão, coloquei o "Public Function getXPathElement" no modulo, preenchi o xpath e coloquei o nome da id do botão exportar excel:

Código: Selecionar todos

Set ele = getXPathElement("html/body[1]/form[1]/div[2]/table[5]/tbody[1]/tr[1]/td[3]/input[1]", HTMLDoc.getElementById("botaoFlat&nbsp;&nbsp;ExportarExcel")
    If Len(ele) > 0 Then
        ele.Click
    End If
e não deu certo, não sei o que pode estar errado, quando ele vai para essa aba ele não encontra nenhum botão, tentei clicar em outros botões e nada, ai penso que o excel não carregou o html dessa aba, pois não encontra o id e nem fazendo o xpath.
Anexos
anatel.png
anatel.png (24.88 KiB) Exibido 14390 vezes


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

Re: Interação VBA com HTML, dúvida?

Mensagem por PRMPOKER »

Bom dia Helder, tudo bem?

Tenta substituir:
"botaoFlat&nbsp;&nbsp;ExportarExcel"

por:
"botaoFlat ExportarExcel"

Lembra que dentro das aspas duplas, no HTML, o conteúdo é uma string, então o código vai interpretar LITERALMENTE o que estiver escrito ali. Deixa os espaços em branco sem o comando &nbsp;&nbsp; e acredito que vai funcionar.

Testa aí e nos diga se deu certo.

Um abraç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.


Helder Petry
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Qua Out 18, 2017 3:33 pm

Re: Interação VBA com HTML, dúvida?

Mensagem por Helder Petry »

não deu certo. utilizei assim:

Código: Selecionar todos

Set ele = getXPathElement("html/body[1]/form[1]/div[2]/table[5]/tbody[1]/tr[1]/td[3]/input[1]", HTMLDoc.getElementById("botaoFlat ExportarExcel"))
   If Len(ele) > 0 Then
        ele.Click
    End If
sobre o o botão ("botaoFlat ExportarExcel") ser do type:button e não input tem influencia?


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

Re: Interação VBA com HTML, dúvida?

Mensagem por PRMPOKER »

Olá Helder...

Então, penso que o problema possa estar no xpath, pois o a questão do button não tem influência, pois o type é mesmo input.

Tem duas coisas que notei:

aqui:
Set ele = getXPathElement("html/body[1]/form[1]/div[2]/table[5]/tbody[1]/tr[1]/td[3]/input[1]", HTMLDoc.getElementById("botaoFlat ExportarExcel"))

Retira a primeira tag (html) e deixa assim:

Set ele = getXPathElement("/body[1]/form[1]/div[2]/table[5]/tbody[1]/tr[1]/td[3]/input[1]", HTMLDoc.getElementById("botaoFlat ExportarExcel"))

Há nesta tela pelo menos cinco buttons, talvez tu não estejas referenciando o button certo. Tenta trocar o parâmetro de identificação (input[1]). Veja qual a ordem correta dele no html (hierarquia) e acerte isso.

Pela disposição dele na tela, provavelmente seja input[5]. Não consigo acessar o HTML daqui onde estou (trabalho), mas acho que o caminho é esse.

De onde vocẽ extraiu o xpath?

Um abraço!


Helder Petry
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Qua Out 18, 2017 3:33 pm

Re: Interação VBA com HTML, dúvida?

Mensagem por Helder Petry »

tentei mas não deu certo,
sou meio novo na área, e eu montei olhando o html por completo, seguindo a hierarquia visível, e cheguei ao resultado utilizado.
encontrei um meio de copiar o xpath do botão, porém ele só me retorna esse resultado
"//*[@id="botaoFlat  ExportarExcel"]
não sei aonde consigo copiar ele pronto completo


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

Re: Interação VBA com HTML, dúvida?

Mensagem por PRMPOKER »

Helder,

Tenta instalar e utilizar esta ferramenta: http://xpath.alephzarro.com/

Ainda acho que o problema está no xpath.

Não tenho como testar aqui, senão já fazia para você.

Um abraço!


Helder Petry
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Qua Out 18, 2017 3:33 pm

Re: Interação VBA com HTML, dúvida?

Mensagem por Helder Petry »

meu mozilla firefox esta atualizado e não é compatível com a versão 56. estou tentando outras extenções e xpath porem ainda sem sucesso


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

Re: Interação VBA com HTML, dúvida?

Mensagem por PRMPOKER »

Boa noite, Helder...

Tenta utilizar o seguinte xpath:

Set ele = getXPathElement("/html/body/form/div[2]/table[7]/tbody/tr/td[3]/button
", HTMLDoc.getElementById("botaoFlat ExportarExcel"))

Testa aí e me diz o resultado.

Um abraç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.


Responder