现在已经在此问题上工作了一天。我有一个网络表单,其中有1套标准数据,然后输入要采购的订单项;我正在尝试在Excel中输入所有数据,并使用VBA将其传输到站点。我被困在如何“更新零件”(按钮上的文本,我需要单击该文本才能在网页上添加另一个订单项)。我还尝试了将Shift Tab移到正确位置的send键方法(只是正常移位会出现其中一个字段错误)。我对任何解决方案都满意,这是我第一次尝试将Excel链接到HTML,因此很有趣。
从我可以找到的按钮来看,它没有ID,因此我无法成功调用它。
这是我的代码(删除了网址):
Sub Login_2_Website()
Dim oHTML_Element As IHTMLElement
Dim oHTML_Element1 As IHTMLElement
Dim sURL As String
Dim aURL As String
Dim nodeList As Object
On Error GoTo Err_Clear
sURL = URL Can't be Shared
oBrowser.Silent = True
oBrowser.timeout = 60
oBrowser.Navigate sURL
oBrowser.Visible = True
Do
' Wait till the Browser is loaded
Loop Until oBrowser.ReadyState = READYSTATE_COMPLETE
Set HTMLDoc = oBrowser.Document
Set nodeList = HTMLDoc.querySelectorAll("a[onlick*='UpdatePartRow']")
HTMLDoc.all.UserName.Value = ThisWorkbook.Sheets("sheet1").Range("I1")
HTMLDoc.all.Password.Value = ThisWorkbook.Sheets("sheet1").Range("I2")
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
If oHTML_Element.Type = "submit" Then oHTML_Element.Click: Exit For
HTMLDoc.all.reason.Value = ThisWorkbook.Sheets("sheet1").Range("B1") ' selects the reason for the requisition
HTMLDoc.all.Comments.Value = ThisWorkbook.Sheets("sheet1").Range("B2") ' selects the comments to purchasing
HTMLDoc.forms("_PurchaseRequisition").getElementsByTagName("select")("RequiredMonth").Value = ThisWorkbook.Sheets("sheet1").Range("B3")
HTMLDoc.forms("_PurchaseRequisition").FireEvent ("onchange")
HTMLDoc.forms("_PurchaseRequisition").getElementsByTagName("select")("RequiredDay").Value = ThisWorkbook.Sheets("sheet1").Range("B4")
HTMLDoc.forms("_PurchaseRequisition").FireEvent ("onchange")
HTMLDoc.forms("_PurchaseRequisition").getElementsByTagName("select")("RequiredYear").Value = ThisWorkbook.Sheets("sheet1").Range("B5")
HTMLDoc.forms("_PurchaseRequisition").FireEvent ("onchange")
HTMLDoc.forms("_PurchaseRequisition").getElementsByTagName("select")("CommodityMain").Value = ThisWorkbook.Sheets("sheet1").Range("B9")
HTMLDoc.forms("_PurchaseRequisition").FireEvent ("onchange") 'Selects the commodity group
HTMLDoc.all.Quantity.Value = ThisWorkbook.Sheets("sheet1").Range("B11")
HTMLDoc.all.Description.Value = ThisWorkbook.Sheets("sheet1").Range("B12")
HTMLDoc.all.ChargedDepartment.Value = ThisWorkbook.Sheets("sheet1").Range("B13")
HTMLDoc.all.SubJobNumber.Value = ThisWorkbook.Sheets("sheet1").Range("B14")
HTMLDoc.all.AccountNumber.Value = ThisWorkbook.Sheets("sheet1").Range("B15")
HTMLDoc.all.UnitPrice.Value = ThisWorkbook.Sheets("sheet1").Range("B16")
HTMLDoc.all.CommodityMainSub.Value = ThisWorkbook.Sheets("sheet1").Range("B17")
Set nodeList = HTMLDoc.querySelectorAll("a[onlick*='UpdatePartRow']")
nodeList.Item(0).Click
nodeList.Item(0).FireEvent "onclick"
Next
' oBrowser.Refresh ' Refresh If Needed
Err_Clear:
If Err <> 0 Then
Err.Clear
Resume Next
End If
End Sub
对于登录部分,我修改了以下代码:http://vbadud.blogspot.com/2009/08/how-to-login-to-website-using-vba.html#ZiqYAtAQMHzl7x1k.99
效果很好,输入字段也是如此。
与此按钮关联的HTML段为:
<a onclick="UpdatePartRow();
chkKeepSubmitPR();
return false;" href=""></a>
<a onclick="var doc = window.document.forms[0];
UpdatePartRow();
chkKeepSubmitPR();
if (doc.OrgMatrixYes.value == "Y") {
VerifyDeptOrgMatrix();
}
return false;" href=""><img src="/Web/purchreq.nsf/UpdatePart.gif?OpenImageResource" width="72" height="25" border="0"></a>
我之所以这样做,是因为该系统很痛苦。我可以有多个宏,并让用户点击每个订单项之间的按钮,但我想尝试提供完整的解决方案。我是一名机械工程师,而我的编码经验仅限于我为简化工作而选择的工具。任何帮助或建议将超级有帮助。如果需要更多信息,请告诉我,我将尽一切可能提供帮助。谢谢!
更新:我已经尝试(请参阅代码)进行建议的更改。在编码方面,我还是一个相当完整的新手,所以请多多包涵,并感谢您尝试教我!
答案 0 :(得分:2)
您有两个a
标签元素和一个onclick
您可以使用"*"
包含运算符在attribute = value CSS选择器中获得两者,以在属性值中搜索子字符串
a[onclick*='UpdatePartRow']
您可以使用HTMLDocument对象的querySelectorAll
方法来抓取两者
Dim nodeList As Object
Set nodeList = HTMLDoc.querySelectorAll("a[onclick*='UpdatePartRow']")
对于您的示例,这两个匹配如下:
索引0
<a onclick="UpdatePartRow(); chkKeepSubmitPR(); return false;" href="">
索引1
<a onclick="var doc = window.document.forms[0]; UpdatePartRow(); chkKeepSubmitPR(); if (doc.OrgMatrixYes.value == "Y") { VerifyDeptOrgMatrix(); } return false;" href="">
您可以按索引访问nodeList,例如
nodeList.item(0).Click
nodeList.item(0).FireEvent "onclick"