Notifications
Clear all

VBA/IE - Capturar Dado de Uma TD

9 Posts
2 Usuários
0 Reactions
2,737 Visualizações
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Boa noite a todos!

Estou tentando capturar um dado de uma td de uma determinada página, porém não obtive êxito. Estou tentando usar essa macro:

Sub teste3()
Dim ie As Object

Set ie = CreateObject("InternetExplorer.Application")
ie.navigate " http://www.bmfbovespa.com.br/Cias-Listadas/Empresas-Listadas/ResumoEmpresaPrincipal.aspx?codigoCvm=18414&idioma=pt-br"
ie.Visible = True

Do While ie.Busy
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
Loop

For i = 1 To ie.Document.all.Length
If ie.Document.all.Item(i).innertext = "IdentificacaoDadoCapitalSocial" Then
ThisWorkbook.Worksheets(1).Range("A1") = ie.Document.all.Item(i + 2).innertext
Exit For
End If
Next i

End Sub

O objetivo era "capturar" o número total de ações, mas sempre dá erro. Alguém sabe onde errei? Postei a planilha exemplo em: http://www.sendspace.com/file/xka8ti

Desde já agradeço qualquer ajuda ou orientação.

 
Postado : 12/01/2013 7:16 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Milena,

Me avise pois não saco muito de macros...

Aqui funcionou.

Abs,

 
Postado : 13/01/2013 3:23 am
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Mandrix, bom dia!

Eu tinha pensado no Query, mas pra mim nao serve, pois da forma que está ele baixa apenas a "tabela 15" e este exemplo que passei na planilha foi apenas um exemplo de 1 empresa, pois há centenas. Por exemplo, a tabela que fala o número das ações da WEG é a 16, enquanto a do exemplo da planilha é a 15.
Por isso acredito que o melhor caminho é uma rotina que "pegue" o valor da "TD", pois o nome da TD é igual para todas as empresas.

Agradeço demais sua atenção.

 
Postado : 13/01/2013 6:36 am
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Acho que estou chegando perto. Achei um código na internet que deveria funcionar, porém alguma coisa está faltando:

Sub teste3()

Dim ie As Object
Dim td
Set ie = CreateObject("InternetExplorer.Application")

ie.Navigate " http://www.bmfbovespa.com.br/Cias-Listadas/Empresas-Listadas/ResumoEmpresaPrincipal.aspx?codigoCvm=18414&idioma=pt-br"
ie.Visible = True

Do While ie.Busy
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
Loop
For Each td In ie.Document.getElementsByTagName("td")
If td.className = "DadoCapitalSocial" Then
ThisWorkbook.Worksheets(1).Range("a1") = td.className
Exit For
End If
Next

End Sub

Eu acho que deve ser o "For Each", pois ele está encerrando a macro sem o loop. Onde errei?

Obrigada

 
Postado : 13/01/2013 9:28 am
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Achei outro, porém o "For each" está encerrando sem fazer o loop.

Sub Extract_TD_text()

Dim URL As String
Dim IE As InternetExplorer
Dim HTMLdoc As HTMLDocument
Dim TDelements As IHTMLElementCollection
Dim TDelement As HTMLTableCell
Dim r As Long

'Saved from www vbaexpress com/forum/forumdisplay.php?f=17
URL = " http://www.bmfbovespa.com.br/Cias-Listadas/Empresas-Listadas/ResumoEmpresaPrincipal.aspx?codigoCvm=18414&idioma=pt-br"

Set IE = New InternetExplorer

With IE
.Navigate URL
.Visible = True

'Wait for page to load
While .Busy Or .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend

Set HTMLdoc = .Document
End With

Set TDelements = HTMLdoc.getElementsByTagName("TD")

r = 0
For Each TDelement In TDelements
'Look for required TD elements - this check is specific to VBA Express forum - modify as required
If TDelement.className = "DadoCapitalSocial" Then
ThisWorkbook.Worksheets("Plan1").Range("a1").Offset(r, 0).Value = TDelement.innerText
r = r + 1
End If
Next

End Sub

 
Postado : 13/01/2013 9:39 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Milena,

Fiquei intrigado com sua demanda e avancei mais um pouco na tentativa de solucioná-la.

Mantive a estratégia de query mas desta vez optei por uma abordagem mais racional. Montei uma base de dados com as empresas CVM (não tenho certeza se é a atualizada) e nela atribuo o código e o número da tabela.

Com base nisso, basta vc selecionar a empresa na base (com filtro na 1a letra, pro combo não ficar gigante) e rodar a macro - código e tabela são atualizados automaticamente.

Caso não venha resultado, basta atualizar o número da tabela na base (vc pode tb incluir diretamente em E4).

Acho que desta forma facilita mais sua vida.

Me avise pois testei muito pouco. Mas, por aqui, tá funcionando a contento.

Abs,

Importante: Ao atualizar a base de dados, MANTENHA as empresas ORDENADAS ALFABETICAMENTE. Olhando as fórmulas vc vai entender o motivo.

 
Postado : 13/01/2013 10:38 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

MANDRIX, achei o máximo o que você fez!!

Como você fez pra saber se a tabela é a 15 ou 16? Ví que tudo foi digitado e não ví nenhuma rotina que busca esta informação.

De qualquer forma achei genial sua sugestão.

 
Postado : 14/01/2013 2:18 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Coloquei aleatoriamente. Conforme te expliquei, basta vc ter essa info 1 vez e cadastrar. Feito isso, qualquer consulta posterior ficará ok.

Que legal que vingou.

Abs,

 
Postado : 14/01/2013 2:52 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Muítissimo obrigado pela sua ajuda, Mandrax! :)

 
Postado : 14/01/2013 5:55 pm