Board logo

標題: [發問] IE已設定.Visible仍跳出網頁 [打印本頁]

作者: smart3135    時間: 2020-1-21 23:35     標題: IE已設定.Visible仍跳出網頁

請教一下各位VBA高手,利用VBA程式開啟網頁操作這個我會
網頁也設定Visible=False了,但同樣程式碼在不同電腦執行時
卻會有不同結果,有時網頁會跳出來,有時則不會
這讓我還蠻困惑的,因為每次網頁跳出的時候,VBA程式都會出錯
是需要做什麼設定還是可以加入什麼程式碼,讓網頁百分之百不會跳出
希望有高手可以幫忙解惑一下,非常感謝。
  1. Sub test()
  2. Set IE = CreateObject("InternetExplorer.Application")
  3.     With IE
  4.         .Visible = True
  5.         .Navigate "https://www.tpex.org.tw/web/stock/statistics/monthly/st44.php?l=zh-tw"
  6.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  7.     End With
  8. End Sub
複製代碼

作者: adrian_9832    時間: 2020-1-22 07:58

我一直認為 excel vba 控制網頁 都不是一個明智的決定
因為網路上的教學 不多 而且對剛入手的用戶複雜
我之前也需要好像你那樣的需要
我嘗試了python  比我想像中容易用 跟理解  如果允許 你可以試試
作者: smart3135    時間: 2020-1-25 00:02

本帖最後由 smart3135 於 2020-1-25 00:06 編輯
我一直認為 excel vba 控制網頁 都不是一個明智的決定
因為網路上的教學 不多 而且對剛入手的用戶複雜
我 ...
adrian_9832 發表於 2020-1-22 07:58

您好,我知道python其實很好用,只是因為公司在工作上只能使用EXCEL
沒辦法另外裝其他軟件,所以也沒辦法用python,目前是爬了幾天Google大神
僅有在http://coding-warehouse.logdown.com/posts/193504-get-ie找到解決方法
但公司的電腦這樣設定不是很恰當,有試過在程式碼中加入IE.Quit或Set IE=Nothing
依舊會出錯,不知是否還有其他方式

執行程式碼出錯
[attach]31665[/attach]

目前唯一找到的解決方法
[attach]31666[/attach]
作者: joey0415    時間: 2020-1-25 16:22

請教一下各位VBA高手,利用VBA程式開啟網頁操作這個我會
網頁也設定Visible=False了,但同樣程式碼在不同電 ...
smart3135 發表於 2020-1-21 23:35
  1. Sub test()
  2.     年 = 2019
  3.     股票代碼 = 1259
  4.     Cells.Clear
  5.     Dim oXML As Object
  6.     Set oXML = CreateObject("WinHttp.WinHttpRequest.5.1")

  7.     Dim oHTML As Object
  8.     Set oHTML = CreateObject("HTMLFile")

  9.     With oXML
  10.         .Open "POST", "https://www.tpex.org.tw/web/stock/statistics/monthly/result_st44.php?l=zh-tw", 0
  11.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded;"
  12.         .setRequestHeader "Origin", "https://www.tpex.org.tw"
  13. '        .send "ajax=true&l=zh-tw&yy=2020&input_stock_code=1258"
  14.         .send "ajax=true&l=zh-tw&yy=" & 年 & "&input_stock_code=" & 股票代碼
  15.         oHTML.body.innerHTML = convertraw(.responseBody, "UTF-8")
  16.         Debug.Print oHTML.body.innerHTML
  17.     End With

  18.     Dim oTable As Object, oRow As Object, oCell As Object
  19.     Dim i As Integer, j As Integer

  20.     Set oTable = oHTML.getElementsByTagName("table")(2)
  21.     i = 1
  22.     For Each oRow In oTable.Rows
  23.         j = 1
  24.         For Each oCell In oRow.Cells
  25.             Cells(i, j).Value = oCell.innerText
  26.             j = j + 1
  27.         Next oCell
  28.     i = i + 1
  29.     Next oRow

  30.     Set oHTML = Nothing
  31.     Set oXML = Nothing
  32. End Sub

  33. Function convertraw(rawdata, char)
  34.     Dim rawstr
  35.     Set rawstr = CreateObject("adodb.stream")
  36.     With rawstr
  37.       .Type = 1
  38.       .Mode = 3
  39.       .Open
  40.       .Write rawdata
  41.       .Position = 0
  42.       .Type = 2
  43.       .Charset = char
  44.       convertraw = .ReadText
  45.       .Close
  46.     End With
  47.     Set rawstr = Nothing
  48. End Function
複製代碼

作者: adrian_9832    時間: 2020-1-25 16:49

https://play.google.com/books/reader?id=ejyeDwAAQBAJ&hl=zh_TW&pg=GBS.PA22

你可以試下看下這本書   可能有些幫助的 playstore 有試閱,

至於最後我跟你一樣的問題 我偷偷在自己的電腦安裝 python  解決了 哈哈  我弄好馬上就把 匯出成EXE  然後解除安裝了
作者: smart3135    時間: 2020-1-30 22:02

回復 4# joey0415
Joey大,不好意思,不是很懂您這段程式碼,不知能不能套用在我的程式碼呢?
  1. Sub 工單總數回報()
  2. Set IE = CreateObject("InternetExplorer.Application")
  3.     With IE
  4.         .Visible = False
  5.        .Navigate "公司網址"
  6.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop

  7.         With .Document
  8.                 .ALL("dFrom").Value = "2020/01/05"    '開始日期
  9.                 .ALL("dTo").Value = "2020/01/11"    '結束日期
  10.                 For Each E In .GetElementsBytagName("INPUT")
  11.                     If E.Value = "查詢" Then
  12.                         E.Click
  13.                         Exit For
  14.                     End If
  15.                 Next
  16. '                .ALL("查詢").Click       '按下查詢鍵
  17.             End With
  18.             Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  19.             .execwb 17, 2
  20.             .execwb 12, 2

  21.         With ActiveSheet
  22.             .Cells.Delete
  23.             .[a1].Select
  24.             .PasteSpecial Format:="Unicode 文字", Link:=False, DisplayAsIcon:= _
  25.             False, NoHTMLFormatting:=True
  26.         End With
  27.     End With
  28. End Sub
複製代碼

作者: joey0415    時間: 2020-1-31 12:15

本帖最後由 joey0415 於 2020-1-31 12:17 編輯
回復  joey0415
Joey大,不好意思,不是很懂您這段程式碼,不知能不能套用在我的程式碼呢?
smart3135 發表於 2020-1-30 22:02

https://www.tpex.org.tw/web/stock/statistics/monthly/result_st44.php?l=zh-tw

上面的程式碼可以抓網頁
也可以指定日期

網頁的抓取法分成

IE法與XMLHTTP等幾大類
我採用XMLHTTP,你自己看程式碼修改看看
如果是公司內網,我沒有看到網桃無法給意見
作者: jcchiang    時間: 2020-2-3 12:51

回復 1# smart3135
你提出的這段程式我也有使用,並沒有你說的情況
而在不同電腦執行有時會出現異常,是不是因為電腦效能不同,網頁開啟的速度差異造成
因為有些網頁並無法使用"Do While .Busy Or .ReadyState <> 4: DoEvents: Loop"判斷網頁是否已完整開啟
建議可增加Application.Wait Now + TimeValue("00:00:30"),多等待一些時間
而IE.Quit & Set IE=Nothing請加於程式最後面




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