• 156

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

snare wrote:
因為您是私人網站,我...(恕刪)



snare大,真不好意思,最近真的太忙了,這兩天才有時間上來看您的回覆,看完之後,真的恍然大悟,原來FindElement後面要帶Name,Id,Class是這樣看的,甚至都不行的時候,還可以用XPath,真的是受益良多,我也有按照這樣的操作自己寫了一些程式碼去操控網頁,還真的可以,心想這樣公司網頁的程式碼應該就沒問題了,結果今天到公司,不管是用Name還是Class,甚至用了XPath,都還是會出錯,一樣的寫法,用在公司其他網頁卻可以,不知道是不是這個網頁本身的問題,是不是能麻煩您再看一下,我是不是有哪裡寫錯?很抱歉,因為公司是內部網頁的關係,沒辦法讓您測試結果,只能提供圖片,再次謝謝您。








smart3135 wrote:
都還是會出錯,一樣的寫法,用在公司其他網頁卻可以,不知道是不是這個網頁本身的問題


那個錯誤訊息,跟記憶體無關
英文有說明,是說找不到有相同名稱 Element,才出錯

可能是您找錯名稱
或是這個網頁用了多層frame,您找到的Element名稱,是在某一層
沒切換到正確的frame,就會找不到名稱
詳細請google selenium chromedriver switch frame


您可改用tab切換定位點輸入
慢動作範例請參考
google輸入、tab、清除(enter)、重新輸入、tab*3、google 搜尋(enter)

Sub test()

Dim chrome As New Selenium.ChromeDriver, UrL As String, keys As New keys

UrL = "https://www.google.com.tw/"

With chrome
.Get UrL

.SendKeys ("clear test")

.Wait 2000
.SendKeys keys.Tab

.Wait 2000
.SendKeys keys.Enter

.Wait 3000
.SendKeys ("mobile01")

.Wait 2000
.SendKeys keys.Tab

.Wait 2000
.SendKeys keys.Tab

.Wait 2000
.SendKeys keys.Tab

.Wait 2000
.SendKeys keys.Enter


End With


Stop

chrome.Quit
Set chrome = Nothing

End Sub




Snare 大神:

爬了好幾天的Google找不到答案,Trr2 是我用 Set Trr2 = CallByName(CallByName(DecodeJson, "msgArray", VbGet), "0", VbGet) 剖析出來的數據,想請教,有沒有什麼辦法可以得到這個數組的下標:17,以及依序循環取得這個數組的索引:c、ch、d、ex、h...感謝您

Dylan
Dylan67 wrote:
有沒有什麼辦法可以得到這個數組的下標:17,以及依序循環取得這個數組的索引:c、ch、d、ex、h...


請參考1168樓、1171樓範例

Jsondata.GetKeys......
ubound......
Dylan67

天呀,靠著您那 Jsondata.Write 的 3 行看不懂火星文,全擺平了,我每次在地球上找不到答案,您的回答,就讓我看到了宇宙的浩瀚,真佩服

2022-07-28 0:50
snare wrote:
那個錯誤訊息,跟記憶(恕刪)

snare大,非常感謝您switch to frame的提示,google了一下,大概了解怎麼操作,然後帶到我的程式碼中,真的成功了,真的非常謝謝您。
公司有另一個網頁,我也想依樣畫葫蘆,卻又出錯了,這次進去看,卻看不到frame,可否再麻煩您撥空幫忙看一下錯誤訊息和什麼有關,感謝您


Switch to frame成功



步驟1、2定位和執行都沒問題,點2的時候會跳出另外一個視窗,要執行3就出錯
smart3135 wrote:
看一下錯誤訊息和什麼有關


錯誤訊息,英翻中大意是說

您選的那個element是表格中的圖示,是不能按(click)的
另一個element(上一行),才能接受click

如果網頁是popup視窗的寫法,可能還需要SwitchToAlert輔助
這篇有一些說明
https://www.guru99.com/alert-popup-handling-selenium.html

更多資料,請google selenium chromedriver switchto alert
因為看到,Acer_kewei 13318樓,8/6的影片,集保戶資料整理改了排版方式
https://www.mobile01.com/topicdetail.php?f=291&t=5107288&p=1332

所以我也模仿一下,修改1247樓的排版

(點我看大圖)



程式碼不貼了,主程式沒改
小小修改ListAllStock()副程式
增加2個副程式
Add_New_Chart
Clear_Old_Chart
有興趣自行到附件裡面看

如果不要那個小小的折線圖
把call Add_New_Chart......那行刪掉就行
因為我不確定用合計當資料來畫圖,是不是正確的方式
我是存股族,會抓資料,但不會分析,如果有人知道請告訴我


常用股票工作表中的清單,請自行複製到新檔
access資料庫 stock.accdb,可延用不需重新下載


[點擊下載]
請問為什麼上市下載正常,但上櫃下載不下來

之前上個月還正常下載都可使用,但這個月就不行(上櫃下載不下來)

我是office2013.win7



Dim Xmlhttp As Object, Clipboard As Object, URL As String
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set Xmlhttp = CreateObject("Msxml2.XMLHTTP.3.0")

For i = 1 To 2

If i = 1 Then
URL = Worksheets("查詢").Range("B14").Value & Worksheets("查詢").Range("C17").Value & Worksheets("查詢").Range("C14").Value'上市網址+西元日期
Box = "上市資料"
ElseIf i = 2 Then
URL = Worksheets("查詢").Range("B15").Value & Worksheets("查詢").Range("G17").Value & Worksheets("查詢").Range("C15").Value'上櫃網址+中華日期
Box = "上櫃資料"
End If

On Error Resume Next
With Xmlhttp
.Open "GET", URL, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
If Err.Number <> 0 Then Err.Clear: MsgBox Box & vbNewLine & "下載失敗"
End With

Clipboard.SetText Xmlhttp.responsetext
Clipboard.PutInClipboard
With Sheets("查詢")
.Select

If i = 1 Then
.Cells(18, 1).Select
ElseIf i = 2 Then
.Cells(18, 27).Select
End If

.PasteSpecial NoHTMLFormatting:=True
End With

Next i

Set Xmlhttp = Nothing
Set Clipboard = Nothing
snare
snare 樓主

您的Range("B14")、Range("B15")... ... 等等,對於您來說可能是無法公開的機密資料,我看不到,所以無解

2022-08-14 19:59
機八陽 wrote:
請問為什麼上市下載正...(恕刪)

Worksheets("查詢").Range("B14").Value="https://www.twse.com.tw/exchangeReport/MI_INDEX?response=html&date="
Worksheets("查詢").Range("C17").Value="20220812"
Worksheets("查詢").Range("C14").Value="&type=ALLBUT0999"

Worksheets("查詢").Range("B15").Value="https://www.tpex.org.tw/web/stock/aftertrading/daily_close_quotes/stk_quote_result.php?l=zh-tw&o=htm&d="
Worksheets("查詢").Range("G17").Value="111/08/12"
Worksheets("查詢").Range("C15").Value="&s=0,asc,0"
機八陽 wrote:
之前上個月還正常下載都可使用,但這個月就不行(上櫃下載不下來)


我用您的程式碼測試是正常的,您可能是查詢頻率太高,被tpex、twse擋ip
但沒聽說過tpex、twse會封鎖ip,如果您8月份10多天都不能下載
那可能是其它原因造成




另外建議,這2個網頁,不要用html格式下載,改用csv下載
上市、上櫃(html格式),大約6百萬字元
上市、上櫃(csv格式),大約1百萬字元
資料量差6倍,用csv處理會快很多


可參考200樓範例

#If VBA7 Then
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#Else
Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#End If



Sub Get_Tpex_Twse_Csv()

Dim UrL As String, Target As String, TpexCsv As String, Clipboard As Object, Tpex As Object
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set Tpex = CreateObject("scripting.filesystemobject")

On Error GoTo checkid


Target = "c:\excel\" '暫存目錄,windows 10可能有權限問題,需在選項內設定信任位置,或改目錄位置
If Dir(Target, vbDirectory) = "" Then MkDir Target
'注意,暫存目錄下的檔案,會在無任何提示下刪除
If Dir(Target & "*.*") <> "" Then Kill Target & "*.*"

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

'UrL = "https://www.tpex.org.tw/web/stock/aftertrading/daily_close_quotes/stk_quote_result.php?l=zh-tw&o=csv&d=111/08/12&s=0,asc,0"
UrL = "https://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=20220812&type=ALLBUT0999"

URLDownloadToFile 0, UrL, Target & "temp.csv", 0, 0

'如果單純只是下載檔案,那程式碼到這裡就可以結束了

With Tpex.OpenTextFile(Target & "temp.csv", 1)
TpexCsv = Replace(Replace(.ReadAll, "=", ""), "元,", "元.")
.Close
End With

Clipboard.SetText TpexCsv
Clipboard.PutInClipboard

With Sheets("工作表1")
.Cells(1, 1).Select
.Columns(1).NumberFormat = "@"
.PasteSpecial NoHTMLFormatting:=True
.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True, FieldInfo:=Array(Array(1, 2), Array(2, 1)), TrailingMinusNumbers:=True
.Columns.AutoFit
.Columns(1).ColumnWidth = 40
.Cells(1, 1).Select
End With

Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set Clipboard = Nothing
Set Tpex = Nothing

checkid:

If Err.Number <> 0 Then
Debug.Print Err.Description
End If

End Sub



  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?