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

rainbowsperm wrote:
但讀清單跑, 也沒發生錯誤訊息, 但跑了20-30檔, EXCEL就一樣沒反應~~試過重裝excel也不行~~


程式沒寫好

(個股資料匯入範本 - 複製新方法array.xlsm)
一、sub 更新()改成這樣

Sub 更新()
Application.Calculation = xlCalculationManual
ThisWorkbook.Activate
Call 下載財報(ThisWorkbook.Sheets("總覽").Range("J1").Value)
Call 股利政策
Call 改變顏色
Call 股利連續增長
Application.Calculation = xlCalculationAutomatic
End Sub


二、因為是雙活頁薄,會有active、select的問題
在所有的副程式最前面加上一行
ThisWorkbook.Activate
程式裡面所有的位置,需清楚指定
range()、cells()……改成
ThisWorkbook.Sheets("工作表名稱").range...
ThisWorkbook.Sheets("工作表名稱").cells...

三、Sub 股利政策(),漏了除錯功能,會造成程式中斷
goodinfo.tw網站,確定會檔ip,建議取消自動下載
改做一個獨立按鈕,需要時再手動更新

四、sub 下載基本資料3()
www.twse.com.tw網站,確定會檔ip,建議取消自動下載
改做一個獨立按鈕,需要時再手動更新


(all_debug.xlsm)
一、Workbook_Open()改這樣,才不會一直重覆開excel

Private Sub Workbook_Open()

Dim template As Excel.Workbook, lastrow As Integer, i As Integer

If MsgBox("是否進行更新作業?", vbQuestion + vbDefaultButton2 + vbYesNo) = vbNo Then
Exit Sub '取消更新
End If

lastrow = Sheets("倉儲雪球股").Range("a1").CurrentRegion.Rows.Count
Set template = Workbooks.Open(ThisWorkbook.Path & "\" & "個股資料匯入範本 - 複製新方法array.xlsm", , False)

Application.Wait (Now + TimeValue("0:00:10"))
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual

For i = 2 To lastrow

template.Activate
template.Sheets(1).Range("J1").Value = Sheets("倉儲雪球股").Cells(i, 1)
DoEvents
Application.Run "'" & template.Name & "'" & "!Module2.更新"
template.SaveAs (ThisWorkbook.Path & "\" & Sheets("倉儲雪球股").Cells(i, 1) & Sheets("倉儲雪球股").Cells(i, 2) & ".xlsm")
'補充:如果電腦效能不好,這裡最好等個1~3秒,等一下excel存檔
Application.Wait (Now + TimeValue("0:00:1"))
Next i

template.Close
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic

Set template = Nothing

End Sub



另外建議不要分2個檔案下載,可把"all_debug.xlsm"中的"倉儲雪球股"工作表
移到"個股資料匯入範本 - 複製新方法array.xlsm"中
把"workbook_open()"改寫放到"更新()"裡面
這樣就不用開2個excel,除錯更容易
也可參考272樓,做一個簡易的進度提示(百分比)

如果以上都改好,取消2個副程式,我測試可正常跑完1千多筆


(20200501 07:35補充)
早上無聊重新看一下網站 http://sod.nsc.com.tw
查不到資料時,網站會有相關的訊息
(回傳的正確訊息,請自行用查不到資料的股票代碼在網站上測試,例如:3452)




那10多個副程式,可在.responsetext下面,多加上一行 if……then exit sub,提早結束程式,增加效率
HTMLsourcecode.body.innerhtml = .responsetext
If InStr(HTMLsourcecode.body.innerhtml, "無此個股資料") > 0 Or InStr(HTMLsourcecode.body.innerhtml, "查無財務比率表") > 0 Or InStr(HTMLsourcecode.body.innerhtml, "查無所選個股代碼錯誤") >0 Then Exit Sub


至於擋ip的問題,早上試一下,可利用存檔時的延遲時間(我設定1~4秒亂數)
可以從頭跑到完不會中斷

已修改完畢測試成功, 真是太太感謝snare大大了, 原本真的想放棄了~~~XD
之前一直開啟excel檔案畫面閃了閃去都不知如何解決,
這次托snare大大的終於解決這個問題了, 真是感激不盡
雖然當中還有些語法不知道為什麼要那樣寫, 會再慢慢google多看看
再次謝謝大神
----------------------------------------------------------------------------
謝謝snare大神, 又多學好多東西
本以為沒解了~~XD
這些東西對我來說看來要花一些時間去修改研究
先謝謝大大, 若研究過程中有問題, 還請大大指教~~

謝謝snare大大的耐心~~~
不好意思snare大大
又來出難題給你了~~~XD

目前想抓取表格資料, 不過要抓取的表格資料是在 第一個表格(也就是下面連結)裡最後一欄的連結點進去後的表格, 請問這可以用什麼方式做到呢?
https://www.tpex.org.tw/web/bond/publish/convertible_bond_search/memo.php?l=zh-tw
rainbowsperm wrote:
目前想抓取表格資料, 不過要抓取的表格資料是在 第一個表格(也就是下面連結)裡最後一欄的連結點進去後的表格, 請問這可以用什麼方式做到呢?
https://www.tpex.org.tw/web/bond/publish/convertible_bond_search/memo.php?l=zh-tw


表格下載方式請參考21樓範例

通常連結在原始碼裡開頭都是 a href



簡單一點的方式就是用.getelementsbytagname("a"),下載所有連結



Set link = HTMLsourcecode.getelementsbytagname("a")
For Each a In link
If InStr(a.href, "http://mops.twse.com.tw/mops/web/t120sg01?TYPEK=&bond_id=") > 0 Then
i = i + 1
Cells(i, 1) = "'" & Split(Split(a.href, "bond_id=")(1), "&bond_kind")(0)
Cells(i, 2) = Replace(a.href, "http://", "https://")
End If
Next








再分別進入每個連結下載表格,但是twse會擋ip,所以除錯上要特別注意



謝謝snare大神
已成功測試~~
後來才發現此網站有CSV
https://www.tpex.org.tw/web/bond/publish/convertible_bond_search/memo_download.php?d=issue.txt
可惜用了之前的方法要轉碼時會卡住所以放棄了 哈哈

可以請大大稍微解釋一下下面這串code嗎? 大概懂它的作用, 只是有點複雜不太理解~~><
If InStr(a.href, "http://mops.twse.com.tw/mops/web/t120sg01?TYPEK=&bond_id=") > 0 Then
i = i + 1
Cells(i, 1) = "'" & Split(Split(a.href, "bond_id=")(1), "&bond_kind")(0)
Cells(i, 2) = Replace(a.href, "http://", "https://")
End If

另外想請問成功抓取表格後, 有辦法快速找到當中的字串嗎?
如 "轉(交)換期間:"
因目前是用for loop的方式去尋找字串, 想說有沒有更有效率的方法


謝謝
rainbowsperm wrote:
後來才發現此網站有CSV
https://www.tpex.org.tw/web/bond/publish/convertible_bond_search/memo_download.php?d=issue.txt
可惜用了之前的方法要轉碼時會卡住所以放棄了 哈哈

可參考200樓、700樓範例

rainbowsperm wrote:
可以請大大稍微解釋一下下面這串code嗎? 大概懂它的作用, 只是有點複雜不太理解~~><


If InStr(a.href, "http://mops.twse.com.tw/mops/web/t120sg01?TYPEK=&bond_id=") > 0 Then
'如果網址內有http…這串字,就是表格內的網址
i = i + 1
'調整格子的位置
Cells(i, 1) = "'" & Split(Split(a.href, "bond_id=")(1), "&bond_kind")(0)
'把網址內的股票代碼拆出來,除錯用
Cells(i, 2) = Replace(a.href, "http://", "https://")
'因為網頁內的網址是http,需改成https才能正常使用
End If

rainbowsperm wrote:
另外想請問成功抓取表格後, 有辦法快速找到當中的字串嗎?
如 "轉(交)換期間:"
因目前是用for loop的方式去尋找字串, 想說有沒有更有效率的方法


如果只要部份資料,可在抓表格前直接用instr確定字串在不在,再利用split() 拆出字串
這樣就不必把整個表格抓到工作表

instr(HTMLsourcecode.body.innerhtml,.....)
split(HTMLsourcecode.body.innerhtml,.....)()

or

instr(.responsetext,...)
split(.responsetext,...)()



if instr() …
s= split(……)
end if

詳細說明請
google instr vba
google split vba
snare wrote:
可參考200樓、700(恕刪)


收到, 謝謝大神耐心的教導, 馬上來試試
有您真好^^
rainbowsperm wrote:
收到, 謝謝大神耐心的教導, 馬上來試試


我發現您把780樓的檔案刪除了

請上傳原來的"excel會當機版本"
可以讓有興趣的參考772樓~781樓,了解到為什麼excel會當機
建議做一點修改
一、股票代碼可減少到50~200筆
二、可適當的減少一些下載網址,確定會當機就好
三、總表資料分析部份建議刪除
因為下載部份基本上沒有原創,但分析是您智慧的累積,建議保留不上傳

希望您把它壓縮成zip,重新上傳到01
如果原始檔案沒了,我電腦暫存裡,還有您全部網址混在一起的bug版,可上傳給您

當然這不具強制性,因為就算上傳了不會的還是不會
有一定vba基礎的,看了772樓~781樓的說明,也可以有一定程度的了解
只是有檔案會比較方便
snare wrote:
我發現您把780樓的(恕刪)


snare大神不好意思
可能是dropbox有設到分享期限~~所以期限一到連結就失效了
遵照您的意思修改重新上傳了, 已確定沒有期限
還好又有新問題所以來檢查, 不然就沒發現到了~~~XD
先在研究一下若還是不行 晚點再發問求救大神

謝謝
rainbowsperm wrote:
snare大神不好意(恕刪)


snare大神
還是來求救了~~~XD
原本是用123樓的方式下載CSV都沒問題
今天突然變成


所以改成用200樓的下載方式
可以成功下載了, 放在暫存資料夾的檔案也沒問題
不過當貼到excel黨裡卻變成亂碼了
可以請問該如何解決paste造成的亂碼問題嗎


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

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