返回列表 上一主題 發帖

[發問] 請問這可設定等幾秒沒開網頁或網頁錯誤就執行下一筆嗎,謝謝

本帖最後由 wufonna 於 2014-9-3 21:11 編輯

回復 15# joey0415
  1. Sub 巨集1()
  2. '
  3. ' 巨集1 巨集
  4. '

  5. '
  6.     With ActiveSheet.QueryTables.Add(Connection:= _
  7.         "URL;https://djinfo.cathaysec.com.tw/Z/ZC/ZCX/ZCXNEWCATHAYSEC.DJHTM?A=2882", _
  8.         Destination:=Range("$A$1"))
  9.         .Name = "ZCXNEWCATHAYSEC.DJHTM?A=2882"
  10.         .FieldNames = True
  11.         .RowNumbers = False
  12.         .FillAdjacentFormulas = False
  13.         .PreserveFormatting = True
  14.         .RefreshOnFileOpen = False
  15.         .BackgroundQuery = True
  16.         .RefreshStyle = xlInsertDeleteCells
  17.         .SavePassword = False
  18.         .SaveData = True
  19.         .AdjustColumnWidth = True
  20.         .RefreshPeriod = 0
  21.         .WebSelectionType = xlSpecifiedTables
  22.         .WebFormatting = xlWebFormattingNone
  23.         .WebTables = "2,3"
  24.         .WebPreFormattedTextToColumns = True
  25.         .WebConsecutiveDelimitersAsOne = True
  26.         .WebSingleBlockTextImport = False
  27.         .WebDisableDateRecognition = False
  28.         .WebDisableRedirections = False
  29.         .Refresh BackgroundQuery:=False
  30.     End With
  31. End Sub
複製代碼
請教 大大 這段如何精簡程式碼
像 table 這樣
因要從中取得收盤價
謝謝 大大

TOP

回復 19# joey0415
謝謝 大大
國泰的資料真的快多了

TOP

回復 16# GBKEE
請教 G 大大
我改了一些資料 有些資料還收不到
請 G 大 看那裡要改的
謝謝
  1. Dim ie As Object   '模組最頂端 Dim 供這模組的程序使用的變數
  2. Sub AllFile()
  3.     Dim i As Integer, v, Y As Integer, S As String
  4.     Set ie = CreateObject("internetexplorer.application")   '使用此方式可以免除 "設定引用項目"
  5.     With ie '縮小IE視窗
  6.         .Visible = True
  7.         .Width = 5
  8.         .Height = 5
  9.     End With
  10.     With 工作表1
  11.       Dim AR
  12.         AR = .Range("E1:G1")
  13.         .Range("E:G") = ""
  14.         .Range("E1:G1") = AR

  15. '        .Range("E2").CurrentRegion = ""            '清除工作表1,年度範圍
  16.         For i = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
  17.             v = .Cells(i, 1).Value
  18.             GetDividend (v)
  19.           .Cells(i, 5).Value = 工作表2.Cells(2, 2).Value
  20.            .Cells(i, 6).Value = 工作表2.Cells(2, 5).Value
  21.            GetClosePrice (v)
  22.            .Cells(i, 7).Value = 工作表3.Cells(2, 8).Value
  23.             
  24.         Next
  25.     End With
  26.     With ie  'IE視窗最大化
  27.         Application.WindowState = xlMaximized
  28.         .Height = Application.Height
  29.         .Width = Application.Width
  30.         .Quit
  31.     End With
  32. End Sub
  33. 'Private Sub GetDividend(ByVal ss As String)


  34. Private Sub GetDividend(ByVal ss As String)     '取股利網頁

  35.     Dim rr As String, T As Date, i, ii, k, j, S As Object
  36.     'On Error Resume Next '程式的執行沒有預期的錯誤,此行可不用.
  37.     T = Time
  38.     rr = "http://dj.mybank.com.tw/z/zc/zcc/zcc_" & ss & ".asp.htm"
  39.     With ie
  40.         .Navigate rr
  41.         Do While .readyState <> 4                          '等待網頁下載完畢
  42.               DoEvents
  43.               If Time >= T + #12:00:03 AM# Then            '等待8秒 3秒太少會誤錯改8妙
  44.                 DoEvents
  45.                 Application.SendKeys "~"                    '股票代號錯誤,網頁會有訊息,須按確定,才可繼續下面股票代號
  46.                
  47.                 Exit Do
  48.               End If
  49.         Loop
  50.         ''***不是等待8秒 3秒太少會誤錯改8妙 ***
  51.         Do
  52.         Set S = .Document.getElementsByTagName("table")(3) ' 新的 table 4
  53.         Loop Until Not S Is Nothing
  54.         '*** 勝一 沒捉到 ????
  55.         '*** 因程式運行太快 , S Is Nothing, S 尚未指定為.Document.getElementsByTagName("table")(4)
  56.         '*** 程式已經執行下一行, With 工作表2 的程式碼

  57.         With 工作表2
  58.             .UsedRange.Clear
  59.             For i = 0 To S.Rows.Length - 1      '寫入資料
  60.                 k = k + 1
  61.                 'For j = 0 To S.Rows(i).Length - 1  '這行是錯誤的 也是多餘的迴圈
  62.                    '用 On Error Resume Next 使程式繼續執行
  63.                     For ii = 0 To S.Rows(i).Cells.Length - 1  ' S.Rows(i).Cells.Length - 1 才是正確
  64.                     .Cells(k, ii + 1) = S.Rows(i).Cells(ii).innerText
  65.                     DoEvents
  66.                     Next
  67.                 'Next
  68.             Next
  69.         End With
  70.     End With
  71. End Sub

  72. Private Sub GetClosePrice(ByVal ss As String) ' 取收盤價網頁
  73.     Dim rr As String, T As Date, i, ii, k, j, S As Object
  74.     'On Error Resume Next '程式的執行沒有預期的錯誤,此行可不用.
  75.     T = Time
  76.     rr = "https://djinfo.cathaysec.com.tw/Z/ZC/ZCX/ZCXNEWCATHAYSEC.DJHTM?A=" & ss
  77.     With ie
  78.         .Navigate rr
  79.         Do While .readyState <> 4                          '等待網頁下載完畢
  80.               DoEvents
  81.               If Time >= T + #12:00:03 AM# Then            '等待8秒 3秒太少會誤錯改8妙
  82.                 DoEvents
  83.                 Application.SendKeys "~"                    '股票代號錯誤,網頁會有訊息,須按確定,才可繼續下面股票代號
  84.                
  85.                 Exit Do
  86.               End If
  87.         Loop
  88.         ''***不是等待8秒 3秒太少會誤錯改8妙 ***
  89.         Do
  90.         Set S = .Document.getElementsByTagName("table")(2) ' 新的 table 4
  91.         Loop Until Not S Is Nothing
  92.         '*** 勝一 沒捉到 ????
  93.         '*** 因程式運行太快 , S Is Nothing, S 尚未指定為.Document.getElementsByTagName("table")(4)
  94.         '*** 程式已經執行下一行, With 工作表2 的程式碼

  95.         With 工作表3
  96.             .UsedRange.Clear
  97.             For i = 0 To S.Rows.Length - 1      '寫入資料
  98.                 k = k + 1
  99.                 'For j = 0 To S.Rows(i).Length - 1  '這行是錯誤的 也是多餘的迴圈
  100.                    '用 On Error Resume Next 使程式繼續執行
  101.                     For ii = 0 To S.Rows(i).Cells.Length - 1  ' S.Rows(i).Cells.Length - 1 才是正確
  102.                     .Cells(k, ii + 1) = S.Rows(i).Cells(ii).innerText
  103.                     DoEvents
  104.                     Next
  105.                 'Next
  106.             Next
  107.         End With
  108.     End With
  109. End Sub
複製代碼

配息測試-3.rar (29.12 KB)

TOP

回復 22# GBKEE

感謝 GBKEE 大
程式跑了幾次都能捉到
程式碼我研究看看 不會再向 GBKEE 大大請教
謝謝 ^_^

TOP

回復 1# wufonna
改了程式內容

請教程式沒加入這段 On Error Resume Next '下行會出錯,加入這行,未知原因。 會錯誤是網頁有空格的關溪嗎?
請教大大如何修改 謝謝
  1. Option Explicit
  2. Dim ie As Object   '模組最頂端 Dim 供這模組的程序使用的變數
  3. Sub AllFile()
  4.     Dim i As Integer, v, Y As Integer, S As String
  5.     Dim z As Integer

  6.     With 工作表1
  7.         Dim AR
  8.            AR = .Range("C1:J1")
  9.           .Range("C:J") = ""
  10.           .Range("C1:J1") = AR
  11.           z = 0
  12.         For i = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
  13.      
  14.            v = .Cells(i, 1).Value
  15.             GetDividend (v)
  16.              .Cells(i, 3).Resize(1, 7).Value = 工作表2.Cells(7, 1).Resize(1, 7).Value

  17.              If 工作表2.Cells(7, 5).Value > 0 Then
  18.                .Cells(i, 10).Value = 1
  19.                z = z + 1
  20.               Else
  21.                .Cells(i, 10).Value = 0
  22.               End If
  23.                             If 工作表2.Cells(7, 5).Value > 0 And 工作表2.Cells(8, 5).Value > 0 And 工作表2.Cells(9, 5).Value > 0 Then 'K(營收連3個月正成長)
  24.                 .Cells(i, 11).Value = 1
  25.               Else
  26.                 .Cells(i, 11).Value = 0
  27.               End If
  28.         Next
  29. '            MsgBox "共有" & z & "家正成長"
  30. .Cells(1, 10).Value = "去年同期年增率" & Split(Date, "/")(1) - 1 & "月份" & .Range("A" & .Rows.Count).End(xlUp).Row & "家共有" & z & "家正成長"
  31.    
  32.     End With

  33. End Sub

  34. Public Function MyFile(v As Integer, i As Integer)
  35.   '   Dim i As Integer, v, Y As Integer, S As String

  36.     With 工作表1
  37.            .Range("C" & v & ":J" & v) = "" '清除工作表1,年度範圍
  38.            v = .Cells(i, 1).Value
  39.             GetDividend (v)
  40.              .Cells(i, 3).Resize(1, 7).Value = 工作表2.Cells(7, 1).Resize(1, 7).Value

  41.              If 工作表2.Cells(7, 5).Value > 0 Then
  42.                .Cells(i, 10).Value = 1

  43.               Else
  44.                .Cells(i, 10).Value = 0
  45.               End If
  46.               If 工作表2.Cells(7, 5).Value > 0 And 工作表2.Cells(8, 5).Value > 0 And 工作表2.Cells(9, 5).Value > 0 Then 'k (營收連3個月正成長)
  47.                 .Cells(i, 11).Value = 1
  48.               Else
  49.                 .Cells(i, 11).Value = 0
  50.               End If
  51.               
  52.     End With

  53. End Function



  54. Private Sub GetDividend(ByVal ss As String)     '取股利網頁 '2022/2/22 換這段程式碼 在 https://www.mobile01.com/topicdetail.php?f=511&t=4737630&p=3 的21樓
  55. Dim URL, HTMLsourcecode, GetXml, Table
  56. Dim i As Integer, j As Integer
  57. Set HTMLsourcecode = CreateObject("htmlfile")
  58. Set GetXml = CreateObject("msxml2.xmlhttp")
  59. URL = "http://pscnetinvest.moneydj.com.tw/z/zc/zch/zch_" & ss & ".djhtm"
  60. With GetXml
  61. .Open "GET", URL, False
  62. .setRequestHeader "Cache-Control", "no-cache"
  63. .setRequestHeader "Pragma", "no-cache"
  64. .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
  65. .send

  66. HTMLsourcecode.body.innerhtml = .responsetext
  67. On Error Resume Next '下行會出錯,加入這行,未知原因。
  68. Set Table = HTMLsourcecode.all.tags("table")(2).Rows
  69. For i = 0 To Table.Length - 1
  70. For j = 0 To Table(i).Cells.Length - 1
  71. 工作表2.Cells(i + 1, j + 1) = Table(i).Cells(j).innertext
  72. Next j
  73. Next i
  74. End With
  75. Set HTMLsourcecode = Nothing
  76. Set GetXml = Nothing
  77. End Sub
複製代碼

Annualrate-2022.rar (105.34 KB)

TOP

回復 25# quickfixer


    謝謝 大大 ,我有用
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     Application.EnableEvents = False
  3.         If Target(1).Column = 1 And Target(1).Address(0, 0) <> "A1" Then          '在第1列
  4.             If Target(1).Value <> "" Then
  5.             
  6. '         MsgBox Target(1).Address(0, 0) & vbCrLf & vbCrLf & Target(1).Value & vbCrLf & vbCrLf & Target(1).Row
  7.             Call MyFile(Target(1).Value, Target(1).Row)
  8.             End If
  9.         End If
  10.     Application.EnableEvents = True

  11. End Sub
複製代碼
抓取個別的資料
想請教有程式取代
On Error Resume Next '下行會出錯,加入這行,未知原因。
這段程式碼嗎

TOP

本帖最後由 wufonna 於 2022-2-13 17:20 編輯

回復 28# quickfixer


    謝謝 大大
之前程式可跑完,可能這兩天營收更新,網頁才有缺少資料,等網頁更新完在下載看看。
加了程式碼程式有跑完。

Image 1.jpg (145.4 KB)

Image 1.jpg

TOP

回復 28# quickfixer


    謝謝 大大
修改
  1. Sub test()
  2. Debug.Print Date
  3. '修改1月的前一個月便0
  4. If Split(Date, "/")(1) - 1 = 0 Then
  5. Debug.Print 12
  6. Else
  7. Debug.Print Split(Date, "/")(1) - 1
  8. End If

  9. End Sub
複製代碼

TOP

        靜思自在 : 不要小看自己,因為人有無限的可能。
返回列表 上一主題