• 159

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

Snare 大師 您好:
非常感謝您無私地分享教學,收益良多。我原本只是用QT下載收盤價,再利用Excel工作表統計我的股票損益。我也只在您這裡看到QT會有連線沒有關掉的問題。趕快從資料連線查看,天哪!還真有一大串的連線掛在那哩,數一數總共有197條連線,繼續使用下去那還得了。所以打算遵照大師指示參考相關樓層,重新改寫上市、上櫃、興櫃一般板和興櫃戰略新板的最新收盤價。
現在我想先解決興櫃歷史行情的下載問題,公司代號和資料年月先固定。
興櫃個股歷史行情的網址及資料年月和公司代號或名稱的原始碼如下:
興櫃 > 興櫃股票交易資訊 > 興櫃一般板 > 個股歷史行情網址:
https://www.tpex.org.tw/web/emergingstock/single_historical/history.php?l=zh-tw
<label for="input_month">資料年月:</label><input type="text" id="input_month" name="input_month" class="input-date ui-corner-all" onchange="query()" maxlength="9">
<label for="stk_code">公司代號或簡稱:</label><input id="stk_code" name="stk_code" type="text" class="input-stock ui-corner-all" size="10">

程式碼如下
Sub 下載興櫃CSVFile()
Dim IE As Object
Dim wsTarget As Worksheet
Dim downloadPath As String
Dim latestFile As String

Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = True
IE.navigate "https://www.tpex.org.tw/web/emergingstock/single_historical/history.php?l=zh-tw&d=112/10&stkno=6709&s=0,asc,0"

Do While IE.Busy Or IE.readyState <> 4
DoEvents
Loop

IE.document.getElementById("input_month").Value = "112/10"
IE.document.getElementById("stk_code").Value = "6709"
IE.document.querySelector("button.btn-download").Click ‘沒有動作

Application.Wait Now + TimeValue("00:00:10")

downloadPath = "C:\Users\" & Environ("Username") & "\Downloads\"
latestFile = GetLatestCSVFile(downloadPath)
Workbooks.Open latestFile

Set wsTarget = ThisWorkbook.Sheets("興櫃指定月份日成交資訊")
Workbooks(Replace(latestFile, downloadPath, "")).Sheets(1).UsedRange.Copy wsTarget.Cells(1, 1)
Workbooks(Replace(latestFile, downloadPath, "")).Close SaveChanges:=False

Application.CutCopyMode = False

End Sub
=================================================
Function GetLatestCSVFile(folderPath As String) As String
Dim latestFile As String
Dim latestDate As Date
Dim fileName As String

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

latestDate = dateValue("1/1/1900")
fileName = Dir(folderPath & "*.csv")

Do While fileName <> ""
If FileDateTime(folderPath & fileName) > latestDate Then
latestDate = FileDateTime(folderPath & fileName)
latestFile = folderPath & fileName
End If
fileName = Dir
Loop

GetLatestCSVFile = latestFile
End Function

1. 因為查詢日期為11月1日,所以無歷史資料


2. 必須點開資料年月選擇,確定下載月份


3. 資料展開之後,點案另存CSV按鍵


4. 確認CSV檔案儲存


如同756樓的問題,我在個股歷史行情輸入代號”6709”後,按F12進入開發者工具,只看到資料年月和公司代號的原始碼,請問該如何找到
1. 另存CSV的真實下載網址
2. CSV下載檔案名稱 (確認CSV檔案儲存就有,但是原始碼可以看到嗎?)
3. 資料年月的下拉式選單可以VBA程式碼模擬點按選擇不同月份嗎?也就是說,附圖1-4的操作可以自動化嗎?謝謝您。
Morten Hsu wrote:
1. 因為查詢日期為11月1日,所以無歷史資料
2. 必須點開資料年月選擇,確定下載月份
3. 資料展開之後,點案另存CSV按鍵
4. 確認CSV檔案儲存


Morten Hsu wrote:
3. 資料年月的下拉式選單可以VBA程式碼模擬點按選擇不同月份嗎?也就是說,附圖1-4的操作可以自動化嗎?。


(我沒看到您的附圖)

方法同1350樓,直接下載網頁內容,或下載csv都行









想要自動換股、年、月,紅字部份,改用變數代替即可

URL = "https://www.tpex.org.tw/web/emergingstock/single_historical/history.php?l=zh-tw&d=112/11&stkno=6709&s=0,asc,0"



Morten Hsu wrote:
如同756樓的問題,我在個股歷史行情輸入代號”6709”後,按F12進入開發者工具,只看到資料年月和公司代號的原始碼,請問該如何找到
1. 另存CSV的真實下載網址
2. CSV下載檔案名稱 (確認CSV檔案儲存就有,但是原始碼可以看到嗎?)


這就是1347樓的範例

1、真實csv下載網址,先按F12,再按下載CSV
2、檔名存在Headers裡的Content-Disposition










同樣要自動換股,請把紅字改變數代替
…………
…………
.Open "POST", Url, False
…………
…………
.setRequestHeader "Referer", "https://www.tpex.org.tw/web/emergingstock/single_historical/history.php?l=zh-tw&code=6709"
…………
…………
'下面這行是圖片,請手動輸入



…………
…………
'debug
msgbox split(xmlhttp.getResponseHeader("Content-Disposition"),"filename=")(1)

Morten Hsu

Snare 大師,非常感謝您。我實在太急於解決眼前的問題,大樓才爬一半就提問題,原來在1347樓和1350樓已經早有解答,讓您費神提點,深感抱歉。

2023-11-02 17:58
snare wrote:
tpex 有流量限制...(恕刪)


Snare大師您好:
我引用1345樓的程式碼取代我原先使用QT的興櫃最新收盤價 ,速度又快又沒有資料連線掛在那邊的問題。
不過,我是個老菜鳥,即使用F12還是沒有找到下載new.csv的真實網址,敬請提示,謝謝您。
Morten Hsu wrote:
即使用F12還是沒有找到下載new.csv的真實網址


這頁的網址是在popup視窗裡面,所以f12看不到
可直接在下載頁面中,複製連結網址



或是用其它瀏覽器,例如:Cent Browser
下載時,就有真實網址可看



也可以用fiddler這類的程式,去抓真實網址
snare wrote:
這頁的網址是在popup...(恕刪)


Snare 大師 您好:
非常感謝您費心解惑,我現在正從1樓研究起,實在太多東西要消化,期望儘早提升自己的基本功,再次謝謝您。
126
今天在查詢匯率時,一直發生Automation錯誤(昨天還正常)

出錯的地方都在這個Array()的地方
Sheets("Sheet1").Range("A153:G186").Value = TempArray()
TempArray()是設Global

我是把資料先抓到一個temp頁再複製過來
之前都正常沒問題,不曉得為何今天就不行了…
蔬食抗暖化,減碳救地球!
nijawang wrote:
一直發生Automation錯誤(昨天還正常)

出錯的地方都在這個Array()的地方
Sheets("Sheet1").Range("A153:G186").Value = TempArray()
TempArray()是設Global


老實說,只看一行程式碼,我不知道該怎麼回答您
這種寫法會出錯,通常是忘了指定陣列大小
出現的應該是下面這種錯誤




正常來說不會有您的錯誤訊息出現
Global TestArray()

Sub test()

ReDim TestArray(1 To 10, 1 To 3)

For i = 1 To 10
For j = 1 To 3
TestArray(i, j) = Int(Rnd() * 100) + 1
Next j
Next i

Sheets("工作表1").Range("a1:c10").Value = TestArray()

End Sub



應該是別的地方出錯
如果程式碼中有 on error ,先把所有的 on error 停用
再重新執行程式,看看到底是那裡出錯
snare wrote:
老實說,只看一行程式碼,我不知道該怎麼回答您
這種寫法會出錯,通常是忘了指定陣列大小
出現的應該是下面這種錯誤
感謝snare大的回覆!
因為原本的xlsm VBA都正常,只是後來發生錯誤都停在array()這個地方。
之後還變成只要一執行VBA時,Excel就一直當掉重開…
最後我是往前找比較早的檔案版本,試了幾版後,才找到可正常執行的版本。
應該是檔案不知道在何時被「污染」了。

不過這個xlsm檔案後來變成在筆電A打完一個值後,要等個10秒才能做下一個動作;
但在另一台筆電B上執行就都正常!?
目前還找不到原因…

※若不開這個有問題的xlsm檔時,則其它Excel檔都正常;
若開這個xlsm檔,同時再開其它檔時,則其它檔也會變很慢。
不知道是不是這個xlsm檔一直在做什麼事?
蔬食抗暖化,減碳救地球!
snare
snare 樓主

有可能題筆電A,excel 硬體圖形加速的問題,可以關掉試看看

2023-12-14 21:01
nijawang

我後來想到在查問題時有加入幾個On Error Resume Next,所以試著把這些都marked掉,反應速度竟然就正常了!?但奇怪在筆電B卻都正常?

2023-12-14 21:10
今天剛解決Excel檔反應很慢的問題,結果Yahoo Stock好像又改版了!?
所以原本的VBA又得再修改了…
我是抓這裡的股價資訊
https://tw.stock.yahoo.com/quote/0050
蔬食抗暖化,減碳救地球!
  • 159
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 159)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?