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

版主 我想請問一下 程式碼如下

Sub 複製貼上()

Dim w1 As Excel.Workbook
Set w1 = Workbooks.Open(ThisWorkbook.Path & "\" & "3333.xlsx", , flase)
Workbooks("1234.xlsm").Worksheets(1).Range("H:Z").Copy _
Destination:=Workbooks("3333.xlsx").Worksheets("1324.tw").Range("H:Z")

End Sub

我想將 1234活頁簿內的工作表(1)範圍 H:Z 全部COPY給3333活頁簿內的所有工作表 裡面有 100個工作表 有比較方便的寫法嗎
clothk73713 wrote:
我想將 1234活頁簿內的工作表(1)範圍 H:Z 全部COPY給3333活頁簿內的所有工作表 裡面有 100個工作表 有比較方便的寫法嗎


迴圈
for i=1 to 100 'w1.worksheets.count
'…程式碼… w1.worksheets(i)......
next i

中文看得懂
google "excel 活頁簿 工作表 複製 跨檔案 vba"
英文也不錯
google "copy range to another workbook excel vba"

或是,到"麻辣家族" http://forum.twbts.com/,看看各種範例
那邊教學比較多,熱心人士也多
當註冊性別=>女,或是成為付費會員,特別容易跳過教學直接拿到答案

程式基礎請自行加強,不建議太早學飛
snare wrote:
迴圈for i=1 to...(恕刪)


版主謝謝你的幫忙 我大徹大悟了
snare大神

我照了您的POST解釋方法找到了 以下網址的真實POST位址
https://mops.twse.com.tw/mops/web/t105sb01

https://mops.twse.com.tw/mops/web/ajax_t105sb01?step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&inpuType=co_id&TYPEK=pub&co_id=6223

但當我將網址輸入到瀏覽器後
他變成

然後框框中的按鈕是無法按的

但我要找的資料是要按按鈕後才可以取得的
如下紅框所示


請問像這種網頁 我要如何取得上圖紅框中要找的特定資料

請大神解惑


謝謝
rainbowsperm wrote:
我要如何取得上圖紅框中要找的特定資料(恕刪)


一、chrome(or other)



**********
二、F12
**********

三、



四、



五、







'.........
.Open "POST", "https://mops.twse.com.tw/mops/web/ajax_t105sb02", False
.send ("encodeURIComponent=1&firstin=true&TYPEK=otc&step=0&co_id=6223")
'.........
Set Table =.........
debug.print Table(3).Cells(16).innertext
debug.print Table(3).Cells(17).innertext
'.........



snare wrote:
一、chrome(or(恕刪)


原來從開始要的資料去按F12查就好
謝謝大神超詳細的解釋
謝謝大神直接告知要擷取的資料去哪找
要不還要慢慢試好久~~~XD
等等馬上來試試

再次謝謝大神又一次解決我的問題~~越學越多^^
另外想請教一個非EXCEL的問題,
大神的這則貼文, 如果有人問的問題之前回答過了, 大神是如何快速找到相關的樓層呢?
我看01的收尋好像不能針對貼文的內文做收尋??還是只有樓主可以 哈


--------------------------------------------------------------
大神不好意思, 學藝不精, 測試失敗了
我是先用45樓array的方式去測試, 但出現陣列索引超出範圍錯誤, 所以後來用21樓的方式
找出是table 1, 但是寫出來的結果 卻沒有寫到我要的日期

但看大神的是table3?? 雖有是過了但一樣不行, 還請大神指導
---------------------------------------------------------------
不好意思, 在更新一下
用21樓方法有成功Print出來了 只是格式有點亂跟網頁的不一樣
目前研究array的部分中~~XD
---------------------------------------------------------------
再次更新 array的測試, 目前測試成功 希望不要再有新問題!!XD


謝謝
Snare大,

Goodinfo好像改了第三層資訊真實網址的位置,所以無法擷取其資料,但使用原來方法Name欄位中已經找不到stocklist..., 還想請教如何取得其真實網址?謝謝

網頁連結:
https://goodinfo.tw/StockInfo/StockList.asp?RPT_TIME=&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資減少張數+%28一個月%29%40%40融資增減張數%40%40減少張數+–+一個月&SHEET=資券增減統計_融資餘額&SHEET2=增減%28張%29

原本的真實位置:(目前已經不能使用)
https://goodinfo.tw/StockInfo/StockList.asp?SEARCH_WORD=&SHEET=資券增減統計_融資餘額&SHEET2=增減(張)&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資減少張數+(一個月)@@融資增減張數@@減少張數+–+一個月&STOCK_CODE=&RPT_TIME=最新資料&STEP=DATA&RANK=

原本可以找到Name欄位中Stocklist...的檔案可以找到真實網址之處的頁面參考。


目前按照原本取得真實網址之處,Name欄位已經看不到Stocklist...檔案了。
lpviva wrote:
Goodinfo好像改了第三層資訊真實網址的位置,所以無法擷取其資料,但使用原來方法Name欄位中已經找不到stocklist..., 還想請教如何取得其真實網址?謝謝



本來不想寫範例的,突然發現,擋ip的條件,變更嚴格了,反正也無法大量下載
有興趣參考看看吧
(20210523 網頁改版,修正部份程式碼)



(20230122 網頁改版,更新網址、修正部份程式碼)

https://goodinfo.tw/tw2/StockList.asp?RPT_TIME=&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資減少張數 (一個月)@@融資增減張數@@減少張數 – 一個月&SHEET=資券增減統計_融資餘額&SHEET2=增減(張)

第1~n頁(post),和3年前一樣,會檢查Referer
https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=資券增減統計_融資餘額&SHEET2=增減(張)&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資減少張數 (一個月)@@融資增減張數@@減少張數 – 一個月&STOCK_CODE=&RPT_TIME=最新資料&STEP=DATA&RANK=0
(RANK=0、...RANK=n)





'因語法衝突,po文中的 [removed],請手動修改成 innerHTML,前面再加個.(小數點),或直接參考附件

Sub get_goodinfo()

Dim Xmlhttp As Object, HTMLsourcecode As Object, Table, Url As String, Url_a As String, i As Integer, p As Integer, ttt As Double

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

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

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=")

'為了容易修改參數、程式美觀,網址另外用副程式編碼處理。
'這樣程式碼觀看起來比較直覺,網址也不會出現一大堆看不懂的亂碼。

'例如:
'如果要下載,熱門排行 – 成交價 (高→低) (共計2090筆)
'只需要把網址修改如下,其它程式碼不需變動

' Url = "https://goodinfo.tw/tw2/StockList.asp?RPT_TIME=&MARKET_CAT=" & UrlEncode("熱門排行&INDUSTRY_CAT=成交價 (高→低)@@成交價@@由高→低")
' Url_a = "https://goodinfo.tw/tw2/StockList.asp?SEARCH_WORD=&SHEET=" & UrlEncode("交易狀況&SHEET2=日&MARKET_CAT=熱門排行&INDUSTRY_CAT=成交價 (高→低)@@成交價@@由高→低&STOCK_CODE=&RPT_TIME=最新資料&STEP=DATA&RANK=")











With Xmlhttp

i = 0

Do
DoEvents
.Open "POST", Url_a & i, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Url
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send

HTMLsourcecode.body[removed] = convertraw(.ResponseBody)

If InStr(HTMLsourcecode.body[removed], "瀏覽量異常") > 0 Then
MsgBox HTMLsourcecode.body.innertext
Exit Sub
End If

If i = 0 Then
p = Replace(Right(HTMLsourcecode.getElementById("selRANK").innertext, 4), "~", "")
MsgBox p & "筆(debug),按確定後開始下載" 'debug
p = WorksheetFunction.RoundUp(p / 300, 0)

End If

'==========================
'剪貼薄方式(2選1)
'Set Table = HTMLsourcecode.getElementById("divStockList") 'txtStockListData
'Call Clipboard_Past("工作表1", Table)
'==========================

'==========================
'逐格寫入方式(2選1)
Set Table = HTMLsourcecode.getElementById("tblStockList").Rows
Call Cell_by_Cell("工作表1", Table)
'==========================

i = i + 1
If i > 10 Then Exit Do
Delaytick (16) '建議至少10秒以上,預設16秒

Loop Until i = p

Sheets("工作表1").Cells(1, 1).Select
Sheets("工作表1").Cells.EntireColumn.AutoFit


End With

Application.ScreenUpdating = True

Set HTMLsourcecode = Nothing
Set Xmlhttp = Nothing
Set Table = Nothing

MsgBox Timer - ttt

End Sub

Sub Clipboard_Past(sheet_name As String, Table)

Dim Clipboard As Object, lastrow As Integer
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

Clipboard.settext Table[removed]
Clipboard.putinclipboard

lastrow = Sheets(sheet_name).Range("A1").CurrentRegion.Rows.Count
Sheets(sheet_name).Cells(lastrow + IIf(lastrow > 1, 1, 0), 1).Select
Sheets(sheet_name).PasteSpecial NoHTMLFormatting:=True

Set Clipboard = Nothing

End Sub

Sub Cell_by_Cell(sheet_name As String, Table)

Dim i As Integer, j As Integer, lastrow As Integer

lastrow = Sheets(sheet_name).Range("A1").CurrentRegion.Rows.Count

For i = 0 To Table.Length - 1
For j = 0 To Table(i).Cells.Length - 1
Sheets(sheet_name).Cells(i + 1 + IIf(lastrow > 1, lastrow, 0), j + 1) = IIf(j = 1, "'", "") & Table(i).Cells(j).innertext
Next j
Next i


End Sub

Function convertraw(rawdata)

Dim rawstr
Set rawstr = CreateObject("adodb.stream")

With rawstr
.Type = 1
.Mode = 3
.Open
.Write rawdata
.Position = 0
.Type = 2
.Charset = "utf-8"
convertraw = .ReadText
.Close
End With

Set rawstr = Nothing

End Function


Sub Delaytick(setdelay As Single)

Dim StartTime As Double, NowTime As Double
StartTime = Timer * 100
setdelay = setdelay * 100
Do
NowTime = Timer * 100
DoEvents
Loop Until NowTime - StartTime > setdelay

End Sub

'urlencode 副程式是圖片,請手動輸入,或參考附件







(20210523 網頁改版,修正部份程式碼)
(網頁查詢次數、時間的限制,變的非常嚴格,查詢間隔時間不能太短)

(20230122 網頁改版,修正部份程式碼)
(除了網址變了之外,查詢次數、時間的限制,比上次更嚴格,間隔需10秒以上)



[點擊下載]
版主您好,第一次提問,先感謝您這麼多的解析,簡單瀏覽真是仍不足以運用,相請教這個網址的CSV按鈕,應如何拼湊成對應的真實鏈接網址,謝謝。
https://mops.twse.co

m.tw/nas/t21/sii/t21sc03_109_6_0.html
snare大神
Fiddle摸索了一天,csv按鈕應該是鏈接到這個真實網址對嗎?
https://mops.twse.com.tw/server-java/FileDownLoad?step=9&functionName=show_file&filePath=%2Fhome%2Fhtml%2Fnas%2Ft21%2Fsii%2F&fileName=t21sc03_109_6.csv
另外想請教,VBA程式部分,可不可以推薦我看那幾樓的編碼修改,謝謝。
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 143)

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