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

感謝大大的解惑.
原來要看一下"GetElementsByID" 的位置.
可以讀出他有幾頁.

還有你怎麼能了解是第16個Table, 你有算一下, 是嗎?

再一次感謝您~~

Tang7325
tang7325 wrote:
還有你怎麼能了解是第16個Table, 你有算一下, 是嗎?


一、直接看網頁原始碼,配合關鍵字搜尋,看資料在第幾個table(表格元素)

二、(以chrome為例),在表格中,按滑鼠右鍵=>檢查(ctrl+shift+i)
在畫面右邊網頁原始碼,用滑鼠遊標上下移動
算看看是第幾個表格被反白選取

三、用vba看有幾個表格 debug.print HTML.all.tags("table").length (從0開始計算)
每個表格都試一次,HTML.all.tags("table")(0~???).Rows
人工檢查那個代碼才是正確的表格

四、其它

對html語法不熟的,建議用方法3,比較簡單
如果怕網頁改版,表格位置變動抓不到資料
也可用方法3,配合關鍵字、檢查所有表格,找出正確表格代碼
以下是程式碼,但無法跑進excel裡面?
請問如何解決


'----------------------------------------------------------------------------------------------------
Dim IE As Object, DOM_event As Object, Url As String, table, i As Integer, j As Integer

ActiveSheet.Cells.Clear
Application.ScreenUpdating = False
On Error Resume Next

Set IE = CreateObject("InternetExplorer.Application")

With IE
.Visible = True
.Navigate "https://goodinfo.tw/StockInfo/index.asp"
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop



Url = "" & Range("A1") & ""
'"https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=自訂篩選&INDUSTRY_CAT=我的條件&FL_ITEM0=連續配發合計股利次數&FL_VAL_S0=5&FL_VAL_E0=&FL_ITEM1=&FL_VAL_S1=&FL_VAL_E1=&FL_ITEM2=&FL_VAL_S2=&FL_VAL_E2=&FL_ITEM3=累季–EPS年成長率%28%25%29&FL_VAL_S3=0&FL_VAL_E3=&FL_ITEM4=&FL_VAL_S4=&FL_VAL_E4=&FL_ITEM5=&FL_VAL_S5=&FL_VAL_E5=&FL_ITEM6=&FL_VAL_S6=&FL_VAL_E6=&FL_ITEM7=&FL_VAL_S7=&FL_VAL_E7=&FL_ITEM8=&FL_VAL_S8=&FL_VAL_E8=&FL_ITEM9=&FL_VAL_S9=&FL_VAL_E9=&FL_ITEM10=&FL_VAL_S10=&FL_VAL_E10=&FL_ITEM11=&FL_VAL_S11=&FL_VAL_E11=&FL_RULE0=&FL_RULE1=&FL_RULE2=&FL_RULE3=&FL_RULE4=&FL_RULE5=&FL_RANK0=&FL_RANK1=&FL_RANK2=&FL_RANK3=&FL_RANK4=&FL_RANK5=&FL_FD0=&FL_FD1=&FL_FD2=&FL_FD3=&FL_FD4=&FL_FD5=&FL_SHEET=季累計獲利能力&FL_SHEET2=獲利能力&FL_MARKET=上市%2F上櫃&FL_QRY=查++詢"

.Navigate Url
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop

Set DOM_event = .document.createEvent("HTMLEvents")
DOM_event.initEvent "change", True, False

.document.all.Item("selRANK").selectedindex = 6
.document.all.Item("selRANK").dispatchEvent DOM_event

Application.Wait (Now + TimeValue("0:00:40")) '等待查詢結果,視電腦效能、網路狀態,修改適合時間

Set table = .document.getelementsbytagname("table")(96).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
ActiveSheet.Cells(i + 1, j + 1) = table(i).Cells(j).innertext
Next j
Next i

ActiveSheet.Cells.Columns.AutoFit

End With

IE.Quit
Set IE = Nothing
Set table = Nothing

Application.ScreenUpdating = True
機八陽 wrote:
"https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=自訂篩選&INDUSTRY_CAT=我的條件&FL_ITEM0=連續配發合計股利次數


請參考742樓範例
除了網址不同,其它參數都相同

關於mops.twse.com.tw(公開資訊觀測站)按鈕的問題,回答過很多次了
但通常下載按鈕內的網址是固定的

無意間在其它網站看到有人發問
公開資訊觀測站=>即時重大訊息,詳細資料按鈕的問題
好奇點一下按鈕,發現網址多了一些變數,所以寫法會有一點不一樣

如果不要右邊的詳細資料,程式碼用簡單的set table= ... ... table(10)…就解決了
這次範例下載方式是改用插入註解,點擊F欄,自動在E欄插入註解
(如果要把詳細資料另存新檔,請參考以前範例,改寫 Function Get_twse_詳細資料)
但因為twse有流量限制,下載失敗時,請過一段時間,再重新點擊F欄自動更新資料





從網頁原始碼可知,那些參數是在
id=table01 裡面的第2個form,form裡面的第一個table
按鈕位置是在每列的第6格,但按鈕是屬於html程式碼
用innertext是拿不到資料的,所以第6格要改用innerhtml取出,拆解參數









'公開資訊觀測站(即時重大訊息,詳細資料)下載範例
'程式碼放在module1(模組)裡
Sub Get_twse_即時重大訊息()

Dim HTML As Object, Getxml As Object, table As Object, i As Integer, j As Integer, url As String, Url_a As String, ttt As Double
Dim Ie_Open As Boolean

'這裡有2種顯示方式(預設ie_open=true)
Ie_Open = True '使用超連結,點擊插入註解,打開瀏覽器



'Ie_Open = False '使用文字格式網址,點擊插入註解,但不打開瀏覽器




'下載的資料放在註解裡面




Set HTML = CreateObject("htmlfile")
Set Getxml = CreateObject("msxml2.xmlhttp")

url = "https://mops.twse.com.tw/mops/web/t05sr01_1"
Url_a = "https://mops.twse.com.tw/mops/web/ajax_t05sr01_1"

ActiveSheet.Cells.Clear
Application.ScreenUpdating = False

ttt = Timer

With Getxml

.Open "GET", url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send

HTML.body.innerhtml = .responsetext

End With

Set table = HTML.getelementbyid("table01").getelementsbytagname("form")(1).getelementsbytagname("table")(0).Rows
Dim PostData As String, skey As String, COMPANY_ID As String, SPOKE_DATE As String, SPOKE_TIME As String, SEQ_NO As String

For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
If j = 5 And i > 0 Then

PostData = table(i).Cells(j).innerhtml
skey = Split(Split(PostData, "skey.value='")(1), "'")(0)
COMPANY_ID = Split(Split(PostData, "COMPANY_ID.value='")(1), "'")(0)
SPOKE_DATE = Split(Split(PostData, "SPOKE_DATE.value='")(1), "'")(0)
SPOKE_TIME = Split(Split(PostData, "SPOKE_TIME.value='")(1), "'")(0)
SEQ_NO = Split(Split(PostData, "SEQ_NO.value='")(1), "'")(0)
PostData = Url_a & "?encodeURIComponent=1&TYPEK=all&step=1&skey=" & skey & "&hhc_co_name=&firstin=true&COMPANY_ID=" & COMPANY_ID & "&COMPANY_NAME=&SPOKE_DATE=" & SPOKE_DATE & "&SPOKE_TIME=" & SPOKE_TIME & "&SEQ_NO=" & SEQ_NO

If Ie_Open = True Then
ActiveSheet.Hyperlinks.Add ActiveSheet.Cells(i + 1, j + 1), Address:=PostData, TextToDisplay:="詳細資料"
Else
ActiveSheet.Cells(i + 1, j + 1) = PostData
End If
Else
ActiveSheet.Cells(i + 1, j + 1) = Trim(table(i).Cells(j).innertext)
End If
Next j
Next i

'ActiveSheet.Columns.AutoFit
Application.ScreenUpdating = True

Set HTML = Nothing
Set Getxml = Nothing
Set table = Nothing

Debug.Print Timer - ttt & "s(download link)"

End Sub


'===============================================
'以下程式碼放在“工作表1”
'===============================================
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If InStr(CStr(Target.Address), ":") > 0 Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub

If Intersect(Target, Columns("F:F")) Is Nothing Then
' out
Else
If Target.Offset(, -1).Comment Is Nothing Then
' no old comment
Else
If InStr(Target.Offset(, -1).Comment.Text, "查詢過於頻繁") = 0 Then
'download ok
Exit Sub
Else
Target.Offset(, -1).ClearComments
End If

End If

If Target.Value = "詳細資料" Then
Target.Offset(, -1).AddComment.Text Get_twse_詳細資料(Target.Hyperlinks.Item(1).Address)
Else
Target.Offset(, -1).AddComment.Text Get_twse_詳細資料(Target.Value)
End If
Target.Offset(, -1).Comment.Shape.TextFrame.AutoSize = True

End If

End Sub


Function Get_twse_詳細資料(url As String) As String

'有另存文字檔需求的,請參考其它範例改寫此function

Dim HTML As Object, Getxml As Object, ttt As Double
Set HTML = CreateObject("htmlfile")
Set Getxml = CreateObject("msxml2.xmlhttp")

ttt = Timer

With Getxml

.Open "POST", url, False
.setRequestHeader "Referer", "https://mops.twse.com.tw/mops/web/t05sr01_1"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send
HTML.body.innerhtml = .responsetext

End With

Get_twse_詳細資料 = HTML.body.innertext

Set HTML = Nothing
Set Getxml = Nothing
Set table = Nothing

Debug.Print Timer - ttt & "s"

End Function









[點擊下載]
不小心,同時發了2篇相同文章…
(刪…)
刪除
whu1101 wrote:
刪除(恕刪)


??????
很久以前有寫過excel連結access的範例
(集保戶股權分散表查詢)

很久沒修正了,最近的一次更新是在 2019-09-29 23:46 686樓
現在都2021了,有新的股票上市,也有一些不見了

而當初上傳範例時,因為怕有人想自行改寫時沒做好,變成去tdcc暴力查詢
有特別先把自動更新股票代號功能刪除

因此開範例查詢時,如果股票代號不在access資料庫,vba就無法下載
因為我的股票不多,加上我上傳的範例,和我個人使用的程式碼有些不同
所以一直沒發現這個問題

(我今天剩下的持股只有這些)




而解決這個問題的方式很簡單,不用改程式碼vba,只要您會"用鍵盤打字"就行了

請照著以下步驟做access資料庫的修正

一、關閉excel範例

二、直接用access打開stock.accdb

三、打開資料表(旁邊的小箭頭)




四、拉到最下面,可以看到=>股票清單,點進去




五、在下方"新增右邊",打入股票代號、名稱,例如1271(晨暉生技)
(識別碼不用理它,會自動新增)




六、在資料表中,隨便選一個現有的股票代號,例如0050
滑鼠右鍵=>複製





七、滑鼠右鍵=>貼上
資料表名稱=>填入剛剛在股票代號打的
貼上選項=>注意,要選只有結構=>確定






八、關掉access,重開excel範例,就可以正常更新了
自動更新的程式碼就不補上了,反正遇到時,手動改一下就好

想請問版大

yahoo昨天在匯入時發生的錯誤.
偵錯點停在這一行,
我0123456789...試了一輪.還是不行.請問應怎麼修正它

Set Table = HTMLsourcecode.all.tags("table")(6).Rows
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

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