Preencher formulário da web via código VBA Excel

Converter PDF para Excel - Able2Extract 9 download
Converter PDF para Excel – Able2Extract 9 download
12 de março de 2015
Problema de cálculo de limites em produção - Solver Excel
Problema de cálculo de limites em produção – Solver Excel
15 de março de 2015

Objetivo: Demonstrar como preencher um formulário da web via código VBA Excel.

Preencher página Internet com VBA

Este artigo foi criado para auxiliar o nosso amigo Djanes, que participa do nosso Fórum Guia do Excel, veja a dúvida dele em: http://guiadoexcel.com.br/forum/viewtopic.php?f=14&t=19.

A dúvida consiste em a partir de uma lista de dados com UF e cidade, buscar no site dos correios os dados de faixa de CEP, veja também como fazer rastreamento correio no Excel.

Para esta ação tive ajuda do  amigo Jardel Novaes para a criação do código que está comentado logo abaixo.

Este código fonte teve também uma parte baseada nas explicações do artigo do nosso amigo Tomaz Vasquez http://www.tomasvasquez.com.br/blog/microsoft-office/vba-interagindo-com-o-objeto-internet-explorer, ao qual também agradeço.

Para utilizar a planilha de exemplo de como interagir com controles da internet com VBA,  basta clicar no botão Processar e aguardar a finalização do preenchimento da planilha com as faixas de CEP.

Preencher página Internet com VBA 2

O código irá abrir o internet explorer e realizar as consultas preenchendo os dados da planilha.

Preencher página Internet com VBA 3

Sem mais delongas, o código fonte segue abaixo  totalmente comentado e ao final do artigo um link para você realizar o download da planilha no exemplo.

Aproveito a oportunidade para convidá-lo a participar do nosso fórum ajudando nas dúvidas dos colegas e postando suas próprias dúvidas: Fórum Guia do Excel.

'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 lsPesquisarCEPFaixa()
    '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 dos correios
        IE.Navigate "http://www.buscacep.correios.com.br/servicos/dnec/menuAction.do?Metodo=menuFaixaCep"
        
        '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 de cidade e UF que serão preenchidos na página
        lCidade = Range("B" & lContador).Value
        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("Localidade").innertext = lCidade
        IE.Document.all("UF").Value = lUF
        IE.Document.forms("Geral").submit
       
        '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
       
        'Faz um loop pelos objetos do tipo table na página e procura pelo campo Faixa(s) de CEP: preenchido.
        'Em seguida busca pela segunda coluna da linha de faixa de CEP e armazena esta informação diretamente na coluna C da linha
        'da planilha
        For Each i In IE.Document.body.getElementsByTagName("table")
            If InStr(i.innertext, "Faixa(s) de CEP:") > 0 Then
                For Each l In i.getElementsByTagName("tr")
                    If InStr(l.innertext, lCidade) Then
                        Range("C" & lContador).Value = l.getElementsByTagName("td")(1).innertext
                    End If
                Next l
            End If
        Next i
    Next lContador
    
    MsgBox "Concluído!"
End Sub

Veja neste artigo como copiar os procedimentos acima e incluir na sua pasta pessoal de Macros neste artigo: http://guiadoexcel.com.br/habilitando-a-guia-desenvolvedor-e-copiando-procedimentos-vba-sub-da-internet

Abraço

Marcos Rieper


Clique aqui e leia mais sobre Excel VBA. https://www.guiadoexcel.com.br/vba/ O Guia do Excel foi criado por Marcos Rieper e oferece artigos, dicas, tutoriais e modelos de planilhas prontas. Aqui você encontra tudo sobre Excel, seja de nível básico, intermediário,  avançado e VBA. O Guia do Excel oferece diversos materiais completamente gratuitos para download. Navegue em nosso site e confira! Conheça também a nossa Loja do Excel https://loja.guiadoexcel.com.br/

40 Comentários

  1. Marcos, boa noite!

    Muito interessante o macro desenvolvido.

    Não sou bom conhecedor do VBA e estou tentando fazer algo “semelhante” com uma página da WEB, porém estou precisando de uma ajuda em como extrair os dados da WEB e trazê-los para o excel.

    É uma tabela pequena e se conseguisse trazê-la inteira para a minha planilha seria bem interessante.

    Têm algum jeito de lhe enviar minha planilha para dar uma olhada e se possível me ajudar?

    Obrigado desde já.

    Guilherme

  2. Ronei disse:

    Olá Marcos

    Primeiramente muito boa a macro desenvolvida, parabéns pelo trabalho.

    Não conheço muito de VBA, porem consegui fazer algumas modificações utilizando seu código para fazer login em um site e ir até uma página específica que possui uma tabela, nesta tabela gostaria de retirar alguns dados no mesmo estilo do CEP. Tentei de muitas maneiras, mas não consegui retirar nenhuma informação dela.

    Será que vc pode me dar uma luz?

    abaixo link da imagem da tabela do site
    http://imageshack.com/a/img908/6909/D22sQv.png

    Obs. tentei postar no fórum, mas meu cadastro ainda não foi liberado

    Agradeço antecipadamente

    Att
    Ronei

    • Marcos Rieper disse:

      Boa tarde Ronei,

      Obrigado pelo seu contato.

      O seu cadastro foi aprovado no fórum em 31/03/2015, por favor nos envie a planilha com a sua dúvida, faremos o possível para auxiliar.

      Abraço

      Marcos Rieper

  3. Jordana disse:

    Boa tarde, tem como fazer o contrário? Alterar dados de sistema configurando a VBA? Eu fazia isso do hyperion para o mainframe, mas não sei onde coloquei a planilha 🙁

  4. Anderson disse:

    Parabéns pelo artigo, muito bom!
    Também sou iniciante com VBA , no entanto consegui fazer funcionar para um site da CELESC (http://200.247.127.47:8080/AgenciaWeb/autenticar/loginCliente.do). Estou desenvolvendo para fazer login , buscar documento e salvar. Ocorre que o login ocorre em duas páginas, na primeira identifico minha unidade consumidora, que após um “submit”, abre outra página. E a dúvida é: como navegar nesta segunda página se tenho a referência apenas da primeira página?

    Grato e abs.

  5. Bom dia Marcos!
    Excelente sua planilha, Parabéns!!!

    Estou adptando para fazer uma busca e com dificuldade em alterar alguns campos, peço sua ajuda.

    Preciso acessar este site:

    http://www.sefaz.ba.gov.br/scripts/cadastro/cadastroBa/consultaBa.asp

    Informar o CNPJ

    E do resultado, copiar a linha abaixo do “Atividade Econômica Principal:”

    E colar na célula ao lado do CNPJ calculado.

    Alterando o código, consegui até a parte que preenche o campo CNPJ.

    Não consegui ativar a consultar, clicar no botão 🙁

    Nesta parte, o objeto CGC equivale o campo CNPJ no site:

    IE.Document.all(“CGC”).innertext = lCNPJ

    Parei nesta parte abaixo, não sei qual parâmetro informar:

    IE.Document.forms(“B1”).submit

    Muito Obrigado!

  6. Mozer disse:

    Boa noite.
    Estou com uma duvida se é possível e se sim, como fazer.
    Tenho uma planilha com notas de alunos, e tenho que postar as notas no site da escola, teria alguma maneira de automatizar isto, fazendo ele já enviar as notas da planilha direto sem precisar eu preencher o formulário do site.
    Desde já
    Agradeço.

  7. typebr disse:

    Olá Marcos,

    eu fiz o download da sua planilha para busca de cep na web, percebi que o caminho do site dos Correios alterou para http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaFaixaCEP.cfm ajustei o código, porém não está carregando o valor do range para o Excel. Você tem algum ideia o que está errado?

    • Marcos Rieper disse:

      Olá typebr, vou ter que verificar com calma o problema, assim que possível eu lhe retorno.

    • Eldimar disse:

      Olá Typebr, da mesma forma que você também fiz a alteração do caminho e não carregou, porém tem mais uma alteração a ser feita.
      For Each i In IE.Document.body.getElementsByTagName(“table”)
      If InStr(i.innertext, “Faixa de CEP”) > 0 Then
      For Each l In i.getElementsByTagName(“tr”)
      If InStr(l.innertext, lCidade) Then
      Range(“C” & lContador).Value = l.getElementsByTagName(“td”)(1).innertext

  8. Eldimar disse:

    Marcos, preciso também dessas faixas de CEP para colocar em minha planilha, o caminho dos correios foi alterado, mesmo substituindo pelo novo, o que fez funcionar na pagina dos correios, não registrou a faixa de CEP na coluna C, poderia me informar o que pode ter acontecido.

    • Marcos Rieper disse:

      Olá Edimar,

      Vamos ter que rever as planilhas que envolvem serviços dos correios, a empresa alterou muitos webservices e páginas que utilizávamos em nossos modelos.

      • Eldimar disse:

        Olá Marcos, consegui achar o erro precisa fazer uma outra alteração, além do caminho.
        IE.Navigate “http://www.buscacep.correios.com.br/sistemas/buscacep/buscaFaixaCep.cfm”

        For Each i In IE.Document.body.getElementsByTagName(“table”)
        If InStr(i.innertext, “Faixa de CEP”) > 0 Then
        For Each l In i.getElementsByTagName(“tr”)
        If InStr(l.innertext, lCidade) Then
        Range(“C” & lContador).Value = l.getElementsByTagName(“td”)(1).innertext

  9. luiz felipe disse:

    Amigos boa tarde, fiquei com um duvida!
    no trecho:

    ‘Carrega os dados de cidade e UF na página e submente os dados do formulário
    IE.Document.all(“Localidade”).innertext = lCidade
    IE.Document.all(“UF”).Value = lUF
    IE.Document.forms(“Geral”).submit

    localidade e uf são nomes do input no site dos correios? se sim, caso eu queira preencher em outro site eu devo trocar pelo nome do imput que quero preencher como esta no site em questão?

  10. Nuno disse:

    Bom dia,
    Estou a tentar reproduzir o código para um site apenas com a inserção de uma variável.

    Estou com os seguintes problemas:
    1-O endereço URL onde se encontra o form para preencher é o mesmo que retorna o resultado, e pelo código HTML do site o resultado que pretendo para o Excel está dentro de uma DIV .

    Sub nome_macro()
    lReferenciaIE

    Dim IE As Object
    Dim objElement As Object
    Dim objCollection As Object
    Dim lmatricula As String
    Dim lUltimaLinhaAtiva As Long
    Dim lContador As Long
    lUltimaLinhaAtiva = Worksheets(“analise”).Cells(Worksheets(“analise”).Rows.Count, 1).End(xlUp).Row
    Set IE = CreateObject(“InternetExplorer.Application”)
    IE.Visible = True
    For lContador = 2 To lUltimaLinhaAtiva
    IE.Navigate “http://www.imt-ip.pt/MatriculasCanceladas/matriculas.asp”
    While IE.ReadyState READYSTATE_COMPLETE
    Wend
    sng = Timer
    Do While sng + 1 > Timer
    Loop
    lmatricula = Range(“A” & lContador).Value
    IE.Document.all(“matricula”).innertext = lmatricula
    IE.Document.forms(“Pesquisa”).submit
    While IE.ReadyState READYSTATE_COMPLETE
    Wend
    sng = Timer
    Do While sng + 3 > Timer
    Loop
    For Each i In IE.Document.body.getElementsByTagName(“div”)
    If InStr(i.innertext, “foi”) > 0 Then
    For Each l In i.getElementsByTagName(“u”)
    If InStr(l.innertext, lmatricula) Then
    Range(“G” & lContador).Value = l.getElementsByTagName(“b”)(1).innertext
    End If
    Next l
    End If
    Next i
    Next lContador

    MsgBox “Concluído!”
    End Sub

  11. Antonio Cesar disse:

    Boa Tarde

    Fazendo uma macro para localizar o endereço de um CEP e usei como base seu código, porem não entendi como eu retira as informações da tabela que o site retorna, você poderia da uma ajuda?

    • Marcos Rieper disse:

      Olá Antonio,

      Este tipo de código varia totalmente de um site para o outro.

      Basicamente ele instancia um navegador IE, identifica os campos que devem ser preenchidos, preenche, e depois no retorno lê os campos, também identificando quais são, e retorna os mesmos para a planilha.

      Abraço
      Marcos Rieper

  12. Buenas Marcos
    Parabéns pelo material, muito esclarecedor.

    Tchê, tem como fazer em vba preencher um outro formulário em vba?

    Desde já agradeço.

  13. Adriana Takemori disse:

    Boa tarde!
    Primeiramente, parabéns e muito obrigada por compartilhar!
    Estou adaptando para minhas necessidades, mas preciso inicialmente informar meu usuário e senha antes de acessar a página da qual vou extrair as informações.
    Poderia me ajudar dando alguma dica ou me dizendo se já algo parecido aqui no guia?
    Obrigada!

  14. Bruno disse:

    Marcos, boa noite!

    Muito interessante seu trabalho parabens.

    Trabelhei muito tempo com VBA e Macros e agora estou enferrujado e mesmo olhando seus exemplos to com dificuldade de adpatar ve se pode me dar uma luz (PS: acabei de fazer inscricao no site)

    Preciso consultar uma pagina na web para pesquisar aproximadamente 3.000 registros que estão numa planilha excel e retornar (copiar e colar) 2 campos de cada 1 das pesquisas realizadas

    Tem algo já mais parecido com isso?

    Vai me ajudar muito. Obrigado desde já.

    Bruno

  15. Bruno Lucchetti disse:

    Boa tarde Marcos eu escrevi aqui ontem e não sei se foi ou não, vou postar de novo aqui então
    Primeiramente parabéns pelo artigo, muito bom!
    Trabalhei um tempo com macros e VBA , e estou meio enferrujado pois faz uns 5-6 que não mexo mais com isso veja se pode me ajudar:
    Preciso consultar cerca de 3.000 leis no site da Câmara Municipal de São Paulo e a cada consulta (pelo numero da lei que esta tabelado em uma coluna do excel) precisaria retornar e colar 2 campos de cada consulta ao lado de cada numero na propria tabela.
    O site serai http://cm332adm/scripts/wxis.exe/iah/?IsisScript=iah/iah.xis&lang=P&base=legis
    e nâo precisa de login e nem codigo de seguranca/anti-roboe etc
    Creio não ser nada muito diferente e nem complicado em relação ao que ja desenvolveu mas to com dificuldade de adpatar, poderia me dar alguma luz com algo parecido que já tenha feito?

    Muito Obrigado e abs.

    Bruno L

  16. Bruno disse:

    Boa tarde Marcos,

    Postei aqui faz um tempo o forum está desativado?

    Abraço
    Bruno

  17. Mauro disse:

    Amigos, estou tentando reproduzir esse codigo para google maps , para obter o retorno de KM e pedagio, mas sem sucesso, alguem poderia me ajudar?

  18. Wellington disse:

    Ola bom dia, estou acabei encontrando este assundo na internet e realmente e o que eu procurava, uma planilha onde eu digita-se SIGLA DO ESTADO E CIDADE e me retornaria com CEP, exato porem a a planilha que tem ai no link disponibilizado ela nao me retorna com os valores, ela faz a busca corrretamente mas nao copia os CEP do Internet Explorer, estou errando alguma coisa ? tenho que liberar alguma informação para o navegador antes ?

    • Nilton disse:

      Eu baixei o arquivo e precisei verificar duas cidades que deram erro, troquei as cidades e estados e apaguei os CEPs preenchidos e coloquei a macro para rodar e ela puxou os dados.

  19. Gilberto disse:

    Olá Marcos.
    A referência ao Microsoft Internet Controls neste código funcionou perfeitamente até que o IE foi atualizado para a versão 9.
    Agora eu não consigo fazer adicionar a referência manualmente (shdocvw.dll) e também não consigo fazer downgrade na versão do IE.

    Você conhece alguma alternativa?

  20. Nilton disse:

    Marcos como faço para indicar outras colunas e caso a consulta das informações para extração estão em duas linhas ou mais como faço para extrair as informações dessas outras linhas? Agradeço a atenção.

    ‘Faz um loop pelos objetos do tipo table na página e procura pelo campo Faixa(s) de CEP: preenchido.
    ‘Em seguida busca pela segunda coluna da linha de faixa de CEP e armazena esta informação diretamente na coluna C da linha
    ‘da planilha
    For Each i In IE.Document.body.getElementsByTagName(“table”)
    If InStr(i.innertext, “Faixa(s) de CEP:”) > 0 Then
    For Each l In i.getElementsByTagName(“tr”)
    If InStr(l.innertext, lCidade) Then
    Range(“C” & lContador).Value = l.getElementsByTagName(“td”)(1).innertext
    End If
    Next l
    End If
    Next i
    Next lContador

    MsgBox “Concluído!”

  21. Paulo disse:

    Bom dia srs,

    com ajuda do post. Consegui criar de um codigo gigantesco pra uma planilha que trabalho… porém com o IE eu não me ajuda muito, como padrão utilizo o Opera… alguem consegui dentro desse codigo usar o Opera ou CHrome?

  22. Hugo Balieiro disse:

    Excelente artigo, gostaria de saber se alguém conhece ou sabe fazer VBA na plataforma MAC? agradeço o tempo de resposta.

  23. Thiago disse:

    Boa tarde a todos.

    Eu adaptei o seu código (muito interessante) por sinal, para tentar logar em um site. O processo dá certo (login e senha) mas o site não reconhece a digitação (o site entende que foi copiado e colado tanto login e senha) e o botão de entrar fica inativo e o “enter” no teclado não responde. Alguma ideia?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Inscreva-se no nosso canal do Youtube!


Junte-se ao nosso canal do Youtube. Começamos em abril de 2016, mas já temos mais de 06:00 h de treinamentos gratuitos e este número irá aumentar. Vídeos novos todos os sábados.