• 156

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

alfidpan wrote:
但是利用您上次Barrons網站的方法,找出 "length"的方法,但找不出"length"


因為key是日期

如果key值太多不想一行一行建立,或是因為key值非連續數字、文字,無法順利用迴圈取出
請參考1168樓,改用Jsondata.GetKeys 方法取出未知key值


        





Set temp = Jsondata.GetKeys(json1)
keys = Split(temp, ",")

For i = 0 To UBound(keys)
Set json2 = Jsondata.GetProperty(json1, keys(i))
Debug.Print keys(i), Jsondata.GetProperty(json2, "date"), Jsondata.GetProperty(json2, "amount")
'數字轉日期方式,請參考274樓的計算方式
Next i
alfidpan

snare您好 剛試了一下確實可以將資料匯入,非常非常感謝您。

2021-12-23 21:39
snare大神
看來新的一年又要到了 各大網站都在改版
又遇到一個新的問題 麻煩您有空再給新手的我指點一下迷津
之前是用以下方法取得資料
改版後 感覺好像table改成用span的方法 所以所有資料都會一次匯出在同一列裡
請問該怎麼修改迴圈的地方 讓它顯示正常



謝謝 預祝snare大神平安夜 耶誕節快樂

Sub 下載年報()
'下載年報
Dim Url, HTMLsourcecode, GetXml, temparray()

re = 0
retry:
On Error GoTo Error_debug

Set HTMLsourcecode = CreateObject("htmlfile")
Set GetXml = CreateObject("msxml2.xmlhttp")
With ThisWorkbook.Sheets("年表")
.Select
'.Range("A1:I99").Clear
Url = "http://5850web.moneydj.com/z/zc/zcr/zcra/zcra_6203.djhtm"
End With



With GetXml
.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

HTMLsourcecode.body.innerhtml = .responsetext
ThisWorkbook.Sheets("年表").Range("A1").Value = HTMLsourcecode.body.innerhtml

If InStr(HTMLsourcecode.body.innertext, "獲利能力指標") = 0 Then
ThisWorkbook.Sheets("年表").Range("A1:I99").Clear
ThisWorkbook.Sheets("年表").Range("A1").Value = "查無年表資料"
GoTo Clean
End If


Set Table = HTMLsourcecode.all.tags("table")(1).Rows
ReDim temparray(Table.Length - 1, Table(2).Cells.Length - 1)

For i = 0 To Table.Length - 1
For j = 0 To Table(i).Cells.Length - 1
temparray(i, j) = Table(i).Cells(j).innertext
Next j
Next i
End With
With ThisWorkbook.Sheets("年表")
.Range("A1:I99").Clear
.Range(.Cells(1, 1), .Cells(Table.Length, Table(2).Cells.Length)) = temparray()
.Cells.EntireColumn.AutoFit
.Cells(1, 1).Select
End With

Clean:
Erase temparray()
Set HTMLsourcecode = Nothing
Set GetXml = Nothing
Exit Sub

Error_debug:
re = re + 1
If re > 4 Then
Debug.Print stock_id & "錯誤達5次, 自行開啟網頁檢查"
GoTo Clean
End If

If Err.Number <> 0 Then
'列出錯誤訊息,或利用不同的錯誤訊息,決定程式的處理方式
Debug.Print "下載年報:" & " " & Err.Description
End If

On Error GoTo -1
Err.Clear

GoTo retry

End Sub
rainbowsperm wrote:
改版後 感覺好像table改成用span的方法 所以所有資料都會一次匯出在同一列裡
請問該怎麼修改迴圈的地方 讓它顯示正常






Sub moneydj_no_table()

Dim Url As String, HTML As Object, GetXml As Object, temp, i As Integer

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

Url = "http://5850web.moneydj.com/z/zc/zcr/zcra/zcra_6203.djhtm"

With GetXml
.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

HTML.body.innerhtml = .responsetext

Set Table = HTML.all.tags("table")(1).Rows

temp = Split(Replace(Table(0).Cells(0).innertext, " / ", "/"), vbNewLine)
For i = 0 To UBound(temp)
temp(i) = Trim(temp(i))
Next i

End With

With Sheets("工作表1")
.Cells.Clear
.Range("a1").Resize(UBound(temp) + 1, 1) = Application.Transpose(temp)
.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Space:=True, TrailingMinusNumbers:=True
.Columns.AutoFit
End With


Set HTML = Nothing
Set GetXml = Nothing


End Sub


cji3cj6xu6

謝謝rainbow大提醒有此事,也謝謝snare大解疑,但想問snare大,抓下來的資料有空白列,我只能想到for 迴圈去消掉Rows(i),還有其他方法嗎?謝謝!

2021-12-25 22:08
yingchieh

snare大大,請教一下請問有方法可以把結果直接放到TempArray二維矩整理我要的資料就好嗎?我目前只能做到再從工作表再抓回TempArray.謝謝

2022-03-18 6:15
snary版大您好,
照著您的方法,
不過split只能針對特殊字元分割,
卻無法將數字分割(如下圖片),
不知道是否是以資料型態的方式處理呢?
再麻煩指點,謝謝~



alfidpan

網址可能是https://tachansec.moneydj.com/z/zc/zca/zca.djhtm?a=1101

2021-12-25 8:22
strainny

S大,不好意思,附上連結:http://5850web.moneydj.com/z/zc/zca/zca_3034.djhtm祝聖誕快樂 謝謝

2021-12-25 10:38
.
.
strainny wrote:
S大,不好意思,附上連結:http://5850web.moneydj.com/z/zc/zca/zca_3034.djhtm(恕刪)


雖然和1173樓一樣都是moneydj,但這一頁的資料似乎還在改版中
網頁裡混了2種格式,表格、沒表格,所以1173樓範例不適用


建議改用clipboard處理,請配合1159樓範例修改


clipboard





Set Table = HTMLsourcecode.getElementById("SysJustIFRAMEDIV")
Call Clipboard_Past("temp", Table)

Sheets("temp").Cells.ColumnWidth = 15
Sheets("temp").Rows("1:1").Delete Shift:=xlUp
Sheets("temp").Columns("A:A").Delete Shift:=xlToLeft
Sheets("temp").Cells(1, 1).Select




表格(需另外加程式碼整理格式)
Set Table = HTMLsourcecode.all.tags("table")(2).Rows
Call Cell_by_Cell("temp", Table)

Set Table = HTMLsourcecode.all.tags("table")(3).Rows
Call Cell_by_Cell("temp", Table)

alfidpan wrote:
網址可能是https://tachansec.moneydj.com/z/zc/zca/zca.djhtm?a=1101(恕刪)


您提供的moneydj網址,這頁的下載方式,方法同1177樓
感謝S大幫忙,目前測試是可以的!

但有幾的問題想請教一下:
1.可以請教下兩個分別所代表的涵義嗎(網路似乎找不到解釋的資料)
Set Table = HTMLsourcecode.all.tags("table")(tabrow).Rows
Set Table = HTMLsourcecode.getElementById("SysJustIFRAMEDIV")


2.下面這幾行,也可請S老師幫忙解惑嗎,謝謝~
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
==>引號裡面的那一串更是看不懂,和網頁資訊有關嗎?

Clipboard.settext Table.innerhtml
Clipboard.putinclipboard
strainny wrote:
1.可以請教下兩個分別所代表的涵義嗎(網路似乎找不到解釋的資料)
Set Table = HTMLsourcecode.all.tags("table")(tabrow).Rows
Set Table = HTMLsourcecode.getElementById("SysJustIFRAMEDIV")


table => 21樓、101樓、122樓、其它樓…
getElementById => google getElementById


strainny wrote:
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
==>引號裡面的那一串更是看不懂,和網頁資訊有關嗎?


225樓



strainny wrote:
Clipboard.settext Table.innerhtml
Clipboard.putinclipboard



類似 ctrl + C 功能
差別是一個在記憶體裡面用程式碼複制
另一個是手動按鍵盤
  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?