Board logo

標題: [發問] (EXCEL VBA問題)請問怎樣用QueryTable抓取網頁資料? [打印本頁]

作者: paul3063    時間: 2017-12-30 17:25     標題: (EXCEL VBA問題)請問怎樣用QueryTable抓取網頁資料?

(EXCEL VBA問題)請問怎樣用QueryTable抓取網頁資料?
網址:www.twse.com.tw/exchangeReport/MI_INDEX?response=html&date=20171229&type=ALLBUT0999
我需要的是中間部份
106年12月29日每日收盤行情(全部(不含權證、牛熊證))

使用錄製巨集方式

sub test()

With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.twse.com.tw/exchangeReport/MI_INDEX?response=html& date =20171229&type=ALLBUT0999" _
        , Destination:=Range("A1"))
        .Name = "MI_INDEX?response=html&date=20171229&type=ALLBUT0999"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "5"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

將其中的日期20171229改為
" & Range("a1") & Range("b1") & Range("c1") & "
卻發現不可行
a1,b1,c1分別輸入2017,12,27
出現的還是20171229的

不知道問題出在那裡?
作者: GBKEE    時間: 2018-1-1 07:22

本帖最後由 GBKEE 於 2018-1-1 07:25 編輯

回復 1# paul3063
  1. =html& date =
複製代碼
網址錯誤傳回最近一天的資料,,需沒有空格
  1. =html&date=
複製代碼
  1. http://www.twse.com.tw/exchangeReport/MI_INDEX?response=html&date=" & Range("A1") & Range("B1") & Range("C1") & "&type=ALLBUT0999"
複製代碼

作者: paul3063    時間: 2018-1-2 22:56

回復 2# GBKEE


GBKEE大,連這種差一個空白鍵的錯誤都找得出來,您真的是太厲害了。
另外,想再問一下,如果想把日期輸入改用INUTBOX方式,程式碼要怎樣修改?
作者: GBKEE    時間: 2018-1-3 08:35

回復 3# paul3063
  1. Option Explicit
  2. Sub EX()
  3.     Dim xDay As String
  4.     xDay = InputBox("輸入日期", "大盤統計資訊日期", Date)
  5.     If IsDate(xDay) Then
  6.         If Weekday(xDay, vbMonday) < 6 Then
  7.             xDay = Format(xDay, "yyyymmdd")
  8.             With ActiveSheet.QueryTables.Add(Connection:= _
  9.                 "URL;http://www.twse.com.tw/exchangeReport/MI_INDEX?response=html& date =" & xDay & "&type=ALLBUT0999" _
  10.                 , Destination:=Range("A1"))
  11.                 '
  12.                 '
  13.             End With
  14.         Else
  15.             MsgBox xDay & "  假日沒營業"
  16.         End If
  17.     Else
  18.         MsgBox "日期輸入錯誤"
  19.     End If
  20. End Sub
複製代碼

作者: paul3063    時間: 2018-1-4 17:42

回復 4# GBKEE

GBKEE大,試過了,好像不行,執行巨集,沒有反應。
作者: paul3063    時間: 2018-1-5 19:26

回復 4# GBKEE


GBKEE大,檔案網址如下請下載,
Download Page Link
https://www.sendspace.com/file/onxcag
作者: paul3063    時間: 2018-1-6 20:02

回復 4# GBKEE


    GBKEE大,檔案已上傳,[attach]28208[/attach]
作者: rogersg    時間: 2018-1-6 20:21

修改抓取表格參數你試看看

Sub Ex()
        Dim xDay As String
        xDay = InputBox("輸入日期", "大盤統計資訊日期", Date)
        If IsDate(xDay) Then
            If Weekday(xDay, vbMonday) < 6 Then
                xDay = Format(xDay, "yyyymmdd")
                With ActiveSheet.QueryTables.Add(Connection:= _
                    "URL;http://www.twse.com.tw/exchangeReport/MI_INDEX?response=html&date=" & xDay & "&type=ALLBUT0999" _
                    , Destination:=Range("A1"))
                    .WebFormatting = xlNone
                    .RefreshStyle = xlInsertDeleteCells
                    .AdjustColumnWidth = True
                    .Refresh BackgroundQuery:=True
                End With
            Else
                MsgBox xDay & "  假日沒營業"
            End If
        Else
            MsgBox "日期輸入錯誤"
        End If
    End Sub
作者: paul3063    時間: 2018-1-6 20:59

回復 8# rogersg


rogersg大,可以了,萬分感謝。

您跟GBKEE大的程式碼只多了
.WebFormatting = xlNone
                    .RefreshStyle = xlInsertDeleteCells
                    .AdjustColumnWidth = True
                    .Refresh BackgroundQuery:=True
想不到竟然可行,真是令人訝異。
作者: paul3063    時間: 2018-1-7 00:44

回復 9# paul3063


題外話,
其實中間有試著將巨集改成
Sub test()
X = InputBox()
With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.twse.com.tw/exchangeReport/MI_INDEX?response=html&date=" & X & "&type=ALLBUT0999" _
        , Destination:=Range("A1"))


結果出現,
編譯錯誤:引數不為選擇性
所以才又問了GBKEE大後面的問題

總之,謝謝GBKEE大跟rogersg大
作者: GBKEE    時間: 2018-1-7 06:14

回復 10# paul3063

附檔中的程式碼完全與#4的程式碼一樣當然不行的.
#4給的程式碼是要導引你套進你#1所錄製的sub test()中
  1. '註解符號
  2. ''''註解符號
  3. '******
複製代碼


多了解程式碼才會融慣通的




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)