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

Я создал макрос в 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 Ответ

0 голосов
/ 23 мая 2018

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

Спящий 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
...