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

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

Mensagem por Helder Petry »

não funcionou. vou colocar o modulo aqui pra ver se tem um erro.

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

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

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
            
                
        While ie.ReadyState <> READYSTATE_COMPLETE
        Wend
        sng = Timer
        Do While sng + 3 > Timer
        Loop
           
        
       Set ele = getXPathElement("/html/body/form/div[2]/table[7]/tbody/tr/td[3]/button", HTMLDoc.getElementById("botaoFlat ExportarExcel"))
       If Len(ele) > 0 Then
       ele.Click
    End If
        
    Next lContador
   
    MsgBox "Concluído!"
End Sub
eu inspecionei as variáveis no Excel que ele carrega, e la encontrei o botão dentro do item 256("inputelement"), "form"/"all" item 207. Não sei se utilizar isso pra chegar ao botã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: Interação VBA com HTML, dúvida?

Mensagem por PRMPOKER »

Bom dia Helder, tudo bem?

Pelo que vejo aqui, falta vocẽ declarar a variável HTMLDoc na sua SublsPesquisar.

Adicione a referência: Microsoft HTML Object Library

Declare a variável, juntamente com as demais variáveis, no início do bloco:

Dim HTMLDoc As HTMLDocument

A partir dai, daria até para pegar o objeto por ID mesmo, conforme abaixo:

HTMLDoc.getElementById("botaoFlat ExportarExcel").Click

ou ainda usar a função que te passei.

Acho que seria isso, estou sem condições de testar.

Boa sorte e um abraço!


Nill2016
Colaborador
Colaborador
Mensagens: 32
Registrado em: Qua Mai 09, 2018 11:34 am

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

Mensagem por Nill2016 »

Amigos eu acompanhei esta dúvida pois também cheguei em uma situação destas e não consigo clicar no link que aparece na tela usando o vba no excel. Já peguei muitas informações sobre este tema mas nenhuma deu resultado. Estou deixando um print das 3 formas que tentei buscar acessar o link através de um evento click, mas sem sucesso. Se alguém puder ajudar agradeço.
Anexos
Link3.png
Link3.png (182.34 KiB) Exibido 7202 vezes
Link2.png
Link2.png (186.25 KiB) Exibido 7202 vezes
Link1.png
Link1.png (265.21 KiB) Exibido 7202 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 »

Boa noite Nill2016

Por favor, mostra o código que tu estás utilizando para acessar o elemento para que possamos ter uma ideia e te ajudar.

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.


Nill2016
Colaborador
Colaborador
Mensagens: 32
Registrado em: Qua Mai 09, 2018 11:34 am

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

Mensagem por Nill2016 »

PRMPOKER segue o código que estou adaptando. Quando você for entrar no site ele via te direcionar para a tela inicial que pede senha, mas é só clicar no link à esquerda "Veja lista de programas disponíveis" que vai abrir uma tela com um vários botões, clique no botão "Propostas" que logo abaixo aparece um link " Consultar propostas" que vai abrir a tela que inserindo o valor e clicando em consulta vai aparecer a tela com os links que postei nos prints. Agradeço pela ajuda desde já.

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 lsConsultaObjetoPropostaSiconv()
    'Inclui a referência se não houver
    lReferenciaIE
    
    Dim ie                  As InternetExplorer
    Dim lProposta           As String
    Dim lUltimaLinhaAtiva   As Long
    Dim lContador           As Long
    Dim objIE               As Object
    Dim HTMLDoc             As HTMLDocument
    
    'Identifica a última célula ativa da lista
    lUltimaLinhaAtiva = Worksheets("Plan4").Cells(Worksheets("Plan4").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 Siconv
        ie.Navigate "https://www.convenios.gov.br/siconv/proposta/ConsultarProposta/ConsultarProposta.do"
                    
        'Identifica se a página já foi totalmente carregada
        While ie.ReadyState <> READYSTATE_COMPLETE
        Wend
        
        'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
        'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
        'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
        'mais rápida a execução.
        sng = Timer
        Do While sng + 3 > Timer
        Loop
        
        'Carrega os dados da proposta que serão preenchidos na página
        lProposta = Range("A" & lContador).Value
                
        'Carrega os dados da proposta na página e submete os dados do formulário
        ie.Document.all("numeroProposta").innertext = lProposta
        ie.Document.forms("consultarPropostaPreenchaOsDadosDaConsultaConsultarForm").submit
       
        'Identifica se a página já foi totalmente carregada
        While ie.ReadyState <> READYSTATE_COMPLETE
        Wend
         
        'Navega no link até a proposta
        '<a href="/siconv/ConsultarProposta/ResultadoDaConsultaDePropostaDetalharProposta.do?idProposta=1328263&destino=&idConvenio="> - Clicar neste para ir para a proposta
        
                          
        'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
        'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
        'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
        'mais rápida a execução.
        sng = Timer
        Do While sng + 3 > Timer
        Loop
       
        'Faz um loop pelos objetos do tipo table na página e procura pelo campo Situação.
        'Em seguida busca pela segunda coluna da linha de Situação e armazena esta informação diretamente na coluna B da linha da planilha
        For Each i In ie.Document.body.getElementsByTagName("table")
            If InStr(i.innertext, "Objeto do Convênio") > 0 Then
                For Each l In i.getElementsByTagName("tr")
                    If InStr(l.innertext, lProposta) Then
                        Range("B" & lContador).Value = l.getElementsByTagName("td")(2).innertext 'https://stackoverflow.com/questions/47702605/excel-vba-extracting-inner-text-from-href-tag
                    End If
                Next l
            End If
        Next i
    Next lContador
    
    MsgBox "Concluído!"
End Sub


Nill2016
Colaborador
Colaborador
Mensagens: 32
Registrado em: Qua Mai 09, 2018 11:34 am

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

Mensagem por Nill2016 »

Consegui resolver meu problema com o Selenium. Vou continuar estudando para aprender mais sobre esta ferramenta.


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