• 116

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

Wei_1144 wrote:
你好像是一筆一筆抓,這樣應該會被 Yahoo ban。...(恕刪)

呃~這是設計用來代替⇒Excel Web匯入
不是拿來抓全部收盤資料的,没這個問題啦
還有些人是用來上班假裝在用excel,其實是偷看股票
收盤資料,很多卷商都有整理好的檔案,沒必要一筆一筆抓
(全部收盤資料下載,可往後參考269樓範例)

(證券櫃檯買賣中心,就有提供csv table 下載,一次查詢,就可另存大量資料)

(不好意思,大概是標題下的不好讓您誤會了)

如果真的有人拿這個去抓一萬多筆資料
被Ben是自找的,只能笑笑了

資料庫,只要知道真實位置,就可以抓一個檔案
取得全部資料,這不是這個程式的目地
要那些資料,用看盤軟體 or DDE or csv table查詢會比較快,方向不同

網頁查詢,我只知道一筆一筆抓
如果能一次送出100筆,然後只回傳一次
就有全部資料,這樣效率提升超多的

晚一點我再修改一下,先把查詢到的丢暫存,再一次顯示
應該會順一點點,現在抓一筆就秀一筆的方式,讓EXCEL有點延遲
(3/16 更新程式碼)

不過Yahoo股市這種網頁
真的能用VBA做到只使用一次查詢,然後一次送回數筆資料??

但網頁查詢不是只能一筆一筆查?
雖然用csv table可以達成只產一個檔案
可是過程,還是一筆一筆查
通常用在年度資料、歷史資料,或是您說的收盤資料
有些券商會提供csv table下載,那就可以一次可獲得大量資料
這跟Excel Web匯入,用途不一樣

這位高手,您能給個方向嗎?我研究一下
請問在網頁原始碼中,那一段可支援1次查詢數筆資料
因為我怎麼看都只能一次一筆

====以下是 yahoo 股市查詢的位置====

.Name= .ID=yui_3_5_1_15_1458127636344_8 .action=https://tw.search.yahoo.com/search;_ylt=A3TWA1U_Q.lWXgYAGADP9R0J .method=get
.tagName=INPUT .Name=p .ID=yuhead-sform-searchfield .Value=搜尋
.tagName=BUTTON .Name= .ID= .Value=
.tagName=INPUT .Name=fr .ID=fr .Value=ush1-finance

.Name=menu .ID= .action=https://tw.stock.yahoo.com/h/stockmenu.php .method=get
.tagName=INPUT .Name=stock_name .ID= .Value=
.tagName=INPUT .Name=ei .ID= .Value=cp950
.tagName=INPUT .Name=stock_id .ID=stock_id .Value=2002
.tagName=SELECT .Name=func .ID= .Value=G
.tagName=INPUT .Name=xSubmit .ID= .Value=查詢

.Name=orderform .ID= .action= .method=get
.tagName=INPUT .Name=df .ID= .Value=
.tagName=INPUT .Name=stkid .ID= .Value=2002
.tagName=INPUT .Name=stkname .ID= .Value=中鋼
.tagName=INPUT .Name=bs .ID= .Value=1
.tagName=INPUT .Name=bs .ID= .Value=5
.tagName=INPUT .Name=vol .ID= .Value=
.tagName=INPUT .Name= .ID= .Value=送出
朋友,謝謝,最近換了系統,資料都抓不太下來,剛好可以使用,感謝分享~

snare wrote:
解決方式有很多一、分...(恕刪)



說實在的

這真的是一個好東西!!!

非常感謝版大熱心分享(大推)


期待往後版大有新的IDEA再次分享!



bioleon69 wrote:
說實在的這真的是一個...(恕刪)



不好意思大大

盤中按下查詢鈕的時候
成功查詢,不過再次按下,更新的速度是變快
但是數據內容不變.

必須把檔案關閉,重新開啟,再次按下查詢
內容數據才會更新
不曉得能不能提示一下要修改哪裡~
感謝
bioleon69 wrote:
成功查詢,不過再次按下,更新的速度是變快
但是數據內容不變....(恕刪)


那是因為查詢的內容,會被windows 做成 cache ,儲存在 Temporary Internet Files
如果查詢時間太近,會自動被windows 導向 cache 拿資料

當初寫這個範例時,不是設計在盤中使用,雖然也可以用啦
沒考慮到查詢時間太近,會抓到cache的問題

要檔案請回第一頁抓 2017/1/09 那一個

自行修正請增加3行程式碼
.Open "GET", URL, False
'==========增加以下3行==================================================
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
'======================================================================
.send

留個記錄,我對 vba 有興趣~~


snare wrote:
解決方式有很多一、...(恕刪)

snare wrote:
那是因為查詢的內容,...(恕刪)


回報
沒想到還有這些函數

目前不會有那個問題了
成功更新!
請問,為何我用以下網路下載的VBA程式,每更新一檔股價,都要花近40秒?我的系統是WIN7 OFFICE2016,我研究很多天,都沒發現有問題,還是因為OFFICE版本的問題?
我有試著用您之前提供下載的EXCEL 來改,但可能是我的基本功不夠,改了之後一直失敗
還是因為,我匯入時都會有安全性警告的關係?


Function stockPrice(stockCode As String) As Single
Dim theTbl As HTMLTable
Dim theRow As HTMLTableRow
Dim theCol As HTMLTableCol
Dim theCell As HTMLTableCell
Dim thePT As Range
Dim i As Long
Dim tblS As IHTMLElementCollection

Application.ScreenUpdating = False
Application.StatusBar = "更新 " & stockCode & " 股價..."
QueryAct stockCode
stockPrice = Worksheets("temp").Cells(3, 3)
Application.ScreenUpdating = True
Application.StatusBar = False
End Function

Sub QueryAct(stockCode As String)
getData stockCode
End Sub

Sub enableSeletion()
With Sheets("home")
.Activate
.EnableSelection = xlNoRestrictions
End With
End Sub

Sub getData(stockCode As String)

ThisWorkbook.Worksheets("temp").Cells.Delete
With ThisWorkbook.Worksheets("temp").QueryTables.Add(Connection:= _
"URL;http://tw.stock.yahoo.com/q/q?s=" & stockCode, Destination:=ThisWorkbook.Worksheets("temp").Range("$A$1"))
.Name = "q?s=" & stockCode
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "7"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub


sequare wrote:
請問,為何我用以下網路下載的VBA程式,每更新一檔股價,都要花近40秒?我的系統是WIN7 OFFICE2016,我研究很多天,都沒發現有問題,還是因為OFFICE版本的問題?
我有試著用您之前提供下載的EXCEL 來改,但可能是我的基本功不夠,改了之後一直失敗...(恕刪)


一、 .QueryTables.Add,本來就很慢,跟office 版本無關,
如果您是抓到的 ieobject 的程式,會更慢
我的範例40秒大概可以抓200~300筆吧

二、 改範例?? 即然po上來,我就不會介意,歡迎修改
(但我最多只給提示,不會幫您改)

您的程式抓出來是這樣,除了股價之外,其它沒用的文字一起抓進來


我的是只抓出要看的資料,順便加上顏色
只要 a2 ~ a???? 填入想要的股票代號(股票名稱不用填上),程式就會自動抓


跟您的排列方式不是差不多嗎? 沒什麼好改的啊,您是要改那裡??
p.s 程式碼必需放在“模組”裡面

三、安全性警告是可以用設定信任清單來關掉的

請問一下版大

目前還是只會修改
有時候為了改一些小東西像是無頭蒼蠅
花了很久的時間

有沒有建議新手好練功的工具書(中文)

目前很卡的就是關於物件的使用
基本的vba方法
youtube跟yahoo網頁還搜尋的到

其他的資源就超少


例如說
msxml2.xmlhttp
InternetExplorer.application
這些物件的使用方法

現階段也是最想學好這兩個物件的使用方法
期盼大大回應


  • 116
評分
複製連結
請輸入您要前往的頁數(1 ~ 116)