Você está na página 1de 20

VBA + Internet: Acessando sites da Web atravs de VBA

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

VBA + Internet: Acessando sites da Web atravs de VBA - Parte II


Bem pessoal, nessa segunda parte de meu artigo sobre acesso uma pgina da Web pelo VBA do Excel, quero ensinar como clicar em botes e preencher caixas de texto com valores. Apenas revisando o cdigo do nosso artigo anterior:

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.

Preencher dados de uma caixa de texto


O truque voc descobrir qual o nome do campo (propriedade name da tag HTML). Claro, para isso voc tem que ter um conhecimento intermedirio de HTML e um pouquinho de conhecimento sobre JavaScript ajudaria tambm. Se no sabe, ento busque esse conhecimento. Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Document.All.Item("q").innertext = "Pesquisa" ie.Visible = True End Sub
q o nome da caixa de texto do site do Google onde voc digita a sua pesquisa. Document nome do objeto que representa o documento da pgina. All a propriedade onde voc acessa todos os objetos do documento, tais como links, tabelas, imagens, botes, formulrios e por ai vai. Item uma propriedade onde eu defino qual objeto do documento (links, forms e etc.) eu desejo selecionar, voc pode especificar tanto o nome do objeto como o nmero que ele representa no site. innerText uma propriedade especfica do objeto que voc est acessando onde voc manipula o texto dentro do objeto. Uma boa dica para descobrir o nome destes objetos e tudo o mais utilizar o Local Variables ou Variveis Locais do Visual Basic Editor. No VBE, clique em Exibir -> Janela Variveis Locais.

Acessando janela de Variveis Locais

Janela de Variveis Locais

Outra maneira de preencher uma caixa de texto :

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

ie.Navigate "http://www.google.com.br" ie.Document.getElementsByName("q").Item.InnerText = "Pesquisa" ie.Document.all.Item("btnG").Click ie.Visible = True End Sub


Use o mtodo Click. Claro, funciona da outra maneira que expliquei tambm:

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.

VBA + Internet: Acessando sites da Web atravs de VBA - Parte III


Continuando o artigo sobre acesso a sites pelo VBA, quero falar, hoje, sobre como selecionar valores em um CheckBox, Radio Button, ComboBox e ListBox nas pginas da Web atravs de VBA. Vamos usar como exemplo um site prprio que criei hospedado no NoFeeHost. Clique aqui para acessar o site.

Selecionando valores no CheckBox


Existem diversas formas, mas vamos mais simples por enquanto: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.All.Item("vehicle").Item(1).Checked = True End Sub Este cdigo seleciona o segundo item. Vamos a explicao: vehicle o nome do grupo do CheckBox, ou melhor, da propriedade name do CheckBox. Item(1) o item que eu desejo selecionar. O nmero 1 (um) significa o segundo item, pois a neste caso o primeiro item seria o 0 (zero). Se voc olhar o cdigo-fonte da pgina, ver o seguinte: <input type="checkbox" name="vehicle" value="Bike" /> I have a bike<br /> <input type="checkbox" name="vehicle" value="Car" /> I have a car Outra forma omitindo a propriedade Item(). Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.All.Item("vehicle")(1).Checked = True End Sub E claro, o que ensinei na segunda parte deste artigo se aplica aqui tambm:

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

Selecionando valores no Radio Button


o mesmo cdigo utilizado quando se seleciona no CheckBox. Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.All.Item("sex").Item(1).Checked = True End Sub

Selecionando valores no ComboBox e ListBox


O cdigo fonte do ComboBox (ou dropdown list), na pgina web, o seguinte: <select name="cars"> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <option value="fiat">Fiat</option> <option value="audi">Audi</option> </select> Agora, vamos ao cdigo VBA: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True ie.Document.All.Item("cars").Item(1).Selected = True End Sub quase o mesmo cdigo utilizado para CheckBox e RadioButton. A diferena que utilizo a propriedade Selected ao invs de Checked. Para o ListBox no existe segredo, pois ele usa o mesmo cdigo fonte HTML para o Combobox. A diferena a propriedade size do cdigo fonte HTML que alterada. Veja o cdigo fonte HTML do ListBox:

<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

Selecionando mais de um valor

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>

Melhores prticas para selecionar valores no CheckBox, RadioButton, ComboBox e ListBox


Voc h de convir comigo que os cdigos usados acima no so nenhum um pouco seguro. Quero dizer que, referenciar o item do CheckBox, RadioButton, ListBox ou ComboBox pelo nmero que ele representa (item(1), por exemplo) muito arriscado. Pode acontecer de o desenvolvedor do site alterar a ordem dos itens no ComboBox ou o item que voc est selecionando no existir mais. Para nos precavermos disso, utilizaremos o seguinte cdigo: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer Dim obj As Object ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True For Each obj In ie.Document.All.Item("drop1").Options If obj.innertext = "item 3" Then obj.Selected = True End If Next obj End Sub Estou percorrendo todas as opes do ListBox e verifico se o texto corresponde ao que eu quero selecionar. Caso positivo eu o seleciono. Este cdigo se aplica ao ComboBox tambm. Agora, para o RadioButton e CheckBox usamos o seguinte cdigo: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer Dim obj As Object ie.Navigate "http://users5.nofeehost.com/BackOfficeSite/" ie.Visible = True For Each obj In ie.Document.All.Item("sex") If obj.Value = "female" Then obj.Checked = True End If Next obj End Sub

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).

VBA + Internet: Acessando sites da Web atravs de VBA - Parte IV


Nesta quarta parte do meu artigo sobre acesso a sites da Web atravs de VBA, vou abordar os seguintes assuntos: clicando em links, lendos dados de tabelas e lidando com frames.

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:

Janela de Variveis Locais

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

Lendo dados de tabelas


Clique aqui para acessar o site que utilizaremos como exemplo. O cdigo fonte html de uma tabela o seguinte: <table> <tr> <td>Contedo de clula 1 da linha 1</td> <td>Contedo de clula 2 da linha 1</td> <td>Contedo de clula 3 da linha 1</td> </tr> <tr> <td>Contedo de clula 1 da linha 2</td> <td>Contedo de clula 2 da linha 2</td> <td>Contedo de clula 3 da linha 2</td> </tr> </table>
Acessar os dados de tabelas no to simples como tenho apresentado at agora. importante voc entender o modelo de objeto de uma tabela.

Imagem para entendimento das propriedades de uma tabela

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

Lidando com Frames


Bem, lidar com Frames extremamente simples. Basta voc saber o nome (propriedade "name" na tag html) do frame onde voc quer acessar o contedo. Clique aqui para acessar o site que estou utilizando como exemplo. O cdigo fonte de um frame o seguinte: <frameset cols="25%,75%"> <frame src="http://users5.nofeehost.com/BackOfficeSite/Frame_A.html" name="Frame_A"></frame> <frame src="http://users5.nofeehost.com/BackOfficeSite/Vba_Site_Iv_Tables.htm" name="Frame_B"></frame> </frameset> Vamos ao cdigo VBA para acessar:

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.

VBA + Internet: Acessando sites da Web atravs de VBA - Parte V


Ol Galera, hoje finalizarei este artigo sobre acesso sites da Web pelo VBA Quem no acompanhou o comeo deste artigo pode conferir nos links abaixo: Hoje vou falar sobre execuo de scripts JavaScript, rotina de tratamento para carregamento de pgina e dar algumas dicas.

Executando Scripts JavaScript


Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True ie.Document.parentwindow.execscript ("alert('Hellow World')")

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.

Rotina de tratamento para carregamento de pgina


Abaixo alguns cdigos para tratar o carregamento de pgina. Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True Do While ie.Busy Loop End Sub Outra rotina: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True Do Until ie.Document.ReadyState = "complete" Loop End Sub Outra rotina: Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer

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.

Mudando a Barra de Status


Sub AcessaPagina() Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Navigate "http://www.google.com.br" ie.Visible = True ie.StatusBar = "Mudei a barra de status!" End Sub

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.