• 156

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

RyuuzakiYu wrote:
公開觀測站的當日重大訊息


看不太懂您的問題,像這樣?




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, y As String, m As String, d As String, Lastrow As Integer

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

url = "https://mops.twse.com.tw/mops/web/ajax_t05st02"
Url_a = "https://mops.twse.com.tw/mops/web/t05st02"

Sheets("工作表1").Cells.Clear
Sheets("工作表1").Range("A:C").NumberFormatLocal = "@"
Application.ScreenUpdating = False


y = "112"
m = "04"
d = "25"

ttt = Timer

With Getxml

.Open "POST", 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 ("encodeURIComponent=1&step=1&step00=0&firstin=1&off=1&TYPEK=all&year=" & y & "&month=" & m & "&day=" & d)

HTML.body.innerhtml = .responsetext

End With


Set table = HTML.all.tags("table")(2).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
Sheets("工作表1").Cells(i + 1, j + 1) = Trim(table(i).Cells(j).innertext)
Next j
Next i

Lastrow = i
Set table = HTML.all.tags("table")(3).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
Sheets("工作表1").Cells(i + 1 + Lastrow, j + 1) = Trim(table(i).Cells(j).innertext)
Next j
Next i


Sheets("工作表1").Columns.AutoFit
Application.ScreenUpdating = True

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


End Sub



Snare大你好,
最近在histock/tw抓資料,抓了幾筆後出現如下:
alert('請您先登入嗨投資再查詢,感謝您的支持!')
已超過使用次數

在google找不到相關方法,自行試了幾種方法想要登入,卻不得要領,請Snare指點。
Sub test()

Dim stock As String, k As String, startdate As String, enddate As String, j As Variant, l As Variant
Dim startday As String, endday As String, sh As String
Dim HTMLsourcecode, URL, Url_a, TempArray(), Table, Title
Set HTMLsourcecode = CreateObject("htmlfile")
sh = "工作表1"

On Error Resume Next
URL = "https://histock.tw"
Url_a = "https://histock.tw/login"


With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "post", Url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Url_a
.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/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
.setRequestHeader "email", "ldchiou5168@gmail.com"
.setRequestHeader "password", "g43XX"

.send "email, ldchiou5168@gmail.com&password, g43XX"
'"__VIEWSTATEGENERATOR=625BA342&email=ldchiou5168@gmail.com&password=g43xx&password=g4321h"

HTMLsourcecode.body.innerhtml = .responsetext
MsgBox HTMLsourcecode.body.innerhtml
Cells(5, 1) = HTMLsourcecode.body.innerhtml
End With


Set GetXml = Nothing
Set HTMLsourcecode = Nothing
Application.ScreenUpdating = True
End Sub



P.S 帳戶、密碼是假的。
謝謝你!
goldchiou wrote:
在google找不到相關方法,自行試了幾種方法想要登入


這種有流量限制的
可以用 selenium 的 chromedriver ,慢慢抓

xmlhttp太快,可適當加入延遲,來避免這個問題
雖然登入會員"好像"沒限制,但還是不建議在登入會員的狀態下使用xmlhttp
因為您不知道後台會不會對您大量抓資料的行為,有什麼記錄

如果是登入方式,方法同456樓,簡易範例請參考

' 登入網頁,取得自己的會員名稱    

Sub Get_histock()


Dim Xmlhttp As Object, url As String, vs As String, ev As String, url_a As String, temp, test
Dim Email As String, Password As String

Set Xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")

'這裡請改成自己的帳號、密碼
Email = "aaaa@aaa.aaa.aaa"
Password = "0000"


url = "https://histock.tw/login"

With Xmlhttp

.Open "GET", url, False
.setRequestHeader "Connection", "Keep-Alive"
.send

vs = Split(Split(.responsetext, "__VIEWSTATE"" value=""")(1), """")(0)
ev = Split(Split(.responsetext, "__EVENTVALIDATION"" value=""")(1), """")(0)
vg = Split(Split(.responsetext, "__VIEWSTATEGENERATOR"" value=""")(1), """")(0)

'密碼不確定能不能有符號,如果有,可能需要編碼,把Password 改成UrlEncode(Password)
url_a = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=" & UrlEncode(vs) & "&__VIEWSTATEGENERATOR=" & vg & "&__EVENTVALIDATION=" & UrlEncode(ev) & "&email=" & UrlEncode(Email) & "&password=" & Password & "&bLogin=%E7%99%BB%E5%85%A5"


'登入
.Open "POST", url, False
.setRequestHeader "Referer", url
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Content-Length", Len(url_a)
.setRequestHeader "Connection", "Keep-Alive"
.send (url_a)


'會員資訊
.Open "GET", "https://histock.tw/my", False
.setRequestHeader "Referer", "https://histock.tw/default.aspx"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Connection", "Keep-Alive"
.send


temp = Split(.responsetext, vbNewLine)

For Each test In temp
If InStr(test, "頭銜") > 0 Then
MsgBox test, vbOKOnly, "登入測試"
Exit For
End If
Next

End With

Set Xmlhttp = Nothing


End Sub

'下面是圖片,請手動輸入,或參考附件









[點擊下載]
謝謝Snare大,我嘗試了好幾個月,還是要老師來教,萬般感激,謝謝您!
p.s.我會好好研究
Snare大您好:

223樓 證券櫃檯買賣中心http://www.tpex.org.tw 上櫃統計報表 > 個股年成交資訊

sub GettpexHtml()中,有把Clipboard放到Sheets("sheet1")的程式碼,如下:

With Sheets("sheet1")
.Cells(1, 1).Select
.PasteSpecial NoHTMLFormatting:=True
.Range("b1").Cut Destination:=.Range("a2")
.Range("c1").Clear
.Cells(2, 1).Select
End With

我想把它放在其他的sheet中,所以新增一個sheet,取名為temp

把With Sheets("sheet1")改成With Sheets("temp")

即時運算視窗出現錯誤訊息:

Class Range 的 Select 方法失敗


若我把程式改成以下:
Sheets("temp").Select
ActiveSheet.Cells(1, 1).PasteSpecial NoHTMLFormatting:=True
ActiveSheet.Range("b1").Cut Destination:=ActiveSheet.Range("a2")
ActiveSheet.Range("c1").Clear
ActiveSheet.Cells(2, 1).Select

即時運算視窗出現錯誤訊息:

應用程式或物件定義上的錯誤


想請教一下,要怎麼改才對?

[點擊下載]
tajenchung wrote:
把With Sheets("sheet1")改成With Sheets("temp")
即時運算視窗出現錯誤訊息:
Class Range 的 Select 方法失敗



…………
…………
…………
With Sheets("temp")
.Activate
…………
…………
…………





tajenchung wrote:

若我把程式改成以下:
Sheets("temp").Select
ActiveSheet.Cells(1, 1).PasteSpecial NoHTMLFormatting:=True
ActiveSheet.Range("b1").Cut Destination:=ActiveSheet.Range("a2")
ActiveSheet.Range("c1").Clear
ActiveSheet.Cells(2, 1).Select

即時運算視窗出現錯誤訊息:

應用程式或物件定義上的錯誤




…………
…………
…………

Sheets("temp").Select
ActiveSheet.Cells(1, 1).Select
ActiveSheet.PasteSpecial NoHTMLFormatting:=True

…………
…………
…………
請問如何簡化程式碼與加速執行速度
Sub 外本比()

Dim oXML As Object
Set oXML = CreateObject("WinHttp.WinHttpRequest.5.1")

Dim oHTML As Object
Set oHTML = CreateObject("HTMLFile")

'設定工作表物件
Set theWS = ThisWorkbook.Sheets("外本比")

'清除全部資料
theWS.Cells.Clear

'Page 1
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=0", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Dim oTable As Object, oRow As Object, oCell As Object
Dim i As Integer, j As Integer
Set oTable = oHTML.getElementsByTagName("table")(1)
Sheets("外本比").Select
i = 2
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(15) '依個人網路速度資料來源伺服器狀況調整
'Page 2
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=1", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)

i = 319
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(15) '依個人網路速度資料來源伺服器狀況調整

'Page 3
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=2", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)
i = 636
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(15) '依個人網路速度資料來源伺服器狀況調整

'Page 4
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=3", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)
i = 953
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(20) '依個人網路速度資料來源伺服器狀況調整

'Page 5
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=4", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)
i = 1270
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(20) '依個人網路速度資料來源伺服器狀況調整

'Page 6
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=5", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)
i = 1587
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(20) '依個人網路速度資料來源伺服器狀況調整

'Page 7
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=6", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)
i = 1904
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(20) '依個人網路速度資料來源伺服器狀況調整
'Page 8
With oXML
.Open "POST", "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E7%B5%B1%E8%A8%88%5F%E5%A4%96%E8%B3%87&SHEET2=%E8%B2%B7%E8%B3%A3%E8%B6%85%E4" & _
"%BD%94%E7%99%BC%E8%A1%8C%E5%BC%B5%E6%95%B8&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%4" & _
"0%E6%88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E&STOCK_CODE=&RPT_TIME=%E6%9C%80%E6%96%B0%E8%B3%87%E6%96%99&STEP=DATA&RANK=7", 0
.setRequestHeader "referer", "https://goodinfo.tw/tw2/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E6%88%90%E4%BA%A4%E5%83%B9+%28%E9%AB%98%E2%86%92%E4%BD%8E%29%40%40%E6%" & _
"88%90%E4%BA%A4%E5%83%B9%40%40%E7%94%B1%E9%AB%98%E2%86%92%E4%BD%8E"
.setRequestHeader "user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36"
.Option(4) = 13056
.send ""

oHTML.body[removed] = convertraw(.responseBody, "UTF-8")
Debug.Print oHTML.body[removed]
End With

Set oTable = oHTML.getElementsByTagName("table")(1)
i = 2221
For Each oRow In oTable.Rows
j = 1
For Each oCell In oRow.Cells
Cells(i, j).Value = oCell.innerText
j = j + 1
Next oCell
i = i + 1
Next oRow

'等待網頁資料完全載入(AJAX)
Call delay(20) '依個人網路速度資料來源伺服器狀況調整

Set oHTML = Nothing
Set oXML = Nothing

Rows("2:2").Select
Selection.AutoFilter
ActiveSheet.Range("$A$2:$S$2210").AutoFilter Field:=1, Criteria1:="" & Chr(13) & "" & Chr(10) & "排" & Chr(13) & "" & Chr(10) & "名"
Rows("21:2211").Select
Selection.Delete Shift:=xlUp
ActiveSheet.Range("$A$2:$S$2092").AutoFilter Field:=1


End Sub

Function convertraw(rawdata, char)

Dim rawstr
Set rawstr = CreateObject("adodb.stream")
With rawstr
.Type = 1
.Mode = 3
.Open
.Write rawdata
.Position = 0
.Type = 2
.Charset = char
convertraw = .ReadText
.Close
End With
Set rawstr = Nothing

End Function


'**********************
' 延遲函數Delay(秒數)
'**********************
Sub delay(x)
T = Timer '作暫停
Do Until Timer - T > x
If T > Timer Then T = T - 86400
DoEvents
Loop
'MsgBox "延遲了" & x & "秒"
End Sub
bank87012 wrote:
請問如何簡化程式碼與加速執行速度
Sub 外本比()

Dim oXML As Object




您在1285樓發問時
我回答的828樓範例,就是利用迴圈來處理的簡化方式

程式請參考828樓,修改範例中的網址就可正常執行

至於速度無解,因為goodinfo有嚴格的流量限制。

網址修改方式如下(點我看大圖)










請問URL與URL_A有機會變成下拉式篩選需要的項目嗎?這樣就有機會用選擇模式知道舊有資料

Url = "https://goodinfo.tw/tw2/StockList.asp?RPT_TIME=&MARKET_CAT=" & UrlEncode("熱門排行&INDUSTRY_CAT=融資減少張數 (一個月)@@融資增減張數@@減少張數 – 一個月&SHEET=資券增減統計_融資餘額&SHEET2=增減(張)")
Url_a = "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=" & UrlEncode("資券增減統計_融資餘額&SHEET2=增減(張)&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資減少張數 (一個月)@@融資增減張數@@減少張數 – 一個月&STOCK_CODE=&RPT_TIME=最新資料&STEP=DATA&RANK=")
bank87012 wrote:
請問URL與URL_A有機會變成下拉式篩選需要的項目嗎?


有機會??

如果您是問,網址能不能改用選單方式來選,那當然可以
因為網址的變化,只是單純的字串組合
您想直接插入物件、改用userform也行

以下是用程式碼插入選單的簡易範例,請參考



Sub addlistbox()

Dim list_0, List_1
On Error Resume Next

With Sheets("工作表1")

.Select
.Shapes.Range(Array("List_0", "List_1")).Delete
.Cells.Clear

Set list_0 = .ListBoxes.Add(.Range("a3").Left + 1, .Range("a3").Top, 82, 400)
Set List_1 = .ListBoxes.Add(.Range("d3").Left + 1, .Range("d3").Top, 82, 400)

With list_0
.Name = "list_0"
.List = Array("a", "b", "c", "d", "e", "f") '參數
.Selected(1) = True
.OnAction = "Listbox_Change"
End With

With List_1
.Name = "list_1"
.List = Array("1", "2", "3", "4", "5") '參數
.Selected(5) = True
.OnAction = "Listbox_Change"
End With

End With

End Sub
Sub Listbox_Change()

Dim a As String, b As String
a = Sheets("工作表1").ListBoxes("list_0").List(Sheets("工作表1").ListBoxes("list_0"))
b = Sheets("工作表1").ListBoxes("list_1").List(Sheets("工作表1").ListBoxes("list_1"))

Sheets("工作表1").Range("g3") = a & b

End Sub





但如果您的有機會是指我會不會把828樓的範例改成選單式
那答案是不會,這部份您要自己去學習才行。
  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?