Выбор кнопки HTML в Excel VBA, которая не имеет идентификатора

Работал над этим вопросом уже целый день. У меня есть веб-форма, у вас есть 1 набор стандартных данных, а затем вы вводите позиции для заявки; Я пытаюсь ввести все данные в Excel и использовать VBA для передачи его на сайт. Я зациклился на том, как «обновить часть» (текст на кнопке, которую мне нужно щелкнуть, чтобы добавить еще одну позицию на веб-странице). Я также попробовал метод send key для Shift Tab в нужное место (только обычное смещение запускается в ошибку с одним из полей). Я отлично справляюсь с любым решением, это моя первая попытка связать Excel с HTML, так что это было весело.

Из того, что я могу найти, кнопка не имеет идентификатора, поэтому мне не удалось назвать ее.

Вот мой код (с удалением веб-url):

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 == &quot;Y&quot;) {
    VerifyDeptOrgMatrix();
}


return false;" href=""><img src="/Web/purchreq.nsf/UpdatePart.gif?OpenImageResource" width="72" height="25" border="0"></a>  

Я беру это, потому что эта система - боль. Я мог бы просто иметь несколько макросов, и пользователь нажимал кнопку между каждой позицией, но я хочу попытаться предложить полное решение. Я инженер-механик по профессии, и мой опыт в области кодирования ограничивается тем, что я взял, чтобы сделать инструменты для облегчения моей работы. Любая помощь или предложения были бы очень полезны. Если есть больше информации, пожалуйста, дайте мне знать, и я могу попытаться помочь в любом случае. Спасибо!

Обновление: я попробовал (см. Код), чтобы внести изменения, которые были предложены. Я все еще довольно полный новичок, когда дело доходит до кодирования, поэтому, пожалуйста, медведь со мной и благодарю вас за то, что вы научили меня!

Всего 1 ответ


У вас есть два элемента тега с помощью onclick

Вы можете получить оба с помощью атрибута = значение селектора CSS, используя "*" содержит модификатор для поиска подстроки в значении атрибута

a[onclick*='UpdatePartRow']

Вы можете захватить оба метода querySelectorAll объекта HTMLDocument

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 == &quot;Y&quot;) { VerifyDeptOrgMatrix(); } return false;" href="">

введите описание изображения здесь

Вы можете получить доступ к nodeList по индексу, например

nodeList.item(0).Click
nodeList.item(0).FireEvent "onclick"

Есть идеи?

10000