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 é:


3 comentários:

  1. Olá, ótimo post. Me tire uma dúvida, ao invés de visualizar somente um time, eu conseguiria fazer a captura de todos os jogadores do mercado do Cartola FC ?
    É possível?
    Abs, Ruan

    ResponderExcluir
    Respostas
    1. Sim, é possível. Mas é um pouco mais trabalhoso. Vou preparar um post para fazer isso nos próximos dias. Abs.

      Excluir
    2. 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 ??

      Excluir