返回列表 上一主題 發帖

[發問] 一個用VBA從網頁取得想要資料的寫法~

回復 16# cji3cj6xu6
詳看檔案內的程式碼

    Tset.rar (215.91 KB)
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 20# norafang
你要用IE匯入外部資料是無法用錄製,
功能表指令:資料-> 匯入外部資料,可以用錄製下來修改
19#的問題 要多看看VBA說明的 函數,方法,陳述式,屬性.來了解用法,可百尺竿頭,更近一步.
  1. Option Explicit
  2. 'Const 陳述式 宣告常數 , 其值如字面所示
  3. Sub a()
  4.     Dim x, ur As String
  5.     x = "2022"
  6.     Const url As String = "http://jsjustweb.jihsun.com.tw/z/zc/zcl/zcl_AAAA.asp.htm"
  7.     MsgBox url
  8.     ur = "http://jsjustweb.jihsun.com.tw/z/zc/zcl/zcl_" & x & ".asp.htm"
  9.     MsgBox ur
  10. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 22# norafang
VBA的經驗值太少了,需多修煉 21# 的程式碼是在說明 Const 陳述式
  1. Option Explicit
  2. Sub Test()
  3.     Dim x, ur As String, IE As Object
  4.     x = Worksheets("sheet1").Range("a1")
  5.   '  Const url As String = "http://jsjustweb.jihsun.com.tw/z/zc/zcl/zcl_AAAA.asp.htm"
  6.    ' MsgBox url
  7.     ur = "http://jsjustweb.jihsun.com.tw/z/zc/zcl/zcl_" & x & ".asp.htm"
  8.    ' MsgBox ur
  9.     Set IE = CreateObject("internetexplorer.application") '使用此方式可以免除 "設定引用項目"
  10.     With IE
  11.         .Visible = False 'True為開啟ie, False為不開啟ie
  12.         .Navigate ur
  13.         Do While .ReadyState <> 4 '等待網頁開啟
  14.             DoEvents
  15.         Loop
  16.         .ExecWB 17, 2 'Select All
  17.         .ExecWB 12, 2 'Copy selection
  18.         With Sheets("Sheet1")
  19.              .Cells.Clear
  20.             '.Cells.Select
  21.             .Range("AA1").Activate
  22.             .PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
  23.                 False, NoHTMLFormatting:=True
  24.         End With
  25.     End With
  26.     Columns("A:B").Delete
  27.     IE.Quit
  28.     MsgBox "資料複製結束"
  29. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 25# alantsai777
隔 10 秒自動更新 ?? 這網頁 間隔 5 秒自動更新!!
程式碼複製到一般模組
  1. Option Explicit
  2. Dim IE As Object
  3. Sub Ex_基本市況報導網站()
  4.     Dim A As Object, xDate As Date, EDATE As Date
  5.     Set IE = CreateObject("InternetExplorer.Application")
  6.     With IE
  7.        ' .Visible = True
  8.         .Navigate "http://mis.twse.com.tw/stock/fibest.jsp?stock=3673"
  9.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  10.     End With
  11.     Ex_副程式
  12. End Sub
  13. Private Sub Ex_副程式()
  14.     Dim A As Object, K As Integer, i As Integer, ii As Integer
  15.     With IE
  16.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  17.         Set A = .Document.getElementsByTagName("table")(1)
  18.     End With
  19.     With ActiveSheet    '可指定工作表
  20.         .UsedRange.Clear
  21.         K = 1
  22.         For i = 0 To A.Rows.Length - 1
  23.             For ii = 0 To A.Rows(i).Cells.Length - 1
  24.                 .Cells(K, ii + 1) = A.Rows(i).Cells(ii).INNERTEXT
  25.             Next
  26.             K = K + 1
  27.         Next
  28.     End With
  29.     If Time <= #1:30:00 PM# Then   '收盤時間 自行調整
  30.         Application.OnTime Time + #12:00:05 AM#, "Ex_副程式"  '間隔5秒
  31.     Else
  32.         IE.Quit
  33.     End If
  34. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2015-9-14 06:14 編輯

回復 28# aaron1059
試試看
幫你找出傳回期權資料的網址不一樣.
  1. Option Explicit
  2. Sub Ex() 'Yahoo!奇摩股市--期權
  3.     Dim ie As Object, k As Integer, S As Integer, jj As Integer, i As Integer, AA As Object
  4.     Set ie = CreateObject("InternetExplorer.Application")
  5.     ie.Navigate "https://tw.screener.finance.yahoo.net/future/aa03?opmr=optionfull&opcm=WTFO&opym=201510&random=0.01296169775357775"
  6.     ie.Visible = True
  7.     Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
  8.     Set AA = ie.Document.getelementsbytagname("table")
  9.     With Sheets(1)
  10.         .Cells.Clear
  11.         k = k + 1
  12.         For S = 0 To AA.Length - 1                 '已找出網頁的table內容在 5-7 中
  13.             For i = 0 To AA(S).Rows.Length - 1                 '資料的列位
  14.                 For jj = 0 To AA(S).Rows(i).Cells.Length - 1   '資料的欄位
  15.                     .Cells(k, jj + 1) = AA(S).Rows(i).Cells(jj).INNERTEXT
  16.                 Next
  17.                 k = k + 1
  18.              Next
  19.           Next
  20.        End With
  21.      ie.Quit
  22. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 30# bioleon69
  1. ''CreateObject("InternetExplorer.Application") 需等候網頁下載完畢速度較慢
  2. '執行迴圈讓它跑1500次,嘿速度會慢許多
  3. Option Explicit
  4. Sub 測試()
  5.     Dim oXmlhttp As Object, oHtmldoc As Object, surl, E As Object
  6.     Set oXmlhttp = CreateObject("msxml2.xmlhttp")
  7.     Set oHtmldoc = CreateObject("htmlfile")
  8.     surl = "http://norway.twsthr.info/StockHolders.aspx?stock=2330"
  9.     With oXmlhttp
  10.         .Open "Get", surl, False
  11.         .Send
  12.         oHtmldoc.write .responseText
  13.     End With
  14.     With oHtmldoc
  15.         Set E = .all.tags("TABLE")(9)
  16.     End With
  17.     Application.ScreenUpdating = False
  18.     Ex_副程式 E
  19.     Application.ScreenUpdating = True
  20. End Sub
  21. Private Sub Ex_副程式(A As Object)
  22.     Dim i As Integer, R As Integer, C As Integer
  23.     With ActiveSheet    '可指定工作表
  24.         .UsedRange.Clear
  25.         For R = 0 To 2 * 5    '讀取5筆資料 ' 雙數的A.Rows為空白資料
  26.             If R <= 1 Or R > 2 And R Mod 2 = 1 Then '剔除 雙數的A.Rows
  27.                 i = i + 1
  28.                 For C = 2 To A.Rows(R).Cells.Length - 1
  29.                     .Cells(i, C - 1) = A.Rows(R).Cells(C).innertext
  30.                 Next
  31.             End If
  32.         Next
  33.         With .UsedRange  ' CELL 為整工作表的儲存格 範圍大(費時)
  34.            ' .UsedRange 工作表有使用到的的儲存格 範圍小(省時)
  35.             .EntireRow.AutoFit
  36.             .EntireColumn.AutoFit
  37.         End With
  38.     End With
  39. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 33# bioleon69

可改用會入外部資料 .QueryTables
  1. Option Explicit
  2. Sub Ex()
  3.     With ActiveSheet.QueryTables.Add(Connection:="URL;http://mops.twse.com.tw/nas/t21/sii/t21sc03_106_3_0.html", Destination:=Range("A1"))
  4.         .WebSelectionType = xlSpecifiedTables
  5.         .WebFormatting = xlWebFormattingNone
  6.         .WebTables = "4"
  7.         .RefreshStyle = xlOverwriteCells
  8.         .WebPreFormattedTextToColumns = True
  9.         .WebConsecutiveDelimitersAsOne = True
  10.         .WebSingleBlockTextImport = False
  11.         .WebDisableDateRecognition = False
  12.         .WebDisableRedirections = False
  13.         .Refresh BackgroundQuery:=False
  14.     End With
  15. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 33# bioleon69
  1. Option Explicit
  2. Sub 測試()
  3.     Dim oXmlhttp As Object, oHtmldoc As Object, surl, E As Object
  4.     Set oXmlhttp = CreateObject("msxml2.xmlhttp")
  5.     Set oHtmldoc = CreateObject("htmlfile")
  6.     surl = "http://mops.twse.com.tw/nas/t21/sii/t21sc03_106_3_0.html"
  7.     With oXmlhttp
  8.         .Open "Get", surl, False
  9.         .Send
  10.         'oHtmldoc.write .responseText
  11.         oHtmldoc.write BinToStr(.responseBody, "BIG5") '網頁編碼 "中文"
  12.     End With
  13.     With oHtmldoc
  14.         Set E = .all.tags("TABLE")(3)
  15.     End With
  16.     Application.ScreenUpdating = False
  17.     Ex_副程式 E
  18.     Application.ScreenUpdating = True
  19. End Sub
  20. Private Sub Ex_副程式(A As Object)
  21.     Dim i As Integer, R As Integer, C As Integer
  22.     With ActiveSheet    '可指定工作表
  23.         .UsedRange.Clear
  24.         For R = 0 To A.Rows.Length - 1
  25.                 For C = 0 To A.Rows(R).Cells.Length - 1
  26.                     .Cells(R + 1, C + 1) = A.Rows(R).Cells(C).innertext
  27.                 Next
  28.         Next
  29.         With .UsedRange  ' CELL 為整工作表的儲存格 範圍大(費時)
  30.            ' .UsedRange 工作表有使用到的的儲存格 範圍小(省時)
  31.             .EntireRow.AutoFit
  32.             .EntireColumn.AutoFit
  33.         End With
  34.     End With
  35. End Sub
  36. Function BinToStr(arrBin, strChrs) As String
  37.     With CreateObject("ADODB.Stream")  '二進位文檔,傳送,儲存
  38.         .Type = 2
  39.         .Open
  40.         .Writetext arrBin
  41.         .Position = 0
  42.         .Charset = strChrs   '指定編碼
  43.         BinToStr = .ReadText
  44.         .Close
  45.     End With
  46. End Function
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 40# bioleon69
  1. Option Explicit
  2. Sub test()
  3. Dim Ie As Object, e As Object, R As Integer, C As Integer
  4.     'Set Ie = CreateObject("InternetExplorer.Application")
  5.     With CreateObject("InternetExplorer.Application")
  6.          '.Visible = True
  7.         .Navigate "http://mops.twse.com.tw/mops/web/t56sb21_q3"
  8.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  9.        '**************************************
  10.         With .Document.forms("form1")
  11.             .typek.Value = "otc"
  12.             .Year.Value = "105"
  13.             .smonth.Value = "03"
  14.             .emonth.Value = "04"
  15.         End With
  16.       ''******************************************
  17.         For Each e In .Document.ALL.TAGS("input")
  18.             If e.Type = "button" And e.Value = " 查詢 " Then e.Click
  19.         Next
  20.         '*****************************************
  21.         Do
  22.             DoEvents
  23.             Set e = .Document.ALL("TABLE01").ALL.TAGS("TABLE")(0)
  24.         Loop Until Not e Is Nothing
  25.         資料寫入 e
  26.             .Quit
  27.     End With
  28. End Sub
  29. Sub Ex()
  30.     With CreateObject("InternetExplorer.Application")
  31.         .Navigate "http://mops.twse.com.tw/mops/web/t56sb21_q3?encodeURIComponent=1&run=Y&step=1&TYPEK=sii&year=105&smonth=01&emonth=02&sstep=1&firstin=true"
  32.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  33.         資料寫入 .Document.ALL("TABLE01").ALL.TAGS("TABLE")(0)
  34.             .Quit
  35.     End With
  36. End Sub
  37. Private Sub 資料寫入(ByVal xTable As Object)
  38.     Dim R As Integer, C As Integer
  39.     With ActiveSheet
  40.             .UsedRange.Clear
  41.             Application.ScreenUpdating = False
  42.             For R = 0 To xTable.Rows.Length - 1
  43.                 For C = 0 To xTable.Rows(R).Cells.Length - 1
  44.                     .Cells(R + 1, C + 1) = xTable.Rows(R).Cells(C).INNERTEXT
  45.                 Next
  46.             Next
  47.              .UsedRange.WrapText = False
  48.              Application.ScreenUpdating = True
  49.     End With
  50. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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