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


snare wrote:
不是,我在291樓解釋過了(blob url)
一字未改
您290樓檔案,也可以正常執行
也許是您的網路問題,可能是設定了什麼奇怪的dns、proxy server...(恕刪)



特別回來報告一下
看起來真的是 proxy 的問題,我把所有的 proxy 設定暫時先關閉後
Get方法在 .send 的時候就沒有出錯了

師傅真的神~
師傅這個功能相當不錯用!
感謝師傅!
麥克連大師的Excel 8大指標,為什麼突然寫這個範例呢,因為在投資理財看到這篇


發現到整理出8大指標,要拿資料的網站,基本上我的範例中都有,所以就整合一下
可是我不玩期貨、選擇權,(麥克連是誰???)不知道什麼資料重要,所以每份資料的表格都全部下載
共10份資料,其中一份taifex_mtx(夜),不確定重不重要,就順便下載

跟那篇文章中的程式比較不一樣地方,就是這個資料下載範例是"純vba版,不用另外裝軟體"
還有最重要的是,當網站改版時,我不一定會更新程式碼


大盤指數 + 近月台指




三大法人買賣金額統計表




美元指數+美元/新台幣 現價 升貶




taifex




taifex_mtx(日)




taifex_mtx(夜)




taifex_etfs




taifex_pc




taifex_未沖銷




全球股市指數
這裡直接抓最後一個有資料的連結







'======================================================
雖然下載時間稍微久一點(共10份資料),沒辦法在3秒內,但還在5秒內喔




如果用投資理財那篇文章,只挑出想要的資料,那還可以更快,不過這部份請自行修改程式碼
另外為了不擋人財路
畢竟投資理財那篇文章的的作者,有提供了一個功能還不錯的體驗版
只可惜不是用vba做的excel,所以不能自己修改
(進階版的要不少$$$,好險我自己會寫)

所以特別保留了一部份,程式中並沒有整理成“總表”的功能

但這一部份,因為資料都下載分類好了,只要會excel基本函數就可以解決了,不一定要寫程式
不過因為是"純vba",所以有一定基礎的人,很容易就可以修改成,功能不輸付費程式的個人化表單


'======================================================
'前置作業需建立11個工作表,名稱分別為
main
yahoo
twse
cnyes
taifex
taifex_mtx(日)
taifex_mtx(夜)
taifex_etfs
taifex_pc
taifex_未沖銷
stockq
'======================================================
'在main工作表中插入一個activex commandbutton
'以下程式碼放入 commandbutton 內
'======================================================
Private Sub CommandButton1_Click()


Sheets("main").Select
Sheets("main").Columns("A:A").ClearContents


ttt = Timer

Call getyahoo
Call gettwse
Call getcnyes
Call gettaifex
Call getstockq

Debug.Print Timer - ttt

'下載(更新)資料,成功或失敗,會在 main工作表,用簡單的訊息表示
Sheets("main").Select
Sheets("main").Cells(1, 1).Select


End Sub

Sub aaaaa()

'2018/3/5更新,這些沒用的字,是為了避免卡巴誤判成病毒加上的
'asl;dfkjal;sdjfal;sjdfalsdf
'asdlk;fj;alsdjf;lasjdkf;lka
'owqieurtwoeiprt902845609245369
'dfkjgjhs;fklgj;sldgfkj;



End Sub

'======================================================
'以下程式碼放入模組裡
'內有5個副程式,每個副程式都可以獨立出來使用,預設都是抓最後一個交易日的資料
'======================================================
Sub getyahoo() '大盤指數 + 近月台指

Application.ScreenUpdating = False
On Error Resume Next
Dim URL As String, HtmlSourceCode As Object, GetXml As Object, Clipboard As Object, table
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set HtmlSourceCode = CreateObject("htmlfile")
Set GetXml = CreateObject("msxml2.xmlhttp")
URL = "https://tw.screener.finance.yahoo.net/future/aa02"

With GetXml
.Open "GET", URL, False
.setRequestHeader "Referer", "https://tw.stock.yahoo.com/"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

If Len(.responsetext) = 0 Then
Sheets("main").Cells(1, 1) = "大盤指數 + 近月台指" & Time & " Error"
Application.ScreenUpdating = True
Exit Sub
End If

HtmlSourceCode.body.innerhtml = .responsetext
Set table = HtmlSourceCode.all.tags("table")(0)

With Clipboard
.SetText table.innerhtml
.PutInClipboard
End With

End With

With Sheets("yahoo")
.Select
.Cells.Clear
.Cells(1, 1).Select
.PasteSpecial NoHTMLFormatting:=True
.Columns.AutoFit
.Cells(1, 1).Select
End With

Set HtmlSourceCode = Nothing
Set Clipboard = Nothing
Set table = Nothing
Set GetXml = Nothing
Sheets("main").Cells(1, 1) = "大盤指數 + 近月台指" & Time & " ok"

Application.ScreenUpdating = True


End Sub


Sub gettwse() '三大法人買賣金額統計表

Application.ScreenUpdating = False
On Error Resume Next
Dim URL As String, GetXml As Object, Clipboard As Object
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set GetXml = CreateObject("msxml2.xmlhttp")
URL = "http://www.twse.com.tw/fund/BFI82U?response=html&dayDate=&weekDate=&monthDate=&type=day"


With GetXml
.Open "GET", URL, False
.setRequestHeader "Referer", "http://www.twse.com.tw/zh/page/trading/fund/BFI82U.html"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
If Len(.responsetext) = 0 Then
Sheets("main").Cells(2, 1) = "三大法人買賣金額統計表" & Time & " Error"
Application.ScreenUpdating = True
Exit Sub
End If


End With


With Clipboard
.SetText GetXml.responsetext
.PutInClipboard
End With

With Sheets("twse")
.Select
.Cells.Clear
.Cells(1, 1).Select
.PasteSpecial NoHTMLFormatting:=True
.Columns.AutoFit
.Columns("A").ColumnWidth = 30
.Cells(1, 1).Select
End With

Set GetXml = Nothing
Set Clipboard = Nothing
Sheets("main").Cells(2, 1) = "三大法人買賣金額統計表" & Time & " ok"
Application.ScreenUpdating = True


End Sub

Sub getcnyes() '美元指數+美元/新台幣 現價 升貶

Application.ScreenUpdating = False
On Error Resume Next
Dim URL As String, HtmlSourceCode As Object, GetXml As Object, table
Set GetXml = CreateObject("msxml2.xmlhttp")
Set HtmlSourceCode = CreateObject("htmlfile")

URL = "https://www.cnyes.com/forex/html5chart.aspx?fccode=dx&rate=exchange"


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
If Len(.responsetext) = 0 Then
Sheets("main").Cells(3, 1) = "美元指數+美元/新台幣 現價 升貶" & Time & " Error"
Application.ScreenUpdating = True
Exit Sub
End If
HtmlSourceCode.body.innerhtml = .responsetext
End With


With Sheets("cnyes")
.Select
.Cells.Clear
.Cells(1, 1) = "美元指數"
Set table = HtmlSourceCode.all.tags("table")(0).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
.Cells(i + 2, j + 1) = table(i).Cells(j).innerText
Next j
Next i

.Range("a5:c5") = Array("", "現價", "升貶")
Set table = HtmlSourceCode.all.tags("table")(3).Rows
For i = 0 To 2
.Cells(6, i + 1) = table(1).Cells(i).innerText
Next i
.Columns.AutoFit
.Cells(1, 1).Select
End With

Set GetXml = Nothing
Set HtmlSourceCode = Nothing
Set table = Nothing
Sheets("main").Cells(3, 1) = "美元指數+美元/新台幣 現價 升貶" & Time & " ok"
Application.ScreenUpdating = True


End Sub

Sub gettaifex() '三大法人-區分各期貨契約+mtx(日)+mtx(夜)+ 選擇權買賣權分計 +PutCall +未沖銷

Application.ScreenUpdating = False
On Error Resume Next
Dim URL1 As String, URL2 As String, URL3 As String, URL4 As String, URL5 As String, URL6 As String
Dim HtmlSourceCode As Object, GetXml As Object, Clipboard As Object
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set GetXml = CreateObject("msxml2.xmlhttp")
Set HtmlSourceCode = CreateObject("htmlfile")

'(2018/11/13 網頁改版,修正6個網址,可重新下載檔案,或自行修改以下6行網址)
URL1 = "https://www.taifex.com.tw/cht/3/futContractsDateExcel" '期貨
URL2 = "https://www.taifex.com.tw/cht/3/futDailyMarketExcel?commodity_id=MTX" 'mtx 日
URL3 = "https://www.taifex.com.tw/cht/3/futDailyMarketExcel?commodity_id=MTX&marketCode=1" 'mtx 夜
URL4 = "https://www.taifex.com.tw/cht/3/callsAndPutsDateExcel" '選擇權買賣權分計
URL5 = "https://www.taifex.com.tw/cht/3/pcRatioExcel" '臺指選擇權Put/Call比
URL6 = "https://www.taifex.com.tw/cht/3/largeTraderFutQryTbl" '期貨大額交易人未沖銷部位結構表





For i = 1 To 6
With GetXml
.Open "GET", Choose(i, URL1, URL2, URL3, URL4, URL5, URL6), False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

If Len(.responsetext) = 0 Then
Sheets("main").Cells(3 + i, 1) = Choose(i, "taifex", "taifex_mtx(日)", "taifex_mtx(夜)", "taifex_etfs", "taifex_pc", "taifex_未沖銷") & Time & " Error"
Else
HtmlSourceCode.body.innerhtml = .responsetext

With Clipboard
.SetText HtmlSourceCode.body.innerhtml
.PutInClipboard
End With

With Sheets(Choose(i, "taifex", "taifex_mtx(日)", "taifex_mtx(夜)", "taifex_etfs", "taifex_pc", "taifex_未沖銷"))
.Select
.Cells.Clear
.Cells(1, 1).Select
.PasteSpecial NoHTMLFormatting:=True
.Columns.AutoFit
.Columns("A").ColumnWidth = 25
.Cells(1, 1).Select
End With
Sheets("main").Cells(3 + i, 1) = Choose(i, "taifex", "taifex_mtx(日)", "taifex_mtx(夜)", "taifex_etfs", "taifex_pc", "taifex_未沖銷") & Time & " ok"
End If
End With
Next i

Set GetXml = Nothing
Set Clipboard = Nothing
Set HtmlSourceCode = Nothing
Application.ScreenUpdating = True


End Sub

Sub getstockq() '全球股市指數

Application.ScreenUpdating = False
On Error Resume Next
Dim URL As String, Url_a As String, HtmlSourceCode As Object, GetXml As Object, Clipboard As Object, table, temp, temp1, temp2
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set HtmlSourceCode = CreateObject("htmlfile")
Set GetXml = CreateObject("msxml2.xmlhttp")
URL = "http://www.stockq.org/stock/history/"


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

If Len(.responsetext) = 0 Then
Sheets("main").Cells(10, 1) = "全球股市指數" & Time & " Error"
Application.ScreenUpdating = True
Exit Sub
End If

HtmlSourceCode.body.innerhtml = .responsetext

' get last url
'這裡直接抓最後一個有資料的連結
With HtmlSourceCode
Set table = .getElementsByTagName("td")
For Each temp In table
Set temp1 = temp.getElementsByTagName("a")
For Each temp2 In temp1
If InStr(temp2.href, "_tc.php") > 0 Then
Url_a = temp2.href
End If
Next
Next
End With

.Open "GET", URL & Replace(Url_a, "about:/stock/history/", ""), False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

If Len(.responsetext) = 0 Then
Sheets("main").Cells(10, 1) = "全球股市指數" & Time & " Error"
Application.ScreenUpdating = True
Exit Sub
End If

HtmlSourceCode.body.innerhtml = .responsetext
Set table = HtmlSourceCode.all.tags("table")(4)


With Clipboard
.SetText table.innerhtml
.PutInClipboard
End With

End With

With Sheets("stockq")
.Select
.Cells.Clear
.Cells(1, 1).Select
.PasteSpecial NoHTMLFormatting:=True
.Columns.AutoFit
.Columns("A").ColumnWidth = 25
.Cells(1, 1).Select
End With

Set HtmlSourceCode = Nothing
Set Clipboard = Nothing
Set table = Nothing
Set GetXml = Nothing
Set temp = Nothing
Set temp1 = Nothing
Set temp2 = Nothing

Sheets("main").Cells(10, 1) = "全球股市指數" & Time & " ok"

Application.ScreenUpdating = True

End Sub

'======================================================

至於總表要怎麼整理,請自行上網搜尋excel 8大指標,或去投資理財區問別人
或是有人願意分享使用這個範例,寫出的總表整理副程式出來,我也很歡迎
如果有空時,也許會幫您優化一下程式碼



(2018/3/5 更新,程式碼中增加一些垃圾文字,避免卡巴誤判成病毒

(2018/11/13 因臺灣期貨交易所網址更新,修正gettaifex()副程式中的6個網址)
(gettwse() '三大法人買賣金額統計表,網址忘了加上s,請自行修改http=>https)

附加壓縮檔: 201811/mobile01-bbb6ab72ffd2780c7eeb192fa67a2bda.zip
都不曉得這棟樓已經蓋得那麼高了,
我今天才首次來訪,
一直以來也為了網站資料匯入問題搞得我頭大,
如今似乎抓到了浮木般...感恩樓主的分享,
由於個人VBA的水準還在喝奶爬行的階段,
我還是要先從#21樓開始爬文練功起,

目前主要卡在股票分析時主力買賣超籌碼資料匯入,
以往都是用Hi Stock的數據,如下連結
https://histock.tw/stock/branch.aspx?no=1101
這裡的資料有買賣超又有均價,
所以我可以依據均價來跟稍早(前十天)比對來判定今日買超的是贏家/輸家,
用來判定這個券商的動機是攤平、買轉賣、賣轉買、加碼、......
對我來講均價這個資訊變得很重要,
可惜Hi Stock改版後只列出買賣超前十筆(以前各15筆)
所以現在改匯入元富的數據,如下連結
http://www.masterlink.com.tw/stock/individual/information/Info_15.aspx
目前坊間可直接匯入的格式幾乎都是這一個格式的,可惜的是沒有均價的資訊

剛才看到玩股網有滿完整的數據,正是我所想要的,如下連結
https://www.wantgoo.com/stock/astock/agentstat?stockno=2303&type=3.5

不曉得這連結是否可依您所列的方法來克服資料匯入的問題?

在還沒能克服之前,我還是一步一步的查詢-複製-貼上,用土方法來做資料比對
川頁543 wrote:
http://www.masterlink.com.tw/stock/individual/information/Info_15.aspx
目前坊間可直接匯入的格式幾乎都是這一個格式的,可惜的是沒有均價的資訊
...(恕刪)


這是坊間在其它論壇、blog,抄來抄去的結果
所以下載方式都一樣,只要換個網站,就不會下載了
程式也不知道怎麼改,因為大家的方法都一樣

川頁543 wrote:
剛才看到玩股網有滿完整的數據,正是我所想要的,如下連結
https://www.wantgoo.com/stock/astock/agentstat?stockno=2303&type=3.5
不曉得這連結是否可依您所列的方法來克服資料匯入的問題?...(恕刪)


這個網站在vba不熟的情況下,除非您用 ie object 的方式來選日期、抓表格
程式才有辦法自己寫,可惜缺點是(很慢),下載可能要1~3分鐘

要用這棟樓的方式,您要自己處理可能會很麻煩,主要有4個問題

一、可產生資料的日期範圍
https://www.wantgoo.com/stock/astock/agentstat?stockno=????&type=3.5
是這個網頁用java設定的

二、表單的資料
https://www.wantgoo.com/stock/astock/agentstat_ajax?StockNo=????&Types=3.5&StartDate=????????&EndDate=????????&Rows=35"
是這個網頁傳回



三、表單最後的買超總計、賣超總計、主力方向
https://www.wantgoo.com/stock/astock/agentstat_total_ajax?StockNo=????&StartDate=????????&EndDate=????????&Rows=35
是這個網頁傳回



四、最後資料再用這個網頁中的java排出表格
https://www.wantgoo.com/stock/astock/agentstat?stockno=????&type=3.5
傳回值是json格式,但是買、賣,只是在名稱上用1、2,來區別
雖然網頁上買、賣是分成2邊,可是用複製貼上excel的話,您會發現資料是上下排列的
json完全沒分類,全部混在一起,還加上一堆\,用的是類似csv 格式的排列方式
不像其它網站,會在json中,就先分成2個物件,很好整理

所以您要自己寫的話
a'日期範圍可以不用理它,用if 判斷限制就好
b'表單的資料要用 219樓(或之後)的json解碼範例,先解碼
c'再用170樓的regexp處理字串範例,整理成csv格式,貼上excel
d'最後的再去另一個網頁把買超總計、賣超總計、主力方向的資料下載後,用b、c方式整理
範例網站:玩股網 https://www.wantgoo.com/ 券商進出買超vs買超排行
這個範例程式雖然不長,但稍微複雜一點,因為資料太亂(上一樓有說明)
要用到3個方法來整理下載後的資料
1、json解碼
2、regexp整理
3、csv格式貼上
還要注意日期限制的問題

(點下可看大圖)






(點下可看大圖)






(點下可看大圖)






(點下可看大圖)



'================================================
'程式碼放在模組裡
'================================================

Sub Getwantgoo_Jsondata()

Dim Xmlhttp As Object, Jsondata As Object, getkey As Object, DecodeJson, Wantgoodata, temp, buy As Integer, sell As Integer
Dim Url As String, url_a As String, url_b As String, stock As String, startday As String, endday As String, total As String

Set getkey = CreateObject("VBScript.RegExp")
Set Xmlhttp = CreateObject("Msxml2.XMLHTTP")
Set Jsondata = CreateObject("HtmlFile")





On Error Resume Next

Sheets("工作表1").Cells.Clear
Application.ScreenUpdating = False


stock = InputBox("股票代號", , "2317")
endday = InputBox("結束日期(8碼數字)", , CheckWeekDay(Date))
startday = InputBox("開始日期(8碼數字)", , CheckWeekDay(DateValue(Format(endday, "####-##-##")) - 10))

If endday = "" Or startday = "" Or stock = "" Or Len(startday) <> 8 Or Len(endday) <> 8 Then
MsgBox "資料可能輸入錯誤", vbOKOnly, "請重新輸入"
Exit Sub
End If

If startday > endday Or _
endday > CheckWeekDay(Date) Or endday > CheckWeekDay(DateValue(Format(endday, "####-##-##"))) Or _
startday > CheckWeekDay(DateValue(Format(startday, "####-##-##"))) Or startday < CheckWeekDay(Date - 30) Then
MsgBox "日期範圍可能錯誤", vbOKOnly, "請重新輸入"
Exit Sub
End If


ttt = Timer

Url = "https://www.wantgoo.com/stock/astock/agentstat_ajax?StockNo=" & stock & "&Types=3.5&StartDate=" & startday & "&EndDate=" & endday & "&Rows=35"
url_a = "https://www.wantgoo.com/stock/astock/agentstat?stockno=" & stock & "&type=3.5"
url_b = "https://www.wantgoo.com/stock/astock/agentstat_total_ajax?StockNo=" & stock & "&StartDate=" & startday & "&EndDate=" & endday & "&Rows=35"


With Xmlhttp

.Open "GET", url_b, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", url_a
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"

.send

Set DecodeJson = Jsondata.JsonParse(.responsetext)
total = Replace(Replace(CallByName(DecodeJson, "returnValues", VbGet), "[", ""), "]", "")

.Open "GET", Url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", url_a
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"

.send

If Len(.responsetext) = 45 Then
MsgBox "資料輸入錯誤", vbOKOnly, "請重新輸入"
Exit Sub
End If

Set DecodeJson = Jsondata.JsonParse(.responsetext)

With getkey
.Pattern = "{[^{]+}"
.IgnoreCase = True
.MultiLine = False
.Global = True

Set Wantgoodata = .Execute(Replace(Replace(CallByName(DecodeJson, "returnValues", VbGet), "[", ""), "]", ""))

.Pattern = "{|}|"""
total = .Replace(total, "")
For i = 1 To Wantgoodata.Count
c = 0
temp = Split(.Replace(Wantgoodata(i - 1), ""), ",")
For j = 0 To UBound(temp) - 1
If j < 3 Or j > 6 Then
c = c + 1
If Split(temp(j), ":")(1) = "null" Then
Sheets("工作表1").Cells(i + 1, c) = ""
Else
Sheets("工作表1").Cells(i + 1, c) = Split(temp(j), ":")(1)
End If
End If
Next j
Next i
End With

End With


With Sheets("工作表1")
.Select
buy = .Range("A2").End(xlDown).Row - 1
sell = .Range("F2").End(xlDown).Row - 1

.Range("a1:j1") = Array("買超券商(" & buy & "筆)", "買張", "賣張", "買超", "均價", "賣超券商(" & sell & "筆)", "買張", "賣張", "賣超", "均價")
.Columns.AutoFit
.Cells(1, 1).Select
End With

Application.ScreenUpdating = True


Set Xmlhttp = Nothing
Set DecodeJson = Nothing
Set temp = Nothing
Set getkey = Nothing
Set Jsondata = Nothing


MsgBox "股票代號:" & stock & vbNewLine & vbNewLine & _
"結束日期" & endday & vbNewLine & "開始日期" & startday & vbNewLine & vbNewLine & _
Split(total, ",")(0) & vbNewLine & _
Split(total, ",")(1) & vbNewLine & _
Split(total, ",")(2) & vbNewLine & _
Split(total, ",")(4) & vbNewLine & vbNewLine & _
"買超資料筆數合計:" & buy & "筆" & vbNewLine & _
"賣超資料筆數合計:" & sell & "筆" & vbNewLine & _
"使用時間" & Round(Timer - ttt, 2) & "秒", vbOKOnly, "下載完成"




End Sub


Function CheckWeekDay(day As Date) As String

CheckWeekDay = Format(day, "yyyymmdd")
If Weekday(day) = 7 Then CheckWeekDay = Format(day - 1, "yyyymmdd")
If Weekday(day) = 1 Then CheckWeekDay = Format(day - 2, "yyyymmdd")

End Function








'================================================


注意:
在輸入日期“完全正確”的情況下,回傳的資料不會有任何錯誤(有仔細檢查過了)
國定假日沒開盤的,我就沒辦法,假日太多了,請自行注意
為什麼要注意,因為就算用了錯誤(沒開盤)的日期,網站不會有錯誤訊息
網站一樣會回傳"不知道那一天的資料"

因為我自己用不到,所以很懶的去檢查資料是那一天,如果有人知道的話,請告訴我,有空我再修正程式碼

雖然程式中有做了一些限制,但不確定是否有什麼遺漏(天數算錯…等等)
如果發現其它問題,請自行增加if條件限制


另外,我發現這個網站會檢查ip address喔
如果要改成“超大量”查詢的話,要考慮也許會擋ip的問題


再提醒一次:使用這個檔案時,請注意日期是否輸入正確


(20210802)修正User-Agent參數

[點擊下載]
dolter29
Snare大神,這行Set DecodeJson = Jsondata.JsonParse(.responsetext) 會出現錯誤訊息 ??? 求解
snare
要不是1058樓有人發問,我跟本不會回來看舊文章,發問不要用留言,用“我要回覆”,不然我不知道有人在舊文章發問
真的是太佩服了
辛苦您花費星期天的假期在回覆問題與寫程式
由衷地感謝您
這是用vba,把yahoo股市中想要的k線圖(走勢圖),製作一個整合的網頁
原理不難,就是把想要的javascript程式碼找出來
重新做一個網頁,再整合就可以了,並沒有用到什麼抓資料的技巧,只是放假無聊做的小程式而已
不過即時走勢圖大概沒麼用,因為yahoo資料有延遲20分鐘
用看盤軟體還比較方便(程式碼中有加上註解,如何關掉走勢圖)



從網頁原始碼分析,k線圖分成3個部份,需要3個javascript才能產生
(點下可看大圖)



(點下可看大圖)







走勢圖其中一個javascript 換成下面這一個
(點下可看大圖)



產生後的網頁效果如下,是可正常執行、更新的圖表,會動的喔






k線圖+走勢圖
(點下可看大圖)


k線圖
(點下可看大圖)




程式預設,開啟5筆資料,如果要更多請自行修改


'==================================================
'前置作業
'先建立一個資料匣,把excel檔案放進去後,再執行
'預設產生的暫存檔會放在同一個目錄
'注意:目錄內的檔案會在沒有任何提示下更新、覆蓋
'程式碼放在模組裡
'==================================================

'想改背景顏色的話,請google html 色碼,把 #C9FFFF ,改成您想要的色碼

'如果不想產生走勢圖,請把註解"建立StxChart"下面2行禁用

'因為程式碼中用了太多的html語法,無法直接用文字po文,改用圖片代替,共3個副程式
'其中TaChart、StxChart,2個副程式,只有一行程式碼跟檔名不一樣
'特別分開寫是為了讓大家了解架構


(點下可看大圖)



(點下可看大圖)


'==================================================


另外,要注意一下,這個範例沒有下載資料,只是整合網頁上的資料
k線圖、走勢圖,是要上網連線才可以用
圖表還是需要用ie(或其它)網頁瀏覽器看才行,不會出現在excel中

(以下程式碼,也可改用645樓範例代替)
程式中目前是用電腦預設瀏覽器開啟
ActiveWorkbook.FollowHyperlink Address:=ThisWorkbook.Path & "\main.html", NewWindow:=True

如果要指定,換成下面這樣寫(注意路徑)
指定 chrome
Shell ("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe " & ThisWorkbook.Path & "\main.html")
指定 firefox
Shell ("C:\Program Files (x86)\Mozilla Firefox\firefox.exe " & ThisWorkbook.Path & "\main.html")

之後只要vba產生的html檔不要刪掉
也可直接滑鼠點2下,打開main.html,不需要再執行vba



(20211020 修正大盤指數無法顯示問題,請照著圖片修改附件中的4行程式碼[紅框內])
(原因:代碼是#001,但#號當檔名會和html語法衝突無法正確載入)

(點我看大圖)






(20180218舊版網址)
附加壓縮檔: 201802/mobile01-3c135a72dc5a6d36b43b673a2171add7.zip


(20211020 加入改版後網址)
[點擊下載]
先收藏起來再慢慢研究
謝謝師傅
新年快樂
樓主真的好強!!
受教了!!
謝謝分享!!!
謝謝分享!!!
謝謝分享!!!

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

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