Поскольку вы используете браузер IE, у вас есть доступ к более широкому диапазону селекторов, включая некоторые псевдо-классы css-селекторов например. nth-of-type (и в конце я касаюсь :last-child
). Это в отличие от того, что можно применить, используя метод .querySelector
объекта HTMLDocument
, через MSHTML
.
Итак, для вашего показанного HTML вы можете начать с захвата интересующей строки (та, которая показана с красными и синими прямоугольниками) с помощью селектора nth-of-type
, чтобы выбрать строку по тегу tr
n-го вхождения с родительской таблицей, идентифицированной как id (# - это селектор идентификатора ).
Давайте посмотрим, как выглядит эта строка при сопоставлении с точки зрения возвращаемых элементов:

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

Теперь давайте разберем это, чтобы включить дочерние элементы td
(ячейка таблицы) в эту строку, используя комбинатор-потомок и селектор элемента td
:

Выше теперь вы можете видеть все ячейки таблицы в этой строке и использовать атрибуты, которые вы видите, или положение, или их комбинацию, для нацеливания на интересующие элементы (ячейки таблицы).
Например, если вы заранее знаете дату своего красного понедельника 7-го числа, вы можете использовать атрибут celldate
для назначения и добавить его в цепочку селекторов:
#tblTimeSheet_tblMain tr:nth-of-type(4) td[celldate='1/7/2019']

Если дата неизвестна, вы можете снова использовать позицию и использовать индекс nth-of-type
для ячейки td
с этой строкой tr
(обратите внимание, что это base-1, а не 0):
#tblTimeSheet_tblMain tr:nth-of-type(4) td:nth-of-type(7)

Это похоже на синтаксис столбца x
row y
.
Селекторы css, показанные выше, применяются .querySelector
методом ie.document
, например,
ie.document.querySelector("#tblTimeSheet_tblMain tr:nth-of-type(4) td:nth-of-type(7)").value = "xyx"
или
ie.document.querySelector("#tblTimeSheet_tblMain tr:nth-of-type(4) td:nth-of-type(7)").innerText = "xyx"
Я не могу проверить это с помощью браузера и библиотек vba, но я знаю, что поддерживается nth-of-type
, а также attribute = селекторы значений и потомки комбинаторов .
В этом случае стоит знать, что также поддерживается селектор last-child , и, поскольку вы ссылаетесь на последнюю строку tr
, вы также можете использовать:
#tblTimeSheet_tblMain tr:last-child td:nth-of-type(7)
Другие примечания:
- Чем длиннее селектор, тем медленнее будет. Хотя с современными браузерами вы говорите о крошечных различиях в производительности.
- Кроме того, наиболее правым является ключевой селектор, и он должен быть максимально избирательным, например. Селектор идентификатора, если это возможно, в противном случае селектор класса ... порядок выбора задокументирован. Все должно быть как можно более избирательным, но важно помнить о чтении справа налево.
- Это
#tblTimeSheet_tblMain tr:nth-of-type(4) td:nth-of-type(7)
должно быть похоже на цепочку следующим образом: ie.document.getElementById("tblTimeSheet_tblMain").getElementsByTagName("tr")(4).getElementsByTagName("td")(7)
, но более производительно.
Подробнее о производительности и выборе селектора здесь . Выдержки:
