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

Integração VBA x WEB site em ASP.NET

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.
LGustavoFerreira
Colaborador
Colaborador
Mensagens: 15
Registrado em: Ter Jul 09, 2019 2:43 pm

Integração VBA x WEB site em ASP.NET

Mensagem por LGustavoFerreira »

Prezados,

Meu conhecimento em linguagem de programação é bem básico e tudo o que fiz até agora foi lendo o forum.
Tenho uma planilha que preenche um ficha e os dados dessa ficha é retirado de um site da intranet.
Devido a grandes erros de digitação a solução seria coletar esses dados automaticamente.

Então, seguindo os passos eu fiz assim:

Peguei o nome dos elementos contido no site:

Código: Selecionar todos

<td class="ParamLabelCell"><label for="ReportViewerControl_ctl04_ctl03_txtValue"><span>Lançamento</span></label></td>
<td class="ParamEntryCell" style="padding-right: 0px;">
<div id="ReportViewerControl_ctl04_ctl03" data-parametername="order">										<input name="ReportViewerControl$ctl04$ctl03$txtValue" class="null" id="ReportViewerControl_ctl04_ctl03_txtValue" type="text" size="30" value="">
</div>
</td>
Esses elementos são as celular aonde eu tenho que digitar os eu procuro, ai eu criei esse codigo abaixo:

Código: Selecionar todos

Sub BuscaDados()
Dim IE As Object
Dim iLin As Long
Dim sTabela As String
Dim Lanc As String
Dim Fase As String

iLin = 2

    'referenciando a célula que eu vou pegar os dados
     Lance = Range("A1").Value
     Fase = Range("A2").Value
    
    'acessando o site 
    Set IE = CreateObject("internetexplorer.application")
    IE.Visible = false
    IE.navigate "http://br001vs01081/Report/Pages/ReportViewer.aspx?%2fSC%2fACU%2fFAB%2fTechnical_Data&rs:Command=Render"
 
    Do Until IE.readyState = READYSTATE_COMPLETE
    Loop
 
   'preenchendo os campos do site com os valores das células
    IE.document.all("ReportViewerControl$ctl04$ctl03$txtValue").innerText = Lance
    IE.document.all("ReportViewerControl$ctl04$ctl05$txtValue").innerText = Fase
    IE.document.all("ReportViewerControl_ctl04_ctl00").form.all("ReportViewerControl_ctl04_ctl00").Click

Até essa parte tudo ok!
Coleta as informações digitada na planilha e envia para o site.

Agora vem a parte complicada que não estou conseguindo.

Inspecionando o elemento que foi dado o resultado eis que eu tenho:

Código: Selecionar todos

<tr valign="top">

'Primeiro elemento com o resultado que eu quero que é nesse caso (ST15253418)
<td class="Ab5f8c21a956e4f86accf3fbbc45669fc353c" style="height: 12mm;">
<div style="width: 30.24mm; overflow: hidden; min-width: 30.24mm;">
<div class="Pc4f57b4673144034b0d9648d1fb3cf85_1_r17 tdResizable" lang="en-US" style="width: 100%; display: flex; -webkit-flex-flow: row;">
<div class="Ab5f8c21a956e4f86accf3fbbc45669fc353 cannotGrowTextBoxInTablix cannotShrinkTextBoxInTablix" id="Pc4f57b4673144034b0d9648d1fb3cf85_1_356iT0R0x0_aria" style="position: relative; max-width: 30.24mm; justify-content: flex-start; -webkit-justify-content: flex-start;">
<div style="width: 30.24mm; min-width: 30.24mm;">ST15253418</div>
</div>
</div>
</div>
</td>

'Segundo elemento que tem o resultado (SF53001E1)
<td class="Ab5f8c21a956e4f86accf3fbbc45669fc357c">
<div style="width: 30.24mm; overflow: hidden; min-width: 30.24mm;">
<div class="Pc4f57b4673144034b0d9648d1fb3cf85_1_r17 tdResizable" lang="en-US" style="width: 100%; display: flex; -webkit-flex-flow: row;">
<div class="Ab5f8c21a956e4f86accf3fbbc45669fc357 cannotGrowTextBoxInTablix cannotShrinkTextBoxInTablix" id="Pc4f57b4673144034b0d9648d1fb3cf85_1_360iT0R0x0_aria" style="position: relative; max-width: 30.24mm; justify-content: flex-start; -webkit-justify-content: flex-start;">
<div style="width: 30.24mm; min-width: 30.24mm;">SF53001E1</div>
</div>
</div>
</div>
</td>

Com esses dados em mãos eu fiz o seguinte:

Código: Selecionar todos

'buscando as informações no site
    Set tabela = IE.document.all.tags("tr")
    For i = 0 To tabela.Length - 1
    sTabela = Replace(tabela.Item(i).innerText, Chr(10), "")
    If Not IsNumeric(Left(sTabela, 1)) Then
    If sTabela <> "" Then
    Cells(iLin, "A").Value = sTabela
    iLin = iLin + 1
   End If
  End If
Next
Não me trouxe nada do que eu queria.

Tentei também:

Código: Selecionar todos

    For Each htmlEle In ieObj.Document.getElementsByClassName("Afcb84803ac6f40feb09f4c14372db9b3111c")(0).getElementsByTagName("div")
       With ActiveSheet
       .rang("L" & i).Value = htmlEle.Children(0).textContent
       .rang("M" & i).Value = htmlEle.Children(1).textContent
       .rang("N" & i).Value = htmlEle.Children(2).textContent
       .rang("O" & i).Value = htmlEle.Children(3).textContent
       .rang("P" & i).Value = htmlEle.Children(4).textContent
       .rang("Q" & i).Value = htmlEle.Children(5).textContent
       End With
       i = i + 1
       
    Next htmlEle
    
    
End Sub
Também não me trouxe nada.

ai eu pergunto, onde eu estou errando?
Será que eu não consigo buscar os dados pq essa página contém frame? (eu acho)
quando uso um tipo de busca ele me apresenta o resultado dos nome dos elementos onde eu preencho o valor no inicio da página e não me mostra o resultado da busca e nem o que está preenchido na busca.

Alguem poderia me dar essa consultoria?
lembrando que até pensei em pesquisar para fazer em selenium, porém essa planilha será compartilhada aqui no trabalho e não tenho permissão de instalar nada na máquina.

Quem puder me ajudar eu agradeço

22-998565002 Gustavo.


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.


LGustavoFerreira
Colaborador
Colaborador
Mensagens: 15
Registrado em: Ter Jul 09, 2019 2:43 pm

Re: Integração VBA x WEB site em ASP.NET

Mensagem por LGustavoFerreira »

Resolvi parte do meu problema utilizando o SendKeys, porém tenho um problema maior.
O fato de utilizar ctrl+c e depois colar na planilha me cola os dados da pagina uma hora em cada lugar.
Lembrando que eu não consigo aplicar o comando javascript para me trazer os textos da pagina que eu quero.
do mesmo modo que eu não consigo trazer eles buscando pelo elemento.
então consigo essa solução usando o sendkeys.
mas dependendo da busca que eu faço ele cola muitas células em branco, e como eu quero referenciar outra planilha com os dados colado eu não consigo ter exatidão
Ai eu terei um trabalho enorme realizando comandos de "Se", "Procv" e "Proch" na parte colada para fazer uma limpeza e organizar os dados que saem tudo maluco.

Alguma dica?


LGustavoFerreira
Colaborador
Colaborador
Mensagens: 15
Registrado em: Ter Jul 09, 2019 2:43 pm

Re: Integração VBA x WEB site em ASP.NET

Mensagem por LGustavoFerreira »

Descobri que o motivo que eu não trago o elemento em questão é pq o seu classname é aleatório, por isso eu não consigo buscá-lo

vou postar aqui e me ajudem a achar uma alternativa
descobri que na ID da Div parte da ID não altera o nome, eu conseguiria buscar por apenas uma parte do nome contido no ID? exemplo: *NomefixoID
que buscaria: "Ads1234dsaxc_NomefixoID" ????
sam.png
sam.png (282.24 KiB) Exibido 12489 vezes
sam2.png
sam2.png (257.08 KiB) Exibido 12489 vezes


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

Re: Integração VBA x WEB site em ASP.NET

Mensagem por PRMPOKER »

Prezados, boa noite.

Caro LGustavoFerreira, tudo bem?

Tenta o seguinte:

Código: Selecionar todos

	For Each htmlEle1 In HTMLDoc.getElementsByTagName("div") 'loop para varrer todos os elementos DIV
            	 sValor = Split(htmlEle1.innerHTML, "PARTE_FIXA_DO_SEU_ID") 'caso encontre a parte fixa do ID, vai dividir a string em duas partes, a partir da ocorrência desta parte fixa           
           	 With ActiveSheet 
       		.rang("L" & i).Value = sValor(1) 'Esta variável conterá a segunda parte da divisão acima, que provavelmente conterá o valor que você procura. Aí, basta limpar a string até deixar apenas a informação que você procura.
         	End With
        Next htmlEle1 
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