Вопрос или проблема
Мне нужно найти и открыть соответствующий процессный заказ для каждой доставки. Я нашел список процессных заказов в DRB (см. скриншот ниже). Теперь я хочу открыть каждый заказ отдельно, но немного застрял.
Я подумал пройтись по каждой строке и проверить, если текст содержит ‘Процессный заказ’. Есть ли техническое название для конкретной строки? Это было бы идеально, если бы я использовал разные языки, иначе мне нужно будет указать каждый перевод в моей условной функции. Я думал сделать это так, но, к сожалению, это не сработало:
Set tree = session.findById("wnd[0]/usr/cntlBROWSER/shellcont/shell/shellcont[1]/shell[1]")
Set ListNodeKeys = tree.GetAllNodeKeys
For Each nodeKey In ListNodeKeys
nodeText = tree.GetNodeTextByKey(nodeKey)
If nodeText = "Процессный заказ" Then
tree.doubleClickNode
End If
Next nodeKey
У кого-нибудь есть лучшее решение для этого?
Ответ или решение
Для решения вашей задачи, связанной с перебором узлов и открытием соответствующих процессных заказов в VBA, необходимо учитывать несколько моментов. Ваша основная цель состоит в том, чтобы пройти через все узлы и открыть те, которые соответствуют процессному заказу.
Ваша начальная реализация была близка к правильной, однако есть небольшие недоработки, которые мы исправим. Вот более детализированное решение на русском языке:
Sub OpenProcessOrders()
Dim tree As Object
Dim ListNodeKeys As Variant
Dim nodeKey As Variant
Dim nodeText As String
' Получаем доступ к дереву узлов
Set tree = session.findById("wnd[0]/usr/cntlBROWSER/shellcont/shell/shellcont[1]/shell[1]")
ListNodeKeys = tree.GetAllNodeKeys
' Проходим по всем узлам
For Each nodeKey In ListNodeKeys
nodeText = tree.GetNodeTextByKey(nodeKey)
' Проверяем, соответствует ли текст узла "Process Order"
' Можно использовать и Like оператор для частичного совпадения
If InStr(1, nodeText, "Process Order", vbTextCompare) > 0 Then
' Двойной клик по узлу для его открытия
tree.DoubleClickNode nodeKey
' Здесь можно добавить задержку, если требуется, для успешной загрузки страницы
Application.Wait Now + TimeValue("00:00:01") ' 1 секунда задержки
End If
Next nodeKey
End Sub
Объяснение кода:
-
Объект дерева:
Set tree = session.findById(...)
– здесь мы получаем доступ к элементу, содержащему дерево узлов. -
Получение узлов:
ListNodeKeys = tree.GetAllNodeKeys
– данный метод возвращает все ключи узлов, которые вы сможете перебрать. -
Цикл For Each: Каждый узел перебирается по очереди, и его текст извлекается с помощью
GetNodeTextByKey
. -
Проверка текста узла: Вместо точного сравнения текста, в этом примере используется
InStr
для проверки наличия подстроки "Process Order" в названии узла, что делает код более универсальным для обработки различных языков. -
Двойной щелчок:
tree.DoubleClickNode nodeKey
– открывает соответствующий процессный заказ. -
Ожидание (опционально): Иногда вы можете столкнуться с проблемами, если не дать системе время для завершения операций. Использование
Application.Wait
позволяет вставить небольшую задержку после открытия каждого узла.
Заключение:
Этот код должен помочь вам автоматически пройтись по списку и открыть все узлы, которые содержат текст "Process Order", независимо от языка. Не забудьте протестировать код в вашем конкретном приложении и внести необходимые корректировки в идентификаторы элементов, если это необходимо.