標題:
[發問]
如何用vba執行網頁選擇檔案的功能?
[打印本頁]
作者:
PKKO
時間:
2017-1-4 17:12
標題:
如何用vba執行網頁選擇檔案的功能?
網址:
https://www.pinkoi.com/
複製代碼
這個網站可以直接用fb登入
註冊之後會有信件,打開信件有個地方可以選擇檔案如圖片
[attach]26296[/attach]
如同麻辣家族的附件的選擇檔案也是一樣,按下去之後都會停止動作,除非手動關閉該視窗,請問有如何解決這個問題呢?
[attach]26295[/attach]
但程式一旦.Click 這個選擇檔案的按鈕之後就無法動作了
必須要手動關閉該視窗才可以繼續動作
請問要如何解決這個問題呢?
PS:許多網站都有相同的這個問題,還請各位大大幫忙解決
作者:
PKKO
時間:
2017-1-4 18:19
Sub test()
'PS:要自己先用ie開啟https://www.pinkoi.com/網址
'並且用FB點選登入,不然下列語法將會找不到傳送訊息的部分,要有登入才可傳送訊息給別人
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "https://www.pinkoi.com/user/testpkko"
Do While IE.Busy Or IE.readyState <> 4: DoEvents: Loop
With IE.Document
i = 0: On Error Resume Next
For Each E In .GetElementsByTagName("A")
A = E.Text
If CStr(A) = "傳送訊息" Then
E.Click '這邊呼叫出傳送訊息的視窗
'要如何控制該視窗輸入主旨+內文+選擇檔案呢?
Call WEB_DETAIL(IE) '我用網頁元素的部分無法查不出相關資訊
End If
Next
End With
End Sub
複製代碼
Sub WEB_DETAIL(IE)
With IE
Do While .Busy Or .readyState <> 4: DoEvents: Loop
With .Document
i = 0: On Error Resume Next
For Each E In .ALL
i = i + 1
Cells(i, "a") = E.tagname
Cells(i, "b") = E.ID
Cells(i, "c") = E.Name
Cells(i, "d") = E.Value
Cells(i, "e") = E.innertext
Cells(i, "f") = E.Type
Cells(i, "g") = E.href
Cells(i, "H") = E.Text
Next
End With
End With
End Sub
複製代碼
作者:
PKKO
時間:
2017-1-5 14:59
本帖最後由 PKKO 於 2017-1-5 15:01 編輯
我已經把完整的登入程式碼以及跳出表單的程式碼都完成
但是要如何才能夠將跳出的表單輸入主旨和內文以及選擇檔案並且寄出資料呢?
[attach]26299[/attach]
Sub test()
Dim ie As Object 'SHDocVw.InternetExplorer
Set ie = CreateObject("InternetExplorer.Application")
Call login(ie) 'just for login
Call show_the_form(ie) 'My problem in here
End Sub
Sub login(ie)
ie.Visible = True
ie.Navigate "https://www.pinkoi.com/user/testpkko"
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
Dim anchorTags As Object 'MSHTML.IHTMLElementCollection
Set anchorTags = ie.document.GetElementsByTagName("A")
Dim oAnchorLoop As Object 'MSHTML.IHTMLAnchorElement
For Each oAnchorLoop In anchorTags
Dim anchorText As String
anchorText = oAnchorLoop.Text
If anchorText = ChrW(20659) & ChrW(36865) & ChrW(35338) & ChrW(24687) Then
Dim oAnchorLogon As Object 'MSHTML.IHTMLAnchorElement2
Set oAnchorLogon = oAnchorLoop
oAnchorLogon.Click
Exit For
End If
Next
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
'* so now logon form should be visible
On Error Resume Next
Dim oUserNameInput As Object 'MSHTML.IHTMLInputElement
Set oUserNameInput = ie.document.getElementById("n-login-id")
nowtime = Timer
Do While ie.Busy Or ie.readyState <> 4 Or oUserNameInput Is Nothing
DoEvents
If Timer - nowtime > 1 Then Exit Do 'Already logoin
Set oUserNameInput = ie.document.getElementById("n-login-id")
Loop
oUserNameInput.Value = "testpkko"
Dim oUserPassword As Object 'MSHTML.IHTMLInputElement
Set oUserPassword = ie.document.getElementById("n-login-password")
oUserPassword.Value = "abc123"
Dim oListElement As Object 'MSHTML.HTMLLIElement
Set oListElement = oUserNameInput.parentElement
Dim oUnorderedList As Object 'MSHTML.IHTMLUListElement
Set oUnorderedList = oListElement.parentElement
Dim oForm As Object 'MSHTML.IHTMLFormElement
Set oForm = oUnorderedList.parentElement
Dim oSubmitInputElememt As Object 'MSHTML.HTMLInputElement
Set oSubmitInputElememt = Nothing
Dim lFormChildrenLoop As Long
For lFormChildrenLoop = 1 To oForm.all.Length
If oForm.elements.Item(lFormChildrenLoop).Type = "submit" Then
Set oSubmitInputElememt = oForm.elements.Item(lFormChildrenLoop)
Exit For
End If
Next lFormChildrenLoop
If Not oSubmitInputElememt Is Nothing Then
'Stop '* get ready .....
oSubmitInputElememt.Click
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
End If
End Sub
Sub show_the_form(ie)
Application.Wait Now + TimeValue("00:00:03")
ie.Navigate "https://www.pinkoi.com/user/testpkko2" 'After login we can trip to other people website
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
With ie.document
On Error Resume Next
For Each E In .GetElementsByTagName("A")
a = E.Text
If CStr(a) = "傳送訊息" Then
E.Click '這邊會跳出寄送的表單,要如何輸入主旨以及內文和選擇檔案並按下寄送按鈕呢?
End If
Next
End With
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
Set objShell = CreateObject("Shell.Application")
Set objAllWindows = objShell.Windows
For Each ow In objAllWindows
If (InStr(1, ow, "Internet Explorer", vbTextCompare)) Then
If (InStr(1, ow.LocationURL, "https://www.google.com.tw", vbTextCompare)) Then
執行的程式碼
end if
end if
複製代碼
可以用if+搜索找出目前開啟的ie
其實我也被彈出的alert搞的精神耗弱了,好慘
作者:
singo1232001
時間:
2017-1-9 02:02
補充一下
Do While (ow.Busy And errorcount < 5)
errorcount = errorcount + 1
ow.document.writeln ("<script type=""text/javascript"">window.focus()</script>")
'For i = 1 To 50000
'Next
'ow.Visible = False
'ow.Visible = True
Application.SendKeys ("{Enter}")
Loop
複製代碼
的方式按下按鈕
作者:
singo1232001
時間:
2017-1-9 04:59
剛我做了一個測試
可能會有點幫助
常常我們在測試的時候
會因為點選了excel
所以啟用的視窗就被換到excel上面
也就會變成sendkeys 跑去excel
所以我用了一個小訣竅
程式碼是之前超級版主 這篇抓下來的
http://forum.twbts.com/thread-18950-1-3.html
Do While ie.readyState <> 4 Or ow.Busy:
DoEvents
If ie.Busy Then
ie.Visible = False ''就是從新隱藏使用視窗
ie.Visible = True ''接著又重新顯示active使用視窗
ie.document.Focus
DoEvents
Application.SendKeys "{ENTER}", True '**按下鍵
End If
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,這個對我幫助很大
二、我之前都是透過另外一個方法將網頁移到最前端(程式碼較長,您的方法更簡單了)
ie.Visible = False ''就是從新隱藏使用視窗
ie.Visible = True ''接著又重新顯示active使用視窗
ie.document.Focus
複製代碼
三、原來當按下按鈕程式碼會無法動作的時候,另外一個設定時間啟動的巨集也無法啟動(我原本也要做實驗了,省下了做實驗的時間)
您的問題我已經看到另外一篇文章,我做點實驗之後再一起回復您!
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)