Board logo

標題: [發問] 如何用vba執行網頁選擇檔案的功能? [打印本頁]

作者: PKKO    時間: 2017-1-4 17:12     標題: 如何用vba執行網頁選擇檔案的功能?

網址:
  1. https://www.pinkoi.com/
複製代碼
這個網站可以直接用fb登入
註冊之後會有信件,打開信件有個地方可以選擇檔案如圖片
[attach]26296[/attach]
如同麻辣家族的附件的選擇檔案也是一樣,按下去之後都會停止動作,除非手動關閉該視窗,請問有如何解決這個問題呢?
[attach]26295[/attach]
但程式一旦.Click 這個選擇檔案的按鈕之後就無法動作了
必須要手動關閉該視窗才可以繼續動作
請問要如何解決這個問題呢?

PS:許多網站都有相同的這個問題,還請各位大大幫忙解決
作者: PKKO    時間: 2017-1-4 18:19

  1. Sub test()
  2. 'PS:要自己先用ie開啟https://www.pinkoi.com/網址
  3. '並且用FB點選登入,不然下列語法將會找不到傳送訊息的部分,要有登入才可傳送訊息給別人
  4. Set IE = CreateObject("InternetExplorer.Application")
  5. IE.Visible = True
  6. IE.Navigate "https://www.pinkoi.com/user/testpkko"
  7. Do While IE.Busy Or IE.readyState <> 4: DoEvents: Loop
  8. With IE.Document
  9.     i = 0: On Error Resume Next
  10.     For Each E In .GetElementsByTagName("A")
  11.         A = E.Text
  12.         If CStr(A) = "傳送訊息" Then
  13.             E.Click '這邊呼叫出傳送訊息的視窗
  14.             '要如何控制該視窗輸入主旨+內文+選擇檔案呢?
  15.             
  16.             Call WEB_DETAIL(IE) '我用網頁元素的部分無法查不出相關資訊
  17.         End If
  18.     Next
  19. End With
  20. End Sub
複製代碼
  1. Sub WEB_DETAIL(IE)
  2. With IE
  3.     Do While .Busy Or .readyState <> 4: DoEvents: Loop
  4.     With .Document
  5.         i = 0: On Error Resume Next
  6.         For Each E In .ALL
  7.             i = i + 1
  8.             Cells(i, "a") = E.tagname
  9.             Cells(i, "b") = E.ID
  10.             Cells(i, "c") = E.Name
  11.             Cells(i, "d") = E.Value
  12.             Cells(i, "e") = E.innertext
  13.             Cells(i, "f") = E.Type
  14.             Cells(i, "g") = E.href
  15.             Cells(i, "H") = E.Text
  16.         Next
  17.     End With
  18. End With
  19. End Sub
複製代碼

作者: PKKO    時間: 2017-1-5 14:59

本帖最後由 PKKO 於 2017-1-5 15:01 編輯

我已經把完整的登入程式碼以及跳出表單的程式碼都完成
但是要如何才能夠將跳出的表單輸入主旨和內文以及選擇檔案並且寄出資料呢?
[attach]26299[/attach]
  1. Sub test()
  2. Dim ie As Object 'SHDocVw.InternetExplorer
  3. Set ie = CreateObject("InternetExplorer.Application")
  4. Call login(ie) 'just for login
  5. Call show_the_form(ie) 'My problem in here
  6. End Sub
  7. Sub login(ie)
  8. ie.Visible = True
  9. ie.Navigate "https://www.pinkoi.com/user/testpkko"
  10. Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop


  11. Dim anchorTags As Object 'MSHTML.IHTMLElementCollection
  12. Set anchorTags = ie.document.GetElementsByTagName("A")

  13. Dim oAnchorLoop As Object 'MSHTML.IHTMLAnchorElement
  14. For Each oAnchorLoop In anchorTags
  15.     Dim anchorText As String
  16.     anchorText = oAnchorLoop.Text
  17.     If anchorText = ChrW(20659) & ChrW(36865) & ChrW(35338) & ChrW(24687) Then
  18.         Dim oAnchorLogon As Object 'MSHTML.IHTMLAnchorElement2
  19.         Set oAnchorLogon = oAnchorLoop
  20.         oAnchorLogon.Click
  21.         Exit For
  22.     End If
  23. Next

  24. Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
  25. '* so now logon form should be visible

  26. On Error Resume Next
  27. Dim oUserNameInput As Object 'MSHTML.IHTMLInputElement
  28. Set oUserNameInput = ie.document.getElementById("n-login-id")
  29. nowtime = Timer
  30. Do While ie.Busy Or ie.readyState <> 4 Or oUserNameInput Is Nothing
  31.     DoEvents
  32.     If Timer - nowtime > 1 Then Exit Do 'Already logoin
  33.     Set oUserNameInput = ie.document.getElementById("n-login-id")
  34. Loop

  35. oUserNameInput.Value = "testpkko"

  36. Dim oUserPassword As Object 'MSHTML.IHTMLInputElement
  37. Set oUserPassword = ie.document.getElementById("n-login-password")

  38. oUserPassword.Value = "abc123"


  39. Dim oListElement As Object 'MSHTML.HTMLLIElement
  40. Set oListElement = oUserNameInput.parentElement

  41. Dim oUnorderedList As Object 'MSHTML.IHTMLUListElement
  42. Set oUnorderedList = oListElement.parentElement

  43. Dim oForm As Object 'MSHTML.IHTMLFormElement
  44. Set oForm = oUnorderedList.parentElement

  45. Dim oSubmitInputElememt As Object 'MSHTML.HTMLInputElement
  46. Set oSubmitInputElememt = Nothing

  47. Dim lFormChildrenLoop As Long
  48. For lFormChildrenLoop = 1 To oForm.all.Length

  49. If oForm.elements.Item(lFormChildrenLoop).Type = "submit" Then
  50.     Set oSubmitInputElememt = oForm.elements.Item(lFormChildrenLoop)
  51.     Exit For

  52. End If

  53. Next lFormChildrenLoop
  54. If Not oSubmitInputElememt Is Nothing Then
  55.     'Stop '* get ready .....
  56.     oSubmitInputElememt.Click
  57.     Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
  58. End If
  59. End Sub
  60. Sub show_the_form(ie)
  61. Application.Wait Now + TimeValue("00:00:03")

  62. ie.Navigate "https://www.pinkoi.com/user/testpkko2" 'After login we can trip to other people website
  63. Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
  64. With ie.document
  65. On Error Resume Next
  66. For Each E In .GetElementsByTagName("A")
  67.     a = E.Text
  68.     If CStr(a) = "傳送訊息" Then
  69.         E.Click '這邊會跳出寄送的表單,要如何輸入主旨以及內文和選擇檔案並按下寄送按鈕呢?
  70.     End If
  71. Next
  72. End With
  73. End Sub
複製代碼

作者: singo1232001    時間: 2017-1-9 01:58

本帖最後由 singo1232001 於 2017-1-9 02:00 編輯

其實,我跟你也遇到相關的問題

不過我是遇到要關閉彈出的alert警告

沒錯,目前會出現兩個問題

第一個也就是你提到的

按下click之後,程式就卡了

ptt那邊也搜過沒答案,但有一個方向

正常來說

當要按下click的上一行

好像就先call了一個autokey(類似連點程式的外掛)
並且預定一秒後按下enter

這時後,原先的程式回到click,按下

程式彈出視窗,不動了

約過一秒後,autokey的程式就會按下enter,就會繼續執行

這個部份我有猜想嘗試一招

曾經超級板主有分享過,兩個同時一起執行的vba
http://forum.twbts.com/viewthread.php?tid=6396
我在猜測這個部份會不會有辦法帶的進來處理


然後第二個問題

我們先忽略掉前面所有的步驟

直接手動開啟彈跳視窗

直接使用
ie.document.writeln ("<script type=""text/javascript"">window.focus()</script>")
的方式按下按鈕

確實按鈕也按下了

但ie也會同時卡死,

最後有個部份可以補充

並不一定要自己開啟一個新ie
  1.     Set objShell = CreateObject("Shell.Application")
  2.     Set objAllWindows = objShell.Windows

  3. For Each ow In objAllWindows
  4.     If (InStr(1, ow, "Internet Explorer", vbTextCompare)) Then
  5.         If (InStr(1, ow.LocationURL, "https://www.google.com.tw", vbTextCompare)) Then
  6.            執行的程式碼
  7.        end if
  8.    end if
複製代碼
可以用if+搜索找出目前開啟的ie


其實我也被彈出的alert搞的精神耗弱了,好慘
作者: singo1232001    時間: 2017-1-9 02:02

補充一下
  1. Do While (ow.Busy And errorcount < 5)
  2. errorcount = errorcount + 1
  3. ow.document.writeln ("<script type=""text/javascript"">window.focus()</script>")

  4. 'For i = 1 To 50000
  5. 'Next
  6. 'ow.Visible = False
  7. 'ow.Visible = True
  8. Application.SendKeys ("{Enter}")
  9. Loop
複製代碼
的方式按下按鈕
作者: singo1232001    時間: 2017-1-9 04:59

剛我做了一個測試

可能會有點幫助


常常我們在測試的時候

會因為點選了excel

所以啟用的視窗就被換到excel上面

也就會變成sendkeys 跑去excel

所以我用了一個小訣竅

程式碼是之前超級版主 這篇抓下來的
http://forum.twbts.com/thread-18950-1-3.html
  1. Do While ie.readyState <> 4 Or ow.Busy:
  2.                 DoEvents
  3.                 If ie.Busy Then
  4.                 ie.Visible = False     ''就是從新隱藏使用視窗
  5.                 ie.Visible = True      ''接著又重新顯示active使用視窗
  6.                     ie.document.Focus
  7.                     DoEvents
  8.                     Application.SendKeys "{ENTER}", True   '**按下鍵
  9.                 End If
  10.             Loop
複製代碼
我還在研究alert中...

不過線再問題是 我會使用超板的雙vba

但我不曉得怎麼把單vba call成 雙vba
作者: singo1232001    時間: 2017-1-9 05:07

回復 6# singo1232001


抱歉  我的雙vba執行還是卡住了,

第一個前導的巨集 我設定5秒後開始
我先按下了第一個巨集
第二個消警告的巨集 我設定10秒後開始
我馬上按下了第二個巨集

但是情況變成這樣
0-----------5------------10----------->
>>>>>>>>(按下click就停住)

第一個vba他跑到ie按下click
警告視窗一跳出來,
第二個倒數中的巨集也跟著卡住了 :'(
作者: PKKO    時間: 2017-1-9 22:27

回復 7# singo1232001


    非常感謝您的回答,我受益了三個部分
一、原來可以不用每次都開啟新的IE,這個對我幫助很大
二、我之前都是透過另外一個方法將網頁移到最前端(程式碼較長,您的方法更簡單了)
  1. ie.Visible = False     ''就是從新隱藏使用視窗
  2.                 ie.Visible = True      ''接著又重新顯示active使用視窗
  3.                     ie.document.Focus
複製代碼
三、原來當按下按鈕程式碼會無法動作的時候,另外一個設定時間啟動的巨集也無法啟動(我原本也要做實驗了,省下了做實驗的時間)
您的問題我已經看到另外一篇文章,我做點實驗之後再一起回復您!




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