Html 当按钮没有“名称”关联时,使用 Excel VBA 单击 Internet Explorer 中的按钮
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28153744/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Use Excel VBA to click on a button in Internet Explorer, when the button has no "name" associated
提问by excelguigui11
I'm trying to use excel to automate the value entering in a time sheet. The time sheet is on a web page. Right now I'm able to load the page, enter my username and password and then entering the time sheet by itself. See code below.
我正在尝试使用 excel 自动输入时间表中的值。时间表在网页上。现在我可以加载页面,输入我的用户名和密码,然后自己输入时间表。请参阅下面的代码。
At this point I need to click on a button to open sub-forms. I can't know in advance how many sub-forms there will be to open. I know how to click on a button when it has a "name". But in this case there's none. So my updated code below use a loop to open every other subform. It works the first time, but when I do it again
此时我需要单击一个按钮来打开子表单。我无法提前知道将要打开多少个子表单。我知道如何在按钮具有“名称”时单击它。但在这种情况下,没有。所以我下面更新的代码使用循环打开所有其他子表单。它第一次工作,但当我再次这样做时
Could someone point me how to determine how many of those button there is in the page and how to click on each? Following I'm placing the code I have until now and below it, the HTML code of the page I need to interact with.
有人能指出我如何确定页面中有多少个按钮以及如何点击每个按钮吗?下面我将我现在拥有的代码放在它下面,我需要与之交互的页面的 HTML 代码。
Private Sub time_sheet_filling()
Dim I As Long
Dim IE As Object
Dim doc As Object
Dim objElement As Object
Dim objCollection As Object
' Create InternetExplorer Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
' Send the form data To URL As POST binary request
IE.navigate "http://timesheet.cccc.ca/timesheet/"
' Wait while IE loading...
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
'Load the logon page
Set objCollection = IE.Document.getElementsByTagName("input")
I = 0
While I < objCollection.Length
If objCollection(I).Name = "txtUserName" Then
' Set text to enter
objCollection(I).Value = "6666"
End If
If objCollection(I).Name = "txtPwd" Then
' Set text for password
objCollection(I).Value = "password"
End If
If objCollection(I).Type = "submit" And objCollection(I).Name = "btnSubmit" Then ' submit button clicking
Set objElement = objCollection(I)
End If
I = I + 1
Wend
objElement.Click ' click button to load the form
' Wait while IE re-loading...
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
' Show IE
IE.Visible = True
Dim links, link
Dim n, j
Set links = IE.Document.getElementById("dgTime").getElementsByTagName("a")
n = links.Length
For j = 0 To n - 1 Step 2
links(j).Click
'I have some operations to be done will post another question for this
IE.Document.getElementById"DetailToolbar1_lnkBtnSave").Click 'save
IE.Document.getElementById"DetailToolbar1_lnkBtnCancel").Click 'close
Next
End Sub
So extract of the html code is below. I'm trying to click the button that is coded in the last line of the html code below
所以 html 代码的摘录如下。我正在尝试单击下面 html 代码的最后一行中编码的按钮
<table width="984" class="Grid" id="dgTime" border="1" rules="all" cellspacing="0">
<tbody>
<tr class="GridHeader">
</tr>
<tr class="GridItem">
</tr>
<tr class="GridItem">
<td class="GridButtonColumn">
<a href="javascript:__doPostBack('dgTime$_ctl2$_ctl0','')">
<img src="images/toolbar/b_edit.gif">
</a>
</td
Tx Tim for the answers. Now I'm able to select the first subform button to open it.
Tx Tim 的答案。现在我可以选择第一个子表单按钮来打开它。
links(j).click 'j = 0
I then save it, close, and come back to the main form. But then when I try to do
然后我保存它,关闭,然后回到主窗体。但是当我尝试做
links(j).click 'j = 2 this time
the second time I get a runtime error 70: permission denied. Anymore kind help will be so appreciated. Regards
我第二次收到运行时错误 70:权限被拒绝。任何更多的帮助将不胜感激。问候
回答by excelguigui11
With the kind help from Tim Williams, I finally figured out the last détails that were missing. Here's the final code below.
在蒂姆·威廉姆斯的帮助下,我终于找到了最后遗漏的细节。这是下面的最终代码。
Private Sub Open_multiple_sub_pages_from_main_page()
Dim i As Long
Dim IE As Object
Dim Doc As Object
Dim objElement As Object
Dim objCollection As Object
Dim buttonCollection As Object
Dim valeur_heure As Object
' Create InternetExplorer Object
Set IE = CreateObject("InternetExplorer.Application")
' You can uncoment Next line To see form results
IE.Visible = True
' Send the form data To URL As POST binary request
IE.navigate "http://webpage.com/"
' Wait while IE loading...
While IE.Busy
DoEvents
Wend
Set objCollection = IE.Document.getElementsByTagName("input")
i = 0
While i < objCollection.Length
If objCollection(i).Name = "txtUserName" Then
' Set text for search
objCollection(i).Value = "1234"
End If
If objCollection(i).Name = "txtPwd" Then
' Set text for search
objCollection(i).Value = "password"
End If
If objCollection(i).Type = "submit" And objCollection(i).Name = "btnSubmit" Then ' submit button if found and set
Set objElement = objCollection(i)
End If
i = i + 1
Wend
objElement.Click ' click button to load page
' Wait while IE re-loading...
While IE.Busy
DoEvents
Wend
' Show IE
IE.Visible = True
Set Doc = IE.Document
Dim links, link
Dim j As Integer 'variable to count items
j = 0
Set links = IE.Document.getElementById("dgTime").getElementsByTagName("a")
n = links.Length
While j <= n 'loop to go thru all "a" item so it loads next page
links(j).Click
While IE.Busy
DoEvents
Wend
'-------------Do stuff here: copy field value and paste in excel sheet. Will post another question for this------------------------
IE.Document.getElementById("DetailToolbar1_lnkBtnSave").Click 'save
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now) 'wait
Loop
IE.Document.getElementById("DetailToolbar1_lnkBtnCancel").Click 'close
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now) 'wait
Loop
Set links = IE.Document.getElementById("dgTime").getElementsByTagName("a")
j = j + 2
Wend
End Sub
回答by Tim Williams
IE.Document.getElementById("dgTime").getElementsByTagName("a")(0).Click
EDIT: to loop through the collection (items should appear in the same order as they are in the source document)
编辑:循环遍历集合(项目应以与源文档中相同的顺序出现)
Dim links, link
Set links = IE.Document.getElementById("dgTime").getElementsByTagName("a")
'For Each loop
For Each link in links
link.Click
Next link
'For Next loop
Dim n, i
n = links.length
For i = 0 to n-1 Step 2
links(i).click
Next I
回答by QHarr
CSS selector:
CSS 选择器:
Use a CSS selector of img[src='images/toolbar/b_edit.gif']
使用 CSS 选择器 img[src='images/toolbar/b_edit.gif']
This says select element(s) with img
tag with attribute src
having value of 'images/toolbar/b_edit.gif'
这表示选择带有img
标签的元素,其属性src
值为'images/toolbar/b_edit.gif'
CSS query:
CSS查询:
VBA:
VBA:
You can apply the selector with the .querySelector
method of document
.
您可以使用.querySelector
方法应用选择器document
。
IE.document.querySelector("img[src='images/toolbar/b_edit.gif']").Click