(不定期更新)使用VBA解決 excel web 查詢無法匯入、匯入太慢的股市資料

snare樓主您好,

這是承前一提問所衍生出的錯誤,請指點一下:

以下程式碼是抓取yahoo每檔股票9年股利的部分程式碼,但改版後,有的股票一個年度會產生上下年度2筆,如截圖一.中的0,及1; 二者最大差別在有無"exDate"字串資料,若無"exDate"字串時,則會無"year",而產生錯誤中斷,要如何撰寫判斷若無"exDate",則跳下一個(即1),但又需保持迴圈"For j=0 to 8"不變,因其他股票無上下年度?

For j = 0 To 8 '每種股票顯示最近9年股利資料


TempArray(j, 0) = CallByName(CallByName(DecodeJson, j, VbGet), "year", VbGet) - 1911

If IsNull(CallByName(CallByName(DecodeJson, j, VbGet), "exDividend", VbGet)) Then '判斷是否有現金股利
'若是Null,則填入"-"及0
TempArray(j, 1) = "-"
TempArray(j, 2) = 0

圖一:


圖二:股利部分上下年度截圖(股票代號:6184):
activer wrote:
要如何撰寫判斷若無"exDate",則跳下一個(即1),但又需保持迴圈"For j=0 to 8"不變


沒JScriptTypeInfo物件時,會出現錯誤438,簡單的方法可使用 on error

特殊一點的,請參考1168樓
配合使用 getKeys、GetObjectProperty、getProperty ,3個特別改寫過的function
可把JScriptTypeInfo轉成variant/string









activer
[謝謝]學習消化一下
樓主好~ 鉅亨網的台股歷史資料,設定為最多只能下載5年的資料.
不知是我的問題還是真的有變動了?

感謝感謝~~
snare
剛試了一下,是被改5年沒錯。
感謝樓主幫忙測試~
我發現鉅亨網新版的線圖資料是可以拉到幾十年的,
不知有啥方法可捉取日資料.


以下是我4年前鉅亨網資料測試的結果,提供大家參考(我帳號最近才啟用):

1.鉅亨網個股歷史行情下載(用xmlhttp方法)(資料與證交所有出入且會缺檔)
2.鉅亨網個股歷史行情下載(新版網頁json格式)(資料與yahoo有所出入)_美股
3.鉅亨網個股歷史行情下載(新版網頁json格式)(資料與證交所一樣)
newsoft wrote:
我發現鉅亨網新版的線圖資料是可以拉到幾十年的,
不知有啥方法可捉取日資料.


線圖資料,印象中寫過很多次了…

這個圖的資料是分2次下載的,打開一次,超過5年,再一次












(點我看大圖)





另外為了方便測試,特別把2次下載分開,請自行練習如何從程式碼中修掉。
newsoft
感謝樓主解答~
版主大大你好

想請教一下,之前有抓這個網站的表格資料https://norway.twsthr.info/StockHolders.aspx?STOCK=6457,但最近好像都無法抓,不曉得是什麼原因,程式碼大致如下,變數result都沒東西,可否麻煩一下,謝謝!

norwayURL = "https://norway.twsthr.info/StockHolders.aspx?STOCK=6457"
With GetXml
.Open "GET", norwayURL, False
.send
End With
result = GetXml.responsetext
Set Html = CreateObject("htmlfile")
Html.body.innerhtml = result

Set objTable = Html.getelementsbytagname("table")(10).Rows

ReDim NorwayArray(objTable.Length - 1, objTable(1).Cells.Length - 4)
peter624 wrote:
不曉得是什麼原因,程式碼大致如下,變數result都沒東西


原因不明,請貼完整程式碼
我試很正常,測試用的方式
是上次在318樓回答您問題,21樓簡易方式下載


表格0~21,請自行測試








snare wrote:
執行 Google_Drive...(恕刪)

您好:
請問之前這一段程式碼都可以執行,但是這兩天出現錯誤,可以麻煩您幫忙一下,謝謝


Sub Google_Drive_File_Name_ID()
Dim URL As String, GetXml As Object, Jsondata As Object, DecodeJson, temp, n As Integer, i As Integer
Set GetXml = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Jsondata = CreateObject("HtmlFile")

Jsondata.write ""

URL = "https://drive.google.com/drive/folders/1ZuRkxr4QzOAkp60hi_bJk9RzdAIM8eG4"

With GetXml

.Open "GET", URL, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

FilesId = "[[""driveweb;" & Split(Split(.responsetext, "[[""driveweb;")(1), """檔案""]]")(O) & """檔案""]]"
Set DecodeJson = CallByName(CallByName(Jsondata.JsonParse(FilesId), 0, VbGet), 1, VbGet)
n = CallByName(DecodeJson, "length", VbGet)

ReDim temp(1 To n, 1 To 2)

For i = 1 To n
temp(i, 1) = CallByName(CallByName(DecodeJson, i - 1, VbGet), 0, VbGet)
temp(i, 2) = CallByName(CallByName(DecodeJson, i - 1, VbGet), 2, VbGet)

Next i

End With

Set GetXml = Nothing
Set Jsondata = Nothing
Set DecodeJson = Nothing
野比大雄1
我不知道怎麼刪文 不好意思 已經可以囉 謝謝您,
snare
那麼應該只是暫時性的網路問題,有興趣可回1399樓下載美化版的範例。

snare
wrote:
原因不明,請貼完整程...(恕刪)



已解決 只是table改抓第11個 謝謝
Yahoo Finacne昨天又改版了…
這次找不到table,不知道該怎麼抓?
https://finance.yahoo.com/quote/BND


原本的副程式:
Sub getstockusetf(RowFirstETF, RowCountETF)

Dim URL, HTMLsourcecode, GetXml
Dim Stock As String
Dim i, j, t, n_etf As Integer
For n_etf = RowFirstETF To RowFirstETF + RowCountETF - 1
Symbol = Sheets("US.Stock").Cells(n_etf, 1)
quotelen = Len(Stock)

DoEvents
Set HTMLsourcecode = CreateObject("htmlfile")
Set GetXml = CreateObject("msxml2.xmlhttp")
URL = "https://finance.yahoo.com/quote/" & Symbol
With GetXml
.Open "GET", URL, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
Do Until .ReadyState = 4: DoEvents: Loop

HTMLsourcecode.body.innerhtml = .responsetext

For t = 0 To 1
Set Table = HTMLsourcecode.All.tags("table")(t).Rows

colscount = Table(t).Cells.Length
rowscount = Table.Length
TempArrayETF(n_etf - RowFirstETF, 0) = HTMLsourcecode.querySelector("#quote-header-info [data-field=regularMarketPrice]").innerText
TempArrayETF(n_etf - RowFirstETF, 1) = HTMLsourcecode.querySelector("#quote-header-info [data-field=regularMarketChange]").innerText
TempArrayETF(n_etf - RowFirstETF, 2) = HTMLsourcecode.querySelector("#quote-header-info [data-field=regularMarketChangePercent]").innerText

For i = 1 To colscount - 1
For j = 0 To rowscount - 1
TempArrayETF(n_etf - RowFirstETF, j + 3 + t * 8) = Trim(Table(j).Cells(i).innerText)
Next j
Next i
Next t

End With

Set HTMLsourcecode = Nothing
Set GetXml = Nothing

Next n_etf

End Sub
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

今日熱門文章 網友點擊推薦!