Макро-цикл IBM iSeries AS400 VBscript не завершается, несмотря на выполнение условия выхода

Я создал макрос в VBA для нашей среды IBM iSeries / AS400 / green screen, который находит номера позиций в заказах на покупку, а затем изменяет их цену и выходит из заказа на покупку. Внутри макроса есть цикл, используемый для анализа каждой строки заказа на покупку, а затем перехода на следующую страницу строк, если номер не найден на первой странице. Вот код для цикла:

'ItemNum and Price are entered by the user within Excel
Do Until IBMItemNum = ItemNum
    If NumRow = 11 Then
        'There are ten lines within purchase orders, after which one must page down
        'to see the rest of the purchase order. This is where the problem occurs
        autECLSession.autECLPS.SendKeys "[pagedn]"
        NumRow = 1
    End If
    IBMItemNum = autECLSession.autECLPS.GetText(NumRow, 2, 5)
    If IBMItemNum = ItemNum Then
        autECLSession.autECLPS.SetCursorPos NumRow, 66
        autECLSession.autECLPS.SendKeys Price
        autECLSession.autECLPS.SendKeys "[field+]"
        autECLSession.autECLPS.SendKeys "[enter]"
        'After the item has been found and the price entered, the macro exits the PO
        'Entering PageDown after the PO has been exited crashes the AS400 session
        Exit Do
    Else
        'Check the next row
        NumRow = NumRow + 1
    End If
Loop

Этот макрос может успешно читать каждое число на первой странице заказа на покупку подряд, если и только если я удаляю команду PageDown SendKeys из цикла. Однако, даже если ItemNum является первым IBMItemNum в PO, макрос не выйдет из цикла и переместится вниз (что также означает, что цикл повторяется более 10 раз). В моем коде чего-то не хватает для условия выхода?

1 ответ

Вам нужно будет задержать после autECLSession.autECLPS.SendKeys "[enter]", Это даст экрану время для обновления.

Sleep API идеален Sleep 250 остановит ваш код на 500 миллисекунд (1/2 секунды).

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Самый простой способ - использовать большую задержку. В качестве альтернативы, вы можете использовать меньшие задержки и использовать GetText чтобы увидеть, обновился ли экран.

'ItemNum and Price are entered by the user within Excel
Do
    If NumRow = 11 Then
        'There are ten lines within purchase orders, after which one must page down
        'to see the rest of the purchase order. This is where the problem occurs
        autECLSession.autECLPS.SendKeys "[pagedn]"
        NumRow = 1
    End If
    IBMItemNum = autECLSession.autECLPS.GetText(NumRow, 2, 5)
    If IBMItemNum = ItemNum Then
        autECLSession.autECLPS.SetCursorPos NumRow, 66
        autECLSession.autECLPS.SendKeys Price
        autECLSession.autECLPS.SendKeys "[field+]"
        autECLSession.autECLPS.SendKeys "[enter]"
        Sleep 500
        'After the item has been found and the price entered, the macro exits the PO
        'Entering PageDown after the PO has been exited crashes the AS400 session
        Exit Do 'Not needed
    Else
        'Check the next row
        NumRow = NumRow + 1
    End If
    DoEvents

Loop Until IBMItemNum = ItemNum
Другие вопросы по тегам