snare wrote:
通常來說就是拿資料那個網頁的上一個網頁(一般都是首頁)...(恕刪)
樓主您不但是程式功力深厚,還是個不吝分享及回應問題的高高手,並能站在入門者的角度看問題及適時回應問題,謝謝
snare wrote:
javascript寫到何處=>一個在記憶體中的htmlfile物件...(恕刪)
小弟看了您有關json解析運用…function (s)…. eval('(' + s + ')')這種vba程式的寫法,似乎與網路上有關javascript 自訂函數內運用eval()的寫法有些差異,因不懂,只能死記運用,不過,小弟在google有關eval()解析json字集過程,有許多網站資料均表示eval()解析json可能會產生安全疑慮,建議改用json.parse(),請問樓主eval函數真的不安全嗎?
snare wrote:
callbyname這個特殊函數,剛好可以跳過這個限制...(恕刪)
Callbyname這個函數真的很特殊難懂,小弟會努力去認識它
小弟因不懂Javascript及被callbyname打敗,就嚐試以最單純的切,切,切方式來解析json,雖然最後是順
利切出結果,但過程產生一些問題,請樓主有空看一下,小弟觀念錯誤在那? 完整的程式碼在最後
(1)即時運算視窗程式碼Debug.Print HTMLsourcecode.body.innerhtml 如.圖1
(2)儲存格A1資料 Cells(1, 1) = HTMLsourcecode.body.innerhtml ,如圖 2.
(3). 剪貼簿程式碼功能,如圖 3.
問題:
1.為何(1) 與( 2) 的內容不同,而且是json字集的前段與後段,中間段資料卻不見了?
2.使用剪貼簿功能所產生的資料才是完整的json字集,但(1)+(2)卻不等於(3)?
3.此程式碼不是從無到有,是在透過樓主585樓範例知道結果後,作json字集內容檢視後,以split方式解析json,請教樓主該程式的split方式是否正確?
################### 程式碼 ###################
Sub getbic()
Dim str As Variant, str2 As Variant, r&, n&, Clipboard As Object
Dim HTMLsourcecode, Url, Url_a
Set HTMLsourcecode = CreateObject("htmlfile")
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
ttt = Timer
Cells.Clear
Url = "https://index.ndc.gov.tw/n/json/data/eco/indicators"
Url_a = "https://index.ndc.gov.tw/n/zh_tw/data/eco"
On Error Resume Next
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "POST", Url, False
' .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Url_a
.send
' HTMLsourcecode.body.innerhtml = .responsetext
str = Split(.responsetext, """code"":")
End With
' Debug.Print HTMLsourcecode.body.innerhtml '(1)即時運算視窗
' Cells(1, 1) = HTMLsourcecode.body.innerhtml '(2)儲存格A1資料
' With Clipboard
' .SetText HTMLsourcecode.body.innerhtml '(3)剪貼簿功能資料
' .PutInClipboard
' End With
' With Sheets("sheet2")
' .Cells(1, 1).Select
' .PasteSpecial NoHTMLFormatting:=True
' End With
str2 = Split(str(2), "{""id"":")
n = UBound(str2)
For r = 1 To n
Cells(r, 1) = Split(Split(str2(r), "x"":""")(1), """")(0)
If Split(Split(str2(r), "y"":")(1), "}")(0) = "null" Then
Cells(r, 2) = ""
Else
Cells(r, 2) = Split(Split(str2(r), "y"":")(1), "}")(0)
End If
Next r
MsgBox "使用時間" & Round(Timer - ttt, 2) & "秒", vbOKOnly, "下載完成"
Set HTMLsourcecode = Nothing
Set Clipboard = Nothing
End Sub