返回列表 上一主題 發帖

[發問] [請教]個股成交資訊以VBA擷取之問題...

[發問] [請教]個股成交資訊以VBA擷取之問題...

各位大大請教一下:

我想從證交所的個股日成交資訊擷取資料,
希望是能夠由EXCEL表格內輸入"股票代碼"&"年"&"月",來更新data,

以下巨集是參考別人的寫法進行修改,
但是一直沒辦法將資料抓進來,
請問各位大大是巨集有哪裡寫錯了嗎?
還是可以有更好的寫法???

謝謝!!
  1. Sub 個股日成交資訊()
  2. '
  3.     Dim ptxt As String
  4.     Dim STK_NO, myear, mmon
  5.     myear = InputBox("輸入查詢民國年", "個股日成交資訊")
  6.     If myear = "" Then Exit Sub
  7.     mmon = InputBox("輸入查詢月", "個股日成交資訊")
  8.     If mmon = "" Then Exit Sub
  9.         STK_NO = InputBox("輸入個股代碼", "個股日成交資訊")
  10.     If STK_NO = "" Then Exit Sub
  11.     With ActiveSheet.QueryTables.Add(Connection:= _
  12.         "URL;http://www.twse.com.tw/ch/trading/exchange/STOCK_DAY/STOCK_DAYMAIN.php" _
  13.         , Destination:=Range("A1"))
  14.         .PostText = "ajax=true&myear=" & myear & "&mmon=" & mmon & "&STK_NO=" & STK_NO
  15.         .PreserveFormatting = False
  16.         .RowNumbers = False
  17.         .FillAdjacentFormulas = False
  18.         .RefreshOnFileOpen = False
  19.         .BackgroundQuery = True
  20.         .RefreshStyle = xlInsertDeleteCells
  21.         .SavePassword = False
  22.         .SaveData = True
  23.         .AdjustColumnWidth = True
  24.         .RefreshPeriod = 0
  25.         .WebSelectionType = xlSpecifiedTables
  26.         .WebFormatting = xlWebFormattingNone
  27.         .WebTables = "8"
  28.         .WebPreFormattedTextToColumns = True
  29.         .WebConsecutiveDelimitersAsOne = True
  30.         .WebSingleBlockTextImport = False
  31.         .WebDisableDateRecognition = False
  32.         .WebDisableRedirections = False
  33.         .Refresh BackgroundQuery:=False
  34.             
  35.     End With
  36. End Sub
複製代碼
新手上路

回復 1# cudui


    Sub 個股日成交資訊()
'
'
    Dim ptxt As String
    'Dim STK_NO, mmon As String
    myear = InputBox("輸入查詢民國年", "個股日成交資訊")
   
    If myear = "" Then
       Exit Sub
    Else
       myear = myear + 1911
    End If
    mmon = InputBox("輸入查詢月,1-9月需補0如02月", "個股日成交資訊")
    If mmon = "" Then Exit Sub
   
    STK_NO = InputBox("輸入個股代碼", "個股日成交資訊")
    If STK_NO = "" Then Exit Sub
           
    mym = myear & mmon
     With ActiveSheet.QueryTables.Add(Connection:= _
         "URL;http://www.twse.com.tw/ch/trading/exchange/STOCK_DAY/genpage/Report" & mym & "/" & mym & "_F3_1_8_" & STK_NO & ".php?STK_NO=" & STK_NO & "&myear=" & myear & "&mmon=" & mmon _
        , Destination:=Range("A1"))
'
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingAll
        .WebTables = "8"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
           
   
End Sub

     試試看吧!!

TOP

回復 2# chen_cook


謝謝大大, 我有試過可行了!!

另外請問...
以下這二種寫法的意義有不同嗎?
為啥第一種就得不出data呢?是不是少寫什麼??
(第二種比較看得懂,因為寫IQY時也是以連到相同的URL去抓data)
  1.     With ActiveSheet.QueryTables.Add(Connection:= _
  2.         "URL;http://www.twse.com.tw/ch/trading/exchange/STOCK_DAY/STOCK_DAYMAIN.php" _
  3.         , Destination:=Range("A1"))
  4.         .PostText = "ajax=true&myear=" & myear & "&mmon=" & mmon & "&STK_NO=" & STK_NO
複製代碼
  1.      With ActiveSheet.QueryTables.Add(Connection:= _
  2.          "URL;http://www.twse.com.tw/ch/trading/exchange/STOCK_DAY/genpage/Report" & mym & "/" & mym & "_F3_1_8_" & STK_NO & ".php?STK_NO=" & STK_NO & "&myear=" & myear & "&mmon=" & mmon _
  3.         , Destination:=Range("A1"))
  4. '
複製代碼
新手上路

TOP

各位大大再請教一下,
如果要設定成資料是縱向插入 (執行巨集後,插入新資料,而原資料向下移)
該怎麼設定呢???

TKS!
新手上路

TOP

回復 3# cudui


    你原始的HTTP:段不是產生資料後的網頁,當然抓不到啊!!!

TOP

回復 4# cudui


    這資料是會變動的(如果不是個整月),所以應該當資料來源,在另一個sheet套入(或其它欄位套用資料)...
    請上傳你的檔案吧!!版大會協助的!!!

TOP

回復 6# chen_cook


    謝謝大大~
   我還是小學生,所以只能看不能收也不能傳~~>_<

   我的想法是來源資料每次執行巨集都在同一個sheet新增,&排序&刪除相同列,
   再到別的sheet去進行運用,
   這樣比較不會開太多sheet...
   又或執行一次巨集,就能一次撈到個股近4~5個月的成交行情,
   只是"跨年"的寫法對小學生來說就有點難了...(ex 101.3月/2月/1月 , 100年12月/11月)
新手上路

TOP

回復 7# cudui

試了ActiveCell.Offset的指令,
這樣就可以解決資料向下延伸,
只剩如何寫出 連續抓幾個月(含自動判別"跨年")的問題了!!
  1.         
  2.    lastdata = Range("A65536").End(xlUp).Select   
  3.    
  4.     mym = myear & mmon
  5.      With ActiveSheet.QueryTables.Add(Connection:= _
  6.          "URL;http://www.twse.com.tw/ch/trading/exchange/STOCK_DAY/genpage/Report" & mym & "/" & mym & "_F3_1_8_" & STK_NO & ".php?STK_NO=" & STK_NO & "&myear=" & myear & "&mmon=" & mmon _
  7.         ,Destination:=ActiveCell.Offset(3, 0))
複製代碼
新手上路

TOP

回復 8# cudui


    For .. next 迴圈配合你的 Offest,,可以達成你要的結果??如何做先自己想吧!!!
    不懂你的連續5個月的意思 .. 如果是本次抓取為起始的話 mmon + 1 推進,同是判斷是否大於12進位年 myear + 1..
    應該在決定這個vba的用途時,就將想法設定好...版大只會依你的問題提出可行的作法,當然還有更好的寫法(我也只是懂一點,剛好你的問題我看的懂).....   
    目前你只抓上市,若是上櫃呢??它就不是那麼容易,要去爬文找答案.....
     股票代號若錯誤是抓不到database??這部份你想到了嗎??

TOP

回復 9# chen_cook


    謝謝cook提醒..
    上市上櫃的行情,我都有找到iqy的寫法,
    所以只剩下翻譯成vba的語法,有了可參考的寫法,後面的延伸就容易多了...
    由於data來自證交所和櫃買,就不用擔心個股代號正確與否的問題~~

    之所以data要能往前推5個月(以個股日成交行情為例),是為了要能夠算出平均線、乖離率等參數...
    因為別人的寫法都要每天更新才行,一中斷就很麻煩,
    所以才想要找方法補足...

    小學生的程度差得太多,
    只好每前進一點,就爬爬文、想想寫法...
    現在都是找不到人問的,才會貼上來問問版大~~
新手上路

TOP

        靜思自在 : 唯其尊重自己的人,才更勇於縮小自己。
返回列表 上一主題