none
Erro ao executar consulta em um ambiente web com VBA RRS feed

  • Pergunta

  • Caros,
    Bom dia!
    Sou novo no fórum e no assunto e preciso de vossa ajuda no seguinte problema:
    Estou tentando montar um aplicativo em VBA que automatize alguns processos corriqueiros que tenho para um site específico, mas estou recebendo erro 70 permissão negada ao tentar buscar um elemento por seu atributo className. Poderiam me ajudar por gentileza? Segue a parte do código com problema (como é um código para testes, ele está desorganizado e sem indentação).
    VBA
    _____________________________________________________________________________________________________________________________________________________________________________________
     Dim IE As Object
                    
                    Set IE = CreateObject("InternetExplorer.Application")
                    IE.Visible = True
                    IE.Navigate "https://xxx"
                    
                    Do While IE.Busy
                    Loop
        
                    While IE.ReadyState <> READYSTATE_COMPLETE And IE.ReadyState <> READYSTATE_LOADED
                    DoEvents
                    Wend
                    
    With IE
                                            
                        'Faz o login na plataforma
                        
                        While .Busy Or .ReadyState <> 4: DoEvents: Wend
                        
                        .Document.GetElementByID("overridelink").Click 'Página de certificado
                        Application.Wait Now() + TimeValue("00:00:05")
                        .Document.GetElementByID("user").Focus
                        .Document.GetElementByID("user").Value = "xxx"
                        .Document.GetElementByID("pass").Focus
                        .Document.GetElementByID("pass").Value = "xxx"
                        .Document.forms(0).submit
                        While .Busy Or .ReadyState <> 4: DoEvents: Wend
                        Debug.Print .LocationURL
                        
                        'Acessa a página de yyy
                        
                        While .Busy Or .ReadyState <> 4: DoEvents: Wend
                        .Navigate "https://yyy"
                        
                                         
                                       
    'Testes com erro
    Dim HTMLdoc As HTMLDocument
    Dim TDelements As IHTMLElementCollection
    Dim TDelement As HTMLTableCell
        
            Set HTMLdoc = .Document
    End With
         
        Set TDelements = HTMLdoc.getElementsByTagName("A")
         
         
       
        
        For Each TDelement In TDelements
            
            MsgBox TDelement
            
               If TDelement.className = "add" Then '<--- O ERRO OCORRE AQUI
               
                Application.Wait Now() + TimeValue("00:00:01")
                TDelement.Click
                
               End If
               
        Next
    sexta-feira, 10 de janeiro de 2014 10:43

Todas as Respostas

  • Janaílton,

    Qual o valor que retorna TDelement.className ? É uma string ?

    No seu código você fez um "MsgBox TDelement", o que ele exibe ?

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    sexta-feira, 10 de janeiro de 2014 10:53
  • Olá Durval,

    Seguem respostas:

    Qual o valor que retorna TDelement.className ? É uma string ?

    Coloquei um 'MsgBox TDelement.className' e ele retornou uma mensagem em branco e, mesmo após matar a linha do if que estava dando o erro, o programa retornou o mesmo erro, mas agora na linha de comando do 'MsgBox TDelement.className'.

    No seu código você fez um "MsgBox TDelement", o que ele exibe ?

    >> retornou a URL do site  seguida de /index.html

    sexta-feira, 10 de janeiro de 2014 11:10
  • Janaílton,

    Vamos dividir este trecho do seu código. Quando você criou o objeto:

    Set TDelements = HTMLdoc.getElementsByTagName("A")
    Ele vai obter todas às tag "a" do documento HTML carregado no IE.document que pela sua explicação deve estar carregando o conteúdo corretamente.

    Então o TDelement.className deve retornar o nome do CSS que você está utilizando nesta tag. O erro pode estar ocorrendo porque você não tem o atributo "class" na tag "a". Se você precisa obter o nome adicionado na tag "a", tente utilizar o atributo "Name".

    Insira também (só para teste) um MsgBox dentro da sua condição "If TDelement.className = "add" Then", para ter certeza que outros objetos são estão causando o erro.

    Se ajudou a resolver seu problema, não esqueça de marcar como resposta.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Sugerido como Resposta Edinaldo Junior sexta-feira, 10 de janeiro de 2014 13:00
    sexta-feira, 10 de janeiro de 2014 11:28
  • Durval,

    O atributo consta na tag a. Segue o resultado do Inspecionar Elemento (se ajudar, posso fazer a condição através de outro atributo, mas ainda não sei como):

    <a href="#" class="add" onclick="aqui o site tem uma função" title="Add">
     <span>Add</span>
     </a>

    Quando coloco o MsgBox dentro da condição If, a mesma falha do primeiro e-mail é detectada.

    sexta-feira, 10 de janeiro de 2014 11:41
  • Janaílton,

    Tente obter a tag que você precisa, incluindo o atributo "name" na tag "a".

    <a href="#" name="add" class="add" onclick="aqui o site tem uma função" title="Add">

    E no seu IF:

    If TDelement.Name = "add" Then

    Não esqueça todos os posts que te ajudaram como resposta.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Sugerido como Resposta Edinaldo Junior sexta-feira, 10 de janeiro de 2014 13:00
    sexta-feira, 10 de janeiro de 2014 12:09
  • Durval,

    Desculpe a minha ignorância no assunto, mas não tenho ação em cima do código deste site. Sei que é possível fazer esta inserção através do inspecionar elemento, mas eu teria que fazer isso cada vez que eu acessar e tentar automatizar este site, o que inviabilizaria meu projeto. Não há nenhuma outra maneira de conseguir realizar um evento de clique nesse elemento?

    sexta-feira, 10 de janeiro de 2014 12:31
  • Durval,

    Desculpe a minha ignorância no assunto, mas não tenho ação em cima do código deste site. Sei que é possível fazer esta inserção através do inspecionar elemento, mas eu teria que fazer isso cada vez que eu acessar e tentar automatizar este site, o que inviabilizaria meu projeto. Não há nenhuma outra maneira de conseguir realizar um evento de clique nesse elemento?

    Janaílton,

    Já que você não pode alterar o HTML da página, recomendo que você compare no seu IF à URL contida no atributo "href" da tag "a" com o valor recebido no seu loop na variável "TDelement".

    Segue um modelo de script:

    If TDelement = "http://www.x.com.br/index.htm" then

    Não esqueça todos os posts que te ajudaram como resposta.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Sugerido como Resposta Edinaldo Junior sexta-feira, 10 de janeiro de 2014 13:00
    sexta-feira, 10 de janeiro de 2014 12:58
  • Durval,

    Quando clico em qualquer href da página, o valor retornado é da home page. Como faço para saber o href do elemento que quero?

    sexta-feira, 10 de janeiro de 2014 15:54
  • Janaílton,

    Acredito que o ideal é você obter um "nó" raíz do seu HTML para verifica se realmente à tag "a" que você procura está disponível nesta página ou se é um "include" ou uma outra página anexada através de um "iframe" ou algo semelhante.

    Faça esta verificação por partes, por exemplo: da mesma forma que você pode obter uma tag "a", você pode obter uma tag "table" ou "div" ou "body" ou até "html".

    Veja o código fonte desta página e tente localizar quem é a tag "pai" desta tag "a" que você procura. Com isto, você vai definindo onde exatamente você precisa mapear o objeto no VBA para encontrar o que procura.

    Não esqueça de marcar todos os posts que te ajudaram como resposta.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    sexta-feira, 10 de janeiro de 2014 16:51