Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Primeiro voc deve se certificar de que tenha a referncia Microsoft Internet Control em seu VBE (Visual Basic Editor).
Para acessar o VBE, no Excel 2007 ou 2010, tecle a combinao ALT + F11 ou clique em Visual Basic na guia Desenvolvedor.
Para acessar o VBE, no Excel 2003 e inferiores, tecle a combinao ALT + F11 ou clique em Ferramentas -> Macro -> Editor do Visual Basic.
Para acessar a caixa de referncias do projeto, no VBE, clique em Ferramentas -> Referncias.
Bem, vamos aos primeiros passos. Crie um mdulo novo (No VBE, Inserir -> Mdulo) e digite o seguinte cdigo: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True End Sub Iniciamos com uma rotina simples, na qual se declara uma varivel do tipo InternetExplorer, em seguida instancia-se ela (new).
Voc vai reparar que quando se cria uma instncia, o navegador no aberto, mas o processo dele aparece nos Processos do Windows (CTRL + SHIFT + ESC). Usamos o comando Navigate, que recebe como parmetro a URL do site que voc deseja abrir. Esse comando o equivalente ao boto Ir do Internet Explorer. E para finalizar, usamos o comando Visible = True para que o navegador seja exibido na tela. Bom, por enquanto s. Aguardem a segunda parte onde explicarei mais coisas que so possveis de serem feitas atravs da classe InternetExplorer. Para vocs terem uma ideia, possvel mudar o mtodo GET para POST de um site (de forma local e no no servidor do prprio site), enviar instrues javascript, ler dados de campos de formulrios e tabelas, navegar entre os frames e etc. Ah, e para aqueles que por algum motivo no conseguiram declarar a varivel como InternetExplorer, segue caminho alternativo. Sub AcessaPagina_() Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") ie.Navigate "http://www.google.com.br" ie.Visible = True
End Sub
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True End Sub
Ns vimos que este cdigo nada mais faz do que abrir a pgina do Google.
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Document.getElementsByName("q").Item.InnerText = "Pesquisa" ie.Visible = True End Sub
getElementsByName um mtodo onde voc retorna o objeto pelo nome que ele possui. Questo: E se o objeto que eu quero atribuir valor possui a propriedade id e eu quero referenciar por esta? Simples, use o mtodo getElementById:
ie.Document.getElementById("id").Item.Value = "Valor"
Clicando no boto
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Document.getElementsByName("q").Item.InnerText = "Pesquisa" ie.Document.getElementsByName("btnG").Item.Click ie.Visible = True End Sub Obs.: pode usar o mtodo getElementById que funciona tambm.
Ah, e se voc tentou executar de uma s vez todo o cdigo e obteve um erro assim:
Erro ao tentar executar o cdigo de uma vez s (F5 ou boto de executar macro)
porque o cdigo tentou preencher a caixa de texto Pesquisa do site do Google antes do site ser carregado. Como resolver? Inclua um loop enquanto o site estiver carregando.
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" While ie.Busy Wend ie.Document.getElementsByName("q").Item.InnerText = "Pesquisa" ie.Document.getElementsByName("btnG").Item.Click ie.Visible = True End Sub
Busy uma propriedade que fica true enquanto a pgina est carregando e false quando ela j estiver totalmente carregada.
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.getElementsByName("vehicle")(1).Checked = True End Sub
<select name="drop1" id="Select1" size="4"> <option value="1">item 1</option> <option value="2">item 2</option> <option value="3">item 3</option> <option value="4">item 4</option> <option value="0">All</option> </select> O cdigo VBA ficaria da seguinte forma: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.All.Item("drop1").Item(1).Selected = True End Sub Outra questo: e quando meu ListBox permite mltipla seleo de valores? Simples: acrescente mais uma linha de cdigo selecionando o valor: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.All.Item("drop1").Item(0).Selected = False ie.Document.All.Item("drop1").Item(1).Selected = True ie.Document.All.Item("drop1").Item(3).Selected = True End Sub
O cdigo fonte HTML de um ListBox com mltipla seleo o seguinte: <select name="drop1" id="Select1" size="4" multiple="multiple"> <option value="1">item 1</option> <option value="2">item 2</option> <option value="3">item 3</option> <option value="4">item 4</option> <option value="0">All</option> </select>
O que muda que no uso a propriedade innerText para comparar valores, mas a propriedade Value e no utilizo nenhuma propriedade indicando subitens do All.Item("sex"), mas referencio direto. Quero dizer com isso, no utilizo algo do tipo All.Item("sex").Options ou All.Item("sex").Items (no existem e gera erro se voc tentar desta forma).
Clicando em Links
Utilizaremos, como exemplo, uma pgina simples que criei no host NoFeeHost. Clique aqui para acessar. O cdigo fonte html de um hyperlink o seguinte: <a href="http://www.yahoo.com/">Click Here</a> O cdigo VBA se resume em utilizar o objeto Links que est contido no objeto Document: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Links.htm" ie.Visible = True ie.Document.Links(0).Click End Sub Uma dica que posso dar utilizar a propriedade Length para verificar se eu tenho links no meu site. Assim eu evito erros em tempo de execuo. Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Links.htm" ie.Visible = True If ie.Document.Links.Length > 0 Then ie.Document.Links(0).Click End If End Sub
E se a pgina que estou acessando tiver milhares de links? Bem, ento utilize uma estrutura de repetio que saia iterando entre cada link. Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Links.htm" ie.Visible = True Dim obj As Object For Each obj In ie.Document.Links If obj.href = "http://www.yahoo.com/" Then obj.Click End If Next obj End Sub Na segunda parte deste artigo eu mencionei sobre o uso da Janela de Variveis Locais (Local Variables Window). Torno a repetir chamando a ateno para a varivel "obj" do exemplo acima. Veja quantas propriedades e quantas informaes podemos extrair:
possvel vermos a porta que utilizada para acesso (80), o protocolo (http), o texto contido dentro das tags do link ("Click Here") , entre outros. Quero dizer que, voc pode se utilizar destas informaes para outros propsitos bastando utilizar o nome que aparece na janela de variveis locais, exemplo: Dim varProtocolo as String varProtocolo = ie.document.links(0).protocol
Agora, vamos a um primeiro exemplo de cdigo: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Tables.htm" ie.Visible = True MsgBox ie.Document.all.Item(6).Rows(0).Cells(0).innerText End Sub
Item(6) = na coleo de itens em meu site, o item 6 (que o stimo item dado que a contagem comea a partir de 0) corresponde uma tabela (em html, <table></table>) Rows(0) = primeira linha de minha tabela (em html <tr></tr>); Cells(0) = primeira clula de minha tabela (em html <td></td>); innerText = retorna o texto dentro da clula. OK, concordo que esse cdigo bem rudimentar (e perigoso). E se meu site tiver mais de 1000 itens, como fazer para saber qual a tabela que quero acessar? Terei que sair caando na Janela de Variveis Locais qual item corresponde tabela? No! Graas ao bom Deus, aprendi uma maneira de referenciar a tabela sem precisar saber qual o nmero do item a qual ela corresponde. Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Tables.htm" ie.Visible = True Dim elemCollection As Object Dim obj As Object Set elemCollection = ie.Document.getElementsByTagName("TABLE") For Each obj In elemCollection MsgBox obj.Rows(0).Cells(0).innerText Next obj End Sub
Utilizamos o mtodo getElementsByTagName(nome_da_tag_html)
para retornar a coleo de objetos correspondentes tag <table>, ou seja, se tivssemos mais de uma tabela em nossa pgina, esse mtodo retornaria todas atribuindo-as varivel elemCollection. Ento, atravs da varivel obj, iteraramos (loop) por todas as tabelas retornadas na varivel elemColletion. E com a varivel obj, acessamos as linhas (rows) e clulas (cells) da tabela. Esse mtodo tambm serve para todas outras tags, tais como "a", "tr", "td" e etc. E para finalizar o assunto de tabelas, segue algortmo que l os dados da tabela e os lana na planilha:
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Tables.htm" ie.Visible = True Dim elemCollection As Object Dim t As Integer Dim r As Integer, c As Integer Set elemCollection = ie.Document.getElementsByTagName("TABLE") For t = 0 To elemCollection.Length - 1 For r = 0 To elemCollection(t).Rows.Length - 1 For c = 0 To elemCollection(t).Rows(r).Cells.Length - 1 ThisWorkbook.Worksheets(1).Cells(r + 1, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText Next c Next r Next t End Sub
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Frames.htm" ie.Visible = True MsgBox ie.Document.frames("Frame_A").Document.all.Item(0).innertext End Sub frames(nome_do_frame ou numero_do_item) = acessa determinado frame de acordo com o nome especificado ou com o nmero correspondente (frames(0), por exemplo).
Fcil, no? Aguardem a quinta parte deste artigo. Espero que estejam gostando. Gostaria de recomendar dois links sobre HTML que acredito que ajudar muito: http://www.w3schools.com/html/default.asp e http://www.w3schools.com/jsref/default.asp.
End Sub O exemplo acima bem simples. Voc pode se perguntar: para que executarei instrues javascript? Por vrios motivos. Imagine que voc tem um site onde existe validao de dados. Voc pode chamar o mtodo de gravao diretamente ao invs de mandar clicar no boto "Gravar" e assim "furar" a validao de dados, por exemplo. ie.Document.parentwindow.execscript ("metodo_gravar()") Voc pode habilitar/desabilitar campos. Vamos brincar um pouco com a pgina do Google: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True 'Disabilita a caixa de texto de pesquisa ie.Document.parentwindow.execscript ("document.forms[0].q.disabled=true")
'Muda o texto do boto de "Pesquisa Google" ie.Document.parentwindow.execscript ("document.forms[0].btnG.value=' nois'") End Sub Enfim, uma variedade de coisas. Agora, voc tem uma lio de casa: aprender javascript.
Apenas uma observao importante: toda essa brincadeira de mudar as caractersticas da pgina, roda apenas localmente (cliente) e no no servidor. Se voc atualizar a pgina (F5) ver que as mudanas desaparecero.
ie.Navigate "http://www.google.com.br" ie.Visible = True Do Until ie.ReadyState = READYSTATE_COMPLETE Loop End Sub
O que diferencia? Em alguns momentos o objeto InternetExplorer sinalizar que o carregamento est completo, mas pode acontecer de uma parte do documento ou o frame no estiver totalmente carregado. Ento voc pode utilizar uma das 3 rotinas acima sugeridas.
Fechando o navegador
Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True ie.Quit Set ie = Nothing End Sub Bom pessoal, por enquanto isso. Num futuro no muito distante falarei mais sobre acessar pginas da Web atravs de VBA.