none
Consultar CNPJ site Receita - VBA

    Question

  • Prezados,

    preciso consultar CNPJ no site da Receita Federal, achei material vasto sobre como fazer esse tipo de pesquisa com VBA. Os exemplos no entanto são de sites de busca, onde tudo funciona normalmente.

    Tentei adaptar o código à minha necessidade, mas não estou tento êxito. Retorna o seguinte erro:

    A variável do objeto ou a variável do bloco 'With' não foi definida.

    - Segue o código:

    Sub CNPJ()

    Dim ie as New InternetExplorer

    ie.visible = true

    ie.Navigate (http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_solicitacao.asp)

    ie.Document.all.Item("cnpj").Item.Innertext = "06313214000102"

    End Sub

    Peço ajuda de vocês par entender onde esta o erro e poder seguir com meu desenvolvimento.

    Grato,

    Weivisson

    Tuesday, April 09, 2013 2:38 PM

Answers

  • Felipe, obrigado pela dica, mas veja como resolvi essa parada.

    Segue o código:

    ub CNPJ()

    Dim ie As InternetExplorer

    Dim elem
    Dim tbl
    Dim tr

    Set objIE = CreateObject("InternetExplorer.Application")

    With objIE
     .StatusBar = False
     .Toolbar = False
     .Resizable = False
     .AddressBar = False
     .Visible = True
     .Navigate "http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp"
     Do While .Busy Or _
     .ReadyState <> 4
     DoEvents
     Loop
    .Document.all.Item("cnpj").innertext = "06313214000102"

    reset:
    .Document.getElementById("captcha").Focus

    x = .Document.activeElement.Name

    Do While x = "captcha" '.Document.all.Item("captcha").Value = ""
    x = .Document.activeElement.Name
    DoEvents
    Loop

    If .Document.all.Item("captcha").Value = "" Then GoTo reset '.Document.getElementById("captcha").Focus

    .Document.all("submit1").Click

    Do While .Busy Or _
     .ReadyState <> 4
     DoEvents
     Loop

    'x = 1
    For Each tr In .Document.getElementsByTagName("tr")
    If tr.innertext = "Erro na Consulta - Esclarecimentos adicionais.  " Then GoTo reset
    'Plan3.Cells(x, 1) = tr.innertext
    'x = x + 1
    Next

     

    For Each elem In .Document.all
       If elem.tagname = "TABLE" Then
          Set tbl = elem
          If tbl.Rows.Length >= 1 Then
             Set tr = tbl.Rows(0)
             If tr.Cells.Length >= 1 Then
                If Not InStr(tbl.Rows(0).innertext, "REPÚBLICA FEDERATIVA DO BRASIL") > 0 Then
                    If InStr(tr.Cells(0).innertext, "NÚMERO DE INSCRIÇÃO") > 0 Then
                        Plan1.Cells(1, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(1, 1).WrapText = False
                        'tbl.rows(0).cells(2).innertext ' PEGA A DATA
                    End If
                    If InStr(tr.Cells(0).innertext, "NOME EMPRESARIAL") > 0 Then
                        Plan1.Cells(2, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(2, 1).WrapText = False
                    End If
                    If InStr(tr.Cells(0).innertext, "Erro na Consulta") > 0 Then
                        Plan1.Cells(3, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(3, 1).WrapText = False
                    End If
                    If InStr(tr.Cells(0).innertext, "ATIVIDADE ECONÔMICA PRINCIPAL") > 0 Then
                        Plan1.Cells(4, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(4, 1).WrapText = False
                    End If
                End If
             End If
          End If
       End If
    Next

    End With

    Set objIE = Nothing

    End Sub

    Em tempo, faço crédito ao nosso amigo Avelino Sampaio, que nos deu uma luz, indiretamente, através de um post contido no site ExpertAccess (http://www.expertaccess.com.br/forumnew/forum_posts.asp?TID=21915)

    • Marked as answer by Weivisson Thursday, April 18, 2013 5:55 PM
    Thursday, April 18, 2013 5:54 PM

All replies

  • Prezados,

    parte do problema eu já resolvi alterando para o endereço correto. Consegui copiar o valor para o campo no navegador.

    Agora preciso saber se é possível copiar  valor contido na imagem e colar no campo de validação dos caracteres.

    Grato,

    Raimundo

    Tuesday, April 09, 2013 7:06 PM
  • "Agora preciso saber se é possível copiar  valor contido na imagem e colar no campo de validação dos caracteres."

    O "valor contido na imagem" se chama captcha. Ele existe justamente para impedir que sites sejam acessados por scripts. Haja visto isso, captchas são difíceis de burlar. Infelizmente, não vejo uma solução simples para seu caso.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    Wednesday, April 10, 2013 12:11 AM
    Moderator
  • Perfeito o esclarecimento, muitíssimo obrigado.

    Havia pensado nisso ontem, no entanto surgiu outra necessidade. Vou criar um form onde carregará a página da receita, já com o número do CNPJ preenchido.

    Uma vez realizada a consulta, com o resultado na tela o endereço muda para "http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Comprovante.asp", há alguma forma de eu extrair os dados do cartão do CNPJ para o Excel?

    Abs.,

    Raimundo

    Wednesday, April 10, 2013 11:50 AM
  • Teria como postar depois como ficou?
    Wednesday, April 10, 2013 2:20 PM
  • Use as funções InStr e Mid no HTML gerado da página para obter os valores da ficha. Não vi uma forma mais fácil de fazer isso.

    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    Wednesday, April 10, 2013 10:36 PM
    Moderator
  • A questão é que antes de submeter a consulta o endereço é http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_solicitacao2.asp depois muda para http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Comprovante.asp .

    Como fazer a referência a essa página do comprovante?

    Raimundo

    Thursday, April 11, 2013 9:07 PM
  • Depois que você inserir manualmente a imagem e ir até a próxima tela, terá que atribuir o Internet Explorer à uma variável. Infelizmente, não é possível utilizar a função GetObject para obter um objeto Internet Explorer. No entanto, você pode pesquisar o handle da janela do navegador e atribuir à uma variável, com a ajuda da biblioteca Shell. O código abaixo mostra como obter uma aplicação Internet Explorer aberta:

    Sub FazerLogin()
        Dim appIE As InternetExplorer
        
        Set appIE = ObterIE
        
        'resto do código
    End Sub
    
    Function ObterIE() As InternetExplorer 'Object
        Dim appShell As Variant
        Dim vWindows As Variant
        Dim var As Variant
        
        Set appShell = CreateObject("Shell.Application")
        Set vWindows = appShell.Windows()
        
        On Error Resume Next
        For var = 0 To vWindows.Count - 1
            If InStr(vWindows.Item(var).FullName, "iexplore.exe") > 0 Then
                Set ObterIE = vWindows.Item(var)
            End If
        Next var
        On Error GoTo 0
        
        If ObterIE Is Nothing Then
            Set ObterIE = CreateObject("InternetExplorer.Application")
        End If
        
        ObterIE.Visible = True
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    Saturday, April 13, 2013 8:21 PM
    Moderator
  • Felipe, obrigado pela dica, mas veja como resolvi essa parada.

    Segue o código:

    ub CNPJ()

    Dim ie As InternetExplorer

    Dim elem
    Dim tbl
    Dim tr

    Set objIE = CreateObject("InternetExplorer.Application")

    With objIE
     .StatusBar = False
     .Toolbar = False
     .Resizable = False
     .AddressBar = False
     .Visible = True
     .Navigate "http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp"
     Do While .Busy Or _
     .ReadyState <> 4
     DoEvents
     Loop
    .Document.all.Item("cnpj").innertext = "06313214000102"

    reset:
    .Document.getElementById("captcha").Focus

    x = .Document.activeElement.Name

    Do While x = "captcha" '.Document.all.Item("captcha").Value = ""
    x = .Document.activeElement.Name
    DoEvents
    Loop

    If .Document.all.Item("captcha").Value = "" Then GoTo reset '.Document.getElementById("captcha").Focus

    .Document.all("submit1").Click

    Do While .Busy Or _
     .ReadyState <> 4
     DoEvents
     Loop

    'x = 1
    For Each tr In .Document.getElementsByTagName("tr")
    If tr.innertext = "Erro na Consulta - Esclarecimentos adicionais.  " Then GoTo reset
    'Plan3.Cells(x, 1) = tr.innertext
    'x = x + 1
    Next

     

    For Each elem In .Document.all
       If elem.tagname = "TABLE" Then
          Set tbl = elem
          If tbl.Rows.Length >= 1 Then
             Set tr = tbl.Rows(0)
             If tr.Cells.Length >= 1 Then
                If Not InStr(tbl.Rows(0).innertext, "REPÚBLICA FEDERATIVA DO BRASIL") > 0 Then
                    If InStr(tr.Cells(0).innertext, "NÚMERO DE INSCRIÇÃO") > 0 Then
                        Plan1.Cells(1, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(1, 1).WrapText = False
                        'tbl.rows(0).cells(2).innertext ' PEGA A DATA
                    End If
                    If InStr(tr.Cells(0).innertext, "NOME EMPRESARIAL") > 0 Then
                        Plan1.Cells(2, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(2, 1).WrapText = False
                    End If
                    If InStr(tr.Cells(0).innertext, "Erro na Consulta") > 0 Then
                        Plan1.Cells(3, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(3, 1).WrapText = False
                    End If
                    If InStr(tr.Cells(0).innertext, "ATIVIDADE ECONÔMICA PRINCIPAL") > 0 Then
                        Plan1.Cells(4, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext
                        Plan1.Cells(4, 1).WrapText = False
                    End If
                End If
             End If
          End If
       End If
    Next

    End With

    Set objIE = Nothing

    End Sub

    Em tempo, faço crédito ao nosso amigo Avelino Sampaio, que nos deu uma luz, indiretamente, através de um post contido no site ExpertAccess (http://www.expertaccess.com.br/forumnew/forum_posts.asp?TID=21915)

    • Marked as answer by Weivisson Thursday, April 18, 2013 5:55 PM
    Thursday, April 18, 2013 5:54 PM
  • Amigo, basta fazer um loop enquanto a página não muda

    'Aguarda até a página ser carregada totalmente----
            Do While ie.LocationURL <> "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Comprovante.asp"
            Loop
            
            If ie.LocationURL = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Comprovante.asp" Then
            Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE: Loop

    Saturday, August 31, 2013 9:45 PM
  • Felipe / Weivisson, bom dia

    Obrigado por compatilhar o conhecimento de vocês.

    Testei o codigo acima no VB do excel e estou com a seguinte mensagem de erro:

    Run-time error '424': Object required

    Na linha 60 --> Plan1.Cells(1, 1) = tbl.Rows(0).Cells(0).innertext 'MsgBox tbl.Rows(0).Cells(0).innertext

    Vocês tiveram o mesmo problema ou algo parecido?Podem me orientar.

    Estou usando excel 2010.

    Desde já agradeço pela atenção.

    Sunday, June 29, 2014 11:59 AM
  • Sam , boa tarde.

    Por favor uma ajuda, como que consigo usar sua sugestão no codito do Weivisson acima?

    Desde já agradeço pela anteção.

    Sunday, June 29, 2014 6:18 PM