VBA – Проход по различным узлам и их открытие

Вопрос или проблема

Мне нужно найти и открыть соответствующий процессный заказ для каждой доставки. Я нашел список процессных заказов в 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

Объяснение кода:

  1. Объект дерева: Set tree = session.findById(...) – здесь мы получаем доступ к элементу, содержащему дерево узлов.

  2. Получение узлов: ListNodeKeys = tree.GetAllNodeKeys – данный метод возвращает все ключи узлов, которые вы сможете перебрать.

  3. Цикл For Each: Каждый узел перебирается по очереди, и его текст извлекается с помощью GetNodeTextByKey.

  4. Проверка текста узла: Вместо точного сравнения текста, в этом примере используется InStr для проверки наличия подстроки "Process Order" в названии узла, что делает код более универсальным для обработки различных языков.

  5. Двойной щелчок: tree.DoubleClickNode nodeKey – открывает соответствующий процессный заказ.

  6. Ожидание (опционально): Иногда вы можете столкнуться с проблемами, если не дать системе время для завершения операций. Использование Application.Wait позволяет вставить небольшую задержку после открытия каждого узла.

Заключение:

Этот код должен помочь вам автоматически пройтись по списку и открыть все узлы, которые содержат текст "Process Order", независимо от языка. Не забудьте протестировать код в вашем конкретном приложении и внести необходимые корректировки в идентификаторы элементов, если это необходимо.

Оцените материал
Добавить комментарий

Капча загружается...