Abra a página da Web, selecione tudo, copie na folha

Eu procurei alto e baixo por algo que vai funcionar para mim sobre isso, sem sorte! Qualquer ajuda seria muito apreciada! 🙂 Olhando para copiar dados de opções de ações do Barcharts.com e cole em folha de excel.

aqui é onde eu estou:

Sub CopyTables() Dim ie As Object Dim I As Long I = 0 Set ie = CreateObject("InternetExplorer.Application") ie.navigate "https://www.barchart.com/stocks/quotes/GOOG/options?moneyness=allRows&view=sbs&expiration=2018-02-23" ie.Visible = True Do While ie.Busy And Not ie.readyState = 4 DoEvents Loop DoEvents Set tables = ie.document.getElementsByTagName("table") SetDataFromWebTable tables, Range("B5") ie.Quit End Sub 

Se possível, eu também gostaria de extrair as datas do menu suspenso “Expiration” e colá-las no Excel também. Muito obrigado antecipadamente por qualquer ajuda sobre isso!

A origem da página da Web em HTML pelo link fornecido

https://www.barchart.com/stocks/quotes/GOOG/options?moneyness=allRows&view=sbs&expiration=2018-02-23

não contém os dados necessários, usa o AJAX. O site https://www.barchart.com tem uma API disponível. A resposta é retornada no formato JSON. Navegue pela página, por exemplo, no Chrome, abra a janela Ferramentas do desenvolvedor ( F12 ), guia Rede , recarregue ( F5 ) a página e examine os XHRs registrados. A maioria dos dados relevantes é uma string JSON retornada pelo URL:

https://core-api.barchart.com/v1/options/chain?symbol=GOOG&fields=optionType%2CstrikePrice%2ClastPrice%2CpercentChange%2CbidPrice%2CaskPrice%2Cvolume%2CopenInterest&groupBy=strikePrice&meta=field.shortName%2Cfield.description%2Cfield. tipo & raw = 1 e expirationDate = 2018-02-23

Pré-visualização do XHR

Cabeçalhos XHR

Você pode usar o código VBA abaixo para recuperar informações conforme descrito acima. Importe o módulo JSON.bas no projeto VBA para processamento JSON.

 Option Explicit Sub Test48759011() Dim sUrl As String Dim sJSONString As String Dim vJSON As Variant Dim sState As String Dim aData() Dim aHeader() sUrl = "https://core-api.barchart.com/v1/options/chain?" & _ Join(Array( _ "symbol=GOOG", _ "fields=" & _ Join(Array( _ "optionType", _ "strikePrice", _ "lastPrice", _ "percentChange", _ "bidPrice", _ "askPrice", _ "volume", _ "openInterest"), _ "%2C"), _ "groupBy=", _ "meta=" & _ Join(Array( _ "field.shortName", _ "field.description", _ "field.type"), _ "%2C"), _ "raw=1", _ "expirationDate=2018-02-23"), _ "&") With CreateObject("MSXML2.XMLHTTP") .Open "GET", sUrl, False .send sJSONString = .responseText End With JSON.Parse sJSONString, vJSON, sState vJSON = vJSON("data") JSON.ToArray vJSON, aData, aHeader With Sheets(1) .Cells.Delete .Cells.WrapText = False OutputArray .Cells(1, 1), aHeader Output2DArray .Cells(2, 1), aData .Columns.AutoFit End With End Sub Sub OutputArray(oDstRng As Range, aCells As Variant) With oDstRng .Parent.Select With .Resize(1, UBound(aCells) - LBound(aCells) + 1) .NumberFormat = "@" .Value = aCells End With End With End Sub Sub Output2DArray(oDstRng As Range, aCells As Variant) With oDstRng .Parent.Select With .Resize( _ UBound(aCells, 1) - LBound(aCells, 1) + 1, _ UBound(aCells, 2) - LBound(aCells, 2) + 1) .NumberFormat = "@" .Value = aCells End With End With End Sub 

A saída para mim é a seguinte:

saída

Para tornar a saída mais próxima da visualização Lado a Lado na página da Web, você pode brincar um pouco com os parâmetros de consulta:

  sUrl = "https://core-api.barchart.com/v1/options/chain?" & _ Join(Array( _ "symbol=GOOG", _ "fields=" & _ Join(Array( _ "optionType", _ "strikePrice", _ "lastPrice", _ "percentChange", _ "bidPrice", _ "askPrice", _ "volume", _ "openInterest"), _ "%2C"), _ "groupBy=strikePrice", _ "meta=", _ "raw=0", _ "expirationDate=2018-02-23"), _ "&") 

E também mude a linha

  Set vJSON = vJSON("data") 

Nesse caso, a saída é a seguinte:

output2

BTW, a abordagem semelhante aplicada nas seguintes respostas: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 e 11 .