返回列表 上一主題 發帖

[發問] 請問能否將2個VBA巨集合併成1個VBA巨集

回復 9# azrael19

可以正常了
    感謝您的用心  這樣就可以正常顯示2組合併的巨集

TOP

回復 10# GBKEE
無法執行(原因:我是菜鳥無能力修改完成)
1 語法錯誤


2.錯誤內容


感謝您熱心的參與 謝謝您

TOP

回復 9# azrael19

有一個延伸的問題 能否判讀如附圖內右端整排資料之漲或跌


或可將實際之箭頭方向一併呈現 我在用IF判斷

謝謝您

TOP

回復 8# no3-taco
由於等網站對菜鳥的每小時只能回覆3次的限制 故晚了回覆

由於個人初學巨集 沒能力組合複雜的東西 不過還好有熱心的高手子9樓)已解決了我的問題
還是非常感謝您熱心的參與回復 謝謝您

TOP

回復  azrael19

有一個延伸的問題 能否判讀如附圖內右端整排資料之漲或跌


或可將實際之箭頭方向一 ...
lcctno 發表於 2015-7-26 11:13


用原本的方式我還不知道要怎麼做,如果你的需求只是要抓資料,下面是另一種方式你試試看...
  1. Option Explicit
  2. Option Base 1

  3. Sub Ex()
  4.     Dim HEAD As Variant, PARAM As Variant, PA As Variant, AR As Variant, v As Variant
  5.     Dim i As Integer, j As Integer, k As Integer
  6.     Dim s As String, ErrDescription As String
  7.     Dim objCol As Object
  8.    
  9.     '參數 : 網址,表頭放置位址,資料放置儲存格位址,標註顏色儲存格位址
  10.     PARAM = [{"http://www.yuantaetfs.com/api/RtNav","B1","B5","D16:D17"; "http://www.yuantaetfs.com/Home/IndexPrice","","B27","C27:C28"}]
  11.    
  12.     '資料表頭陣列字串
  13.     HEAD = Array("{""資料時間"","""","""","""","""","""","""","""","""","""","""","""","""","""","""";" & _
  14.                  """基本資料"","""",""淨值"","""","""","""",""市價"","""","""","""",""折溢價"","""",""初級市場"","""",""基金"";" & _
  15.                  """股票"",""基金"",""昨收"",""預估"",""漲跌"",""漲跌幅"",""昨收"",""最新"",""漲跌"",""漲跌幅"",""折溢價"",""幅度"",""可否"",""可否"",""營業日"";" & _
  16.                  """代碼"",""名稱"",""淨值"",""淨值"","""","""",""市價"",""市價"","""","""","""","""",""申購"",""贖回"",""""}", "")
  17.                  
  18.     'Regular Expression
  19.     PA = Array("{""fundId"":""[\d]+"",""etfId"":""(.+?)"",""name"":""(.+?)"",""ename"":""[^""]*"",""yestNav"":(.+?),""nav"":(.+?),""navFluct"":(.+?),""yestPrice"":(.+?),""price"":(.+?),""priceFluct"":(.+?),""yestIndex"":(.+?),""index"":(.+?),""indexFluct"":(.+?),""updateTime"":""(.+?)"",""AllowMark"":""(.+?)"",""RedemMark"":""(.+?)"",""BussMark"":""(.+?)"",[^}]+}", _
  20.                "{""fund_id"":null,""IndexCode"":""[^""]*"",""IndexName"":""([^""]+)"",""IndexEName"":""[^""]*"",""crncy"":""[^""]*"",""area"":""D"",""DayDate"":""[^""]*"",""Close"":(.+?),""yestClose"":(.+?),""Diff"":(.+?)}")

  21.     ActiveSheet.UsedRange.ClearContents
  22.    
  23.     For i = LBound(PARAM) To UBound(PARAM)
  24.    
  25.         '抓取JSON資料
  26.         With CreateObject("WinHttp.WinHttpRequest.5.1")
  27.             .Open "GET", PARAM(i, 1), False
  28.             .send
  29.             If 200# <> .Status Then
  30.                 ErrDescription = "網頁讀取失敗!"
  31.                 GoTo Catch
  32.             End If
  33.             s = .responseText
  34.         End With
  35.         
  36.         With ActiveSheet
  37.             If "" <> PARAM(i, 2) Then
  38.                 '放置表頭資料
  39.                 AR = Application.Evaluate(HEAD(i))
  40.                 .Range(PARAM(i, 2)).Resize(UBound(AR, 1), UBound(AR, 2)).Value = AR
  41.                 Erase AR
  42.             End If
  43.             If "" <> PA(i) Then
  44.                 '解析JSON字串中所需資料
  45.                 With CreateObject("VBScript.RegExp")
  46.                     .Global = True
  47.                     .Pattern = PA(i)
  48.                     If False = .test(s) Then: GoTo Catch
  49.                     Set objCol = Nothing
  50.                     Set objCol = .Execute(s)
  51.                 End With
  52.                 If 0 = objCol.Count Then
  53.                     ErrDescription = "資料格式解析錯誤!"
  54.                     GoTo Catch
  55.                 End If
  56.                 ReDim AR(1 To objCol.Count, 1 To objCol(1).SubMatches.Count) As Variant
  57.                 For j = 0 To objCol.Count - 1
  58.                     For k = 0 To objCol(0).SubMatches.Count - 1
  59.                         AR(j + 1, k + 1) = objCol(j).SubMatches(k)
  60.                     Next k
  61.                 Next
  62.             End If
  63.             
  64.             Select Case i
  65.                 Case 1
  66.                     '重新排列及修正資料以符合網頁表格所呈現樣貌
  67.                     For j = 0 To objCol.Count - 1
  68.                         AR(j + 1, 9) = AR(j + 1, 8)                            '漲跌
  69.                         AR(j + 1, 8) = AR(j + 1, 7)                            '最新市價
  70.                         AR(j + 1, 7) = AR(j + 1, 6)                            '昨收市價
  71.                         AR(j + 1, 6) = Round(AR(j + 1, 5) / AR(j + 1, 3), 4)   '漲跌幅
  72.                         AR(j + 1, 10) = Round(AR(j + 1, 9) / AR(j + 1, 7), 4)  '漲跌幅
  73.                         AR(j + 1, 11) = AR(j + 1, 8) - AR(j + 1, 4)            '折溢價
  74.                         AR(j + 1, 12) = Round(AR(j + 1, 11) / AR(j + 1, 4), 4) '幅度
  75.                     Next j
  76.                     .Range("B1").Value = "資料時間:" & Trim(objCol(0).SubMatches(11))
  77.                     With .Range(PARAM(i, 3)).Resize(UBound(AR, 1), UBound(AR, 2))
  78.                         '設定儲存格格式
  79.                         v = Split("@,@,0.00,0.00,0.00,0.00%,0.00,0.00,0.00,0.00%,0.00,0.00%", ",")
  80.                         For j = LBound(v) To UBound(v)
  81.                             .Columns(j + 1).NumberFormat = v(j)
  82.                         Next
  83.                         .Value = AR
  84.                     End With
  85.                     Erase AR
  86.                 Case 2
  87.                     For j = 0 To objCol.Count - 1
  88.                         AR(j + 1, 3) = AR(j + 1, 4)                            '指數漲跌
  89.                         AR(j + 1, 4) = Round(AR(j + 1, 3) / AR(j + 1, 2), 4)   '漲跌幅(%)
  90.                     Next
  91.                     With .Range(PARAM(i, 3)).Resize(UBound(AR, 1), UBound(AR, 2))
  92.                         '設定儲存格格式
  93.                         v = Split("@;#,##0.00;#,##0.00;0.00%", ";")
  94.                         For j = LBound(v) To UBound(v)
  95.                             .Columns(j + 1).NumberFormat = v(j)
  96.                         Next
  97.                         .Value = AR
  98.                     End With
  99.                     Erase AR
  100.                 Case Else
  101.             End Select
  102.         
  103.             '標註設定儲存格位址顏色
  104.             With .Range(PARAM(i, 4)).Interior
  105.                 .ColorIndex = 35
  106.                 .Pattern = xlSolid
  107.             End With
  108.         End With
  109.         
  110.     Next
  111.    
  112. Finally:
  113.     Set objCol = Nothing

  114.     Exit Sub
  115. Catch:

  116.     If "" <> ErrDescription Then: MsgBox ErrDescription, vbCritical
  117.     Err.Clear
  118.     Resume Finally

  119. End Sub
複製代碼

TOP

回復 15# azrael19

大大好
搞得怎麼複雜
動用了大量的 Regular Expression
很累吧

TOP

回復 15# azrael19

老人家早睡 明早又要早起外出運動 接著又要盯盤 做我參與的股(T50反1) 之成交及統計並輸入 而得到分析 故等我有空時(星期假日) 再做近一步的 "Try Run" 還請見諒 我相信您的能力(事實上證明您是高手 行家一出手 便知有沒有) 只是我個人的因素 無法即時驗證 還請見諒 希望來日能有機會回報您的幫助 (希望能在股市上幫上忙) 真的很感謝您

TOP

回復  azrael19

大大好
搞得怎麼複雜
動用了大量的 Regular Expression
很累吧
jackyq 發表於 2015-7-26 22:49


Regular Expression我自己也覺得我寫的又臭又長讓您見笑了,其實網路上有現成的JSON Parser類別可以拿來用,只是lcctno前輩希望程式只能有一個巨集,所以才用這種方式來處理

JSON Parser
https://code.google.com/p/vba-json/

TOP

回復 18# azrael19

大大莫怪,  沒笑之意
個人習慣是容易維護修改為第一
不想日後修改到挫賽

TOP

回復 8# no3-taco
回復 9# azrael19
請問兩位的ie版本,
no3-taco 提供的, MsgBox E.all.Length是多少,
  1. Loop Until E.all.Length >= IIf(i = 0, 431, 150)
複製代碼
這程式碼為何在ie8 沒問題, lcctno 的ie 無法執行.
兩位的IE 也會有這樣的問題嗎?
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 一個人不怕錯,就怕不改過,改過並不難。
返回列表 上一主題