segunda-feira, 17 de junho de 2013

Excel - Como acessar a escalação de um time do Cartola FC através do VBA

No VBA é possível declarar um objeto do Intenet Explorer. Para isso acesse Ferramentas > Referências, na tela do VBA, que pode ser acessada pelo atalho (Alt+F11) no Excel.


Aparecerá a seguinte tela:


Habilite a função "Microsoft Internet Controls" e depois clique em "OK".

Insira um Módulo para facilitar o desenvolvimento:

Com um módulo, suas funções ficam visíveis para todas as planilhas.

Importante: Para a macro funcionar é necessário estar logado no Cartola: Faça o login no Internet Explorer. https://loginfree.globo.com/login/438

Insira a seguinte função no módulo recém criado:
 Sub navega_cartola_fc()  
Dim navegador As Object
Dim time As String
Set navegador = New InternetExplorer
time = "chupinsco-fc" 'Digite aqui o time
navegador.Navigate "http://cartolafc.globo.com/#!/time/" + time
While navegador.Busy
Wend
Dim r, c As Integer
Dim elemCol as object
Set elemCol= navegador.Document.getElementsByTagName("tbody")
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 3)
For r = 0 To elemCol(0).Rows.Length - 1
For c = 0 To elemCol(0).Rows(r).Cells.Length - 1
ActiveSheet.Cells(r + 1, c + 1) = _
elemCol(0).Rows(r).Cells(c).innerText
Next c
Next r
Set elemCol = Nothing
Set navegador = Nothing
End Sub

Para executar, basta pressionar F5, depois de clicar em parte interna do código.

Explicando seu funcionamento:
1. Um objeto tipo Internet Explorer é instanciado (navegador = New InternetExplorer)
2. Uma variável string time é criada, no caso o complemento do time Chupinsco FC que é (time = "chupinsco-fc"). Este é o nome do time da forma que aparece no link do Cartola. Essa variável pode ser modificada para qualquer time desejado.
3. O comando "Navegador.Navigate" é utilizado para acessar determinado link através do objeto.
4. A expressão "While navegador.busy : Wend" faz com que a aplicação aguarde até que o Internet Explorer não esteja mais ocupado carregando o link.
5. As variáveis "r" e "c" são instanciadas como inteiros. Elas representam a referência da "Coluna/Col" e "Linha/Row"
6. Um objeto elemCol é instanciado, para representar um elemento adquirido através da função método "getElementsByTagName". Com essa função, é localizado no código fonte da página todos os Elementos existentes com a palavra "tbody". Isso representa que todos os elementos tipo tabela <tbody> são armazenados no objeto "elemCol".
7. Um comando de espera, como o Aplication.wait é inserido a fim de evitar problemas na hora de carregar o objeto elemCol.
8. Dois laços tipo For são encadeados com as varíáveis "r" e "c" para correr entre o total de linhas "elemCol(0).Rows.Length" e pelo total de colunas "elemCol(0).Rows(r).Cells.Lenght".
9. O que retorna o valor de cada conjunto (linha, coluna) da tabela HTML é a função "innerText". No caso o elemCol(0) <- O primeiro elemento representado por zero, que corresponde a tabela do time.
Para representar uma linha e coluna: elemCol(0).Rows(r).Cells(c).innerText.
10. O comando ActiveSheet.Cells(r+1,c+1) representa a posição em que será atribuído o valor correspondente da tabela que está em HTML.

Neste exemplo o resultado no Excel para este fluxo é:


15 comentários:

  1. Pedro, ao tentar executar a função descrita acima ocorre o erro "erro em tempo de execução '91' a variavel do objeto ou a variavel with" podes me auxiliar?

    ResponderExcluir
    Respostas
    1. Olá Ricardo em que linha do código fica amarelo onde acontece o erro?

      Excluir
    2. Ricardo, tenta assim
      While navegador.Busy
      Wend
      Para
      While navegador.Busy: Wend
      Dai vai funcionar numa boa! ^^

      Excluir
    3. "Erro de tempo de execução 70"
      Linha amarela : For r = 0 To elemCol(0).Rows.Length - 1

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Cara! Meus parabéns! Teria como dar outro exemplo, tipo como listar todos os jogadores de mercado? Desde já muito obrigado!

    ResponderExcluir
  4. Este comentário foi removido pelo autor.

    ResponderExcluir
  5. Pedro, ao tentar executar a função descrita acima ocorre o erro "erro em tempo de execução '91'

    linha que deu erro foi :
    For r = 0 To elemCol(0).Rows.Length - 1

    pode me ajudar ??

    ResponderExcluir
  6. O meu deu esse erro tambem creio que tem a ver com a versão do microsoft
    Alguem poderia ajudar?

    ResponderExcluir
  7. Eu consegui fazer, sem problemas mas o resultado mostrado não é parecido com o que foi mostrado pelo site. Há algo que tenha que mudar?
    Agradeço desde já a ajuda! Meus parabéns

    ResponderExcluir