Вариант изменения Excel VBA в теге HTML select

Недавно я разместил текст запроса vbscript в теге выбора HTML-тега . Это очень помогло мне на платформе Internet Explorer. Тем не менее, у меня есть новый проект с немного более сложным веб-сайтом. Веб-сайт имеет несколько вложенных таблиц, которые отформатированы для хранения элементов form . Моя команда и я выяснили, как получить и установить данные в большинстве элементов, кроме раскрывающегося списка ( select тег). Мы можем получить текст из раскрывающегося списка, но мы не можем изменить значение. Вместо этого все параметры очищаются, и весь снимок пуст.

Вот пересмотренная версия кода для веб-сайта, так как есть гораздо больше кода, но показан только соответствующий код:

  ...  
...
...
...
.........
...
...... </table
... ... ... ... ... ... ... --Select User-- Amy Jones (000456321) Brian Wyatt (000745632) Carl Lister (000874563) Daniel Michaels (000987456) Elizabeth Sweeny (001456321) Fran Tarris (001745632) Gail McMurphy (001874563) Hannah Barisce (001987456)

Чтобы получить текст из раскрывающегося txt_input1 , мы использовали имя class txt_input1 после размещения узла в таблице, который содержит выпадающее меню. Этот код даст нам весь список в раскрывающемся списке:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText

Я попробовал изменить значение выпадающего списка из «–Select User–» на одно из имен в списке со следующим кодом:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText = "Carl Lister"

Это привело к опустошению. Если я изменил окончание на .Value , он удаляет только «–Select User–». Он по-прежнему не меняет значение на «Carl Lister». Есть ли что-то, чего нам не хватает, когда речь идет о выборе option в выпадающем списке вложенных таблиц?

Для элемента select лучший способ изменить отображаемое значение – это «выбрать» один из элементов option который является частью меню. Для этого вы можете изменить свой код следующим образом:

 objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).childNodes(x).selected = true 

Вышеприведенный код выбирает дочерний узел (элемент option ) в индексе x и программно выбирает его, так что значение будет отображаться в элементе select . Индекс для параметров начинается с 0, поэтому для x = 0 который будет выбирать первый вариант (в данном случае, Amy Jones ).

Вы также можете упростить приведенный выше код, чтобы просто прочитать:

 objIE.Document.getElementsByClassName("txt_input1")(0).childNodes(x).selected = true 

Или вы даже можете сделать это с помощью id так как у вас есть идентификатор, назначенный в меню:

 objIE.Document.getElementById("user").childNodes(x).selected = true 

Если вы хотите выбрать имя сотрудника из выпадающего списка, вы можете просмотреть существующие параметры и найти правильный вариант (код, адаптированный из кода VBA в этом вопросе ):

 Dim el As IXMLDOMNode Dim childNode As IXMLDOMNode el = objIE.Document.getElementById("user") For Each childNode in el.ChildNodes If InStr(childNode.innerText, emplName) Then childNode.selected = true Exit For End If Next childNode 

В этом примере emplName – это любой сотрудник, которого вы хотите выбрать.

(Мой VBA немного ржавый, поэтому я прошу прощения, если какой-либо синтаксис выключен.)

Спасибо, @freginold, за вашу помощь. Моя команда и я придумали решение, которое расширяет наши уже разработанные решения.

 tdNode = 64 i = 0 For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options Q(i) = objOption.Text & "-" & objOption.Value QNm = QNm & "|" & Q(i) i = i + 1 If objOption.Selected Then strWQ = objOption.Text End If If i > 53 Then MsgBox "stuck" SetEverythingToNothing End If Next QNm = QNm & "|=" & strWQ a = 1 MyArray = Split(QNm, "|") For a = LBound(MyArray) To UBound(MyArray) If InStr(MyArray(a), UserName) Then strWQ = MyArray(a) End If Next SelQ = Mid(strWQ, InStr(strWQ, "-") + 1, Len(strWQ) - InStr(strWQ, "-")) For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options If objOption.Value = SelQ Then objOption.Selected = True objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).OnChange Else objOption.Selected = False End If Next