Предпосылка: Я автоматизирую процесс ручного ввода данных в продукт эмуляции терминала (BlueZone) с использованием VBA. Как пользователь переднего плана я имею ограниченные команды и снимаю данные с экрана (с экраном копирования и вставкой в Excel), чтобы сделать определения и остановить запуск в случае возникновения ошибки. Данные связаны со складскими запасами, и есть проблемы с соответствием - поэтому важно, чтобы были проверки, чтобы гарантировать целостность.
В настоящее время у меня есть рабочий l oop, но мне нужно, чтобы он повторялся каждые 10 строк. Другими словами, мне нужно:
1) Перейти к связанному экрану эмуляции
2) Введите данные заголовка
3) Введите 10 продуктов с корректировочными суммами - начать в строке 5
4) Зафиксировать запись
5) Начать снова с (1) в строке 15
Я попытался безуспешно:
For i = 1 to 3000 Step 10 '3000 same range defined as object in current for each
Скриншоты системы и форма ввода пользователя:
Sub IISAB_DuuEet()
Dim bzhao As Object
Set bzhao = CreateObject("BZWhll.WhllObj")
bzhao.Connect ""
Dim myLoc, Prod, Adj_Dir, Adj_Qty As Variant
Dim RC As String 'Reason Code
Dim Julian As Integer 'Julian Date
Dim myRange As Range
Set myRange = Worksheets("Inventory_Adjustment").Range("A5:A3000") 'Entire range
RC = Sheets("Inventory_Adjustment").Range("A2").Value
Julian = Sheets("Inventory_Adjustment").Range("B2").Value
'--------------------------------------BLOCK 1----------------------------------------------
'********BLOCK 1 must occur only when i=1 of 10********'
'Navigar a IISAB y preparate
bzhao.SendKey "<PF3>"
bzhao.Wait 0.2
bzhao.SendKey "IISAB"
bzhao.Wait 0.2
bzhao.SendKey "<ENTER>"
bzhao.Wait 0.2
bzhao.SendKey "A"
bzhao.Wait 0.2
bzhao.SendKey RC
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Julian
bzhao.Wait 0.2
bzhao.SendKey "<TAB><TAB><TAB><TAB>"
'--------------------------------------BLOCK 2----------------------------------------------
'********BLOCK 2 must occur for all i = 1 to 10********'
'Begin L00P on location>Prod>(+/-)>Qty 10x
For Each myLoc In myRange
'Si hay un blanco ya
If myLoc = "" Then
Exit For
End If
Prod = myLoc.Offset(0, 1).Value
Adj_Dir = myLoc.Offset(0, 2).Value
Adj_Qty = myLoc.Offset(0, 3).Value
'Begin adjusts
bzhao.SendKey myLoc
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.5
'Check product
bzhao.Copy 32
Range("I1").Select
ActiveSheet.Paste
bzhao.Wait 0.2
'First flag "ERROR" on screen
If Range("D1").Value = "ERROR" Then
myLoc.Offset(0, 4).Value = "ERROR"
MsgBox ("Error")
Exit For
End If
'Second flag product match what populated for the location
If myLoc.Offset(0, 6).Value = "PASS" Then
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Adj_Qty
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Adj_Dir
bzhao.Wait 0.2
myLoc.Offset(0, 4).Value = "ENTERED"
Else 'ERROR, bomb out
myLoc.Offset(0, 4).Value = "ERROR"
MsgBox ("Error")
Exit For
End If
Next myLoc
'After 10th iteration -
'1) Commit inventory adjustments
'2) Start i=1 again with Block 1 and enter 10 more products
'--------------------------------------------------------------------------------------
End Sub
Попытка с шагом 10 - я удалил рабочий For Each.
Sub IISAB_DuuEet2()
Dim bzhao As Object
Set bzhao = CreateObject("BZWhll.WhllObj")
bzhao.Connect ""
Dim myLoc, Prod, Adj_Dir, Adj_Qty As Variant
Dim RC As String 'Reason Code
Dim Julian As Integer 'Julian Date
Dim myRange As Range
Set myRange = Worksheets("Inventory_Adjustment").Range("A5:A3000") 'Entire range
RC = Sheets("Inventory_Adjustment").Range("A2").Value
Julian = Sheets("Inventory_Adjustment").Range("B2").Value
'--------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------
'Begin L00P on location>Prod>(+/-)>Qty 10x
For i = 1 To 3000 Step 10
myLoc = Cells(i, 0).Value 'DEBUG object define error
'Si hay un blanco ya
If myLoc = "" Then
Exit For
End If
If i = 1 Then 'Enter screen info AND first line
bzhao.SendKey "<PF3>"
bzhao.Wait 0.2
bzhao.SendKey "IISAB"
bzhao.Wait 0.2
bzhao.SendKey "<ENTER>"
bzhao.Wait 0.2
bzhao.SendKey "A"
bzhao.Wait 0.2
bzhao.SendKey RC
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Julian
bzhao.Wait 0.2
bzhao.SendKey "<TAB><TAB><TAB><TAB>"
Prod = myLoc.Offset(0, 1).Value
Adj_Dir = myLoc.Offset(0, 2).Value
Adj_Qty = myLoc.Offset(0, 3).Value
'Begin adjusts
bzhao.SendKey myLoc
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.5
'Check product
bzhao.Copy 32
Range("I1").Select
ActiveSheet.Paste
bzhao.Wait 0.2
'First flag "ERROR" on screen
If Range("G2").Value = "ERROR" Then
myLoc.Offset(0, 4).Value = "ERROR"
MsgBox ("Error")
Exit For
End If
'Second flag product match what populated for the location
If myLoc.Offset(0, 6).Value = "PASS" Then
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Adj_Qty
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Adj_Dir
bzhao.Wait 0.2
myLoc.Offset(0, 4).Value = "ENTERED"
Else 'ERROR, bomb out
myLoc.Offset(0, 4).Value = "ERROR"
MsgBox ("Error")
Exit For
End If
End If 'end i=1 if
Prod = myLoc.Offset(0, 1).Value
Adj_Dir = myLoc.Offset(0, 2).Value
Adj_Qty = myLoc.Offset(0, 3).Value
'Begin adjusts
bzhao.SendKey myLoc
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.5
'Check product
bzhao.Copy 32
Range("I1").Select
ActiveSheet.Paste
bzhao.Wait 0.2
'First flag "ERROR" on screen
If Range("G2").Value = "ERROR" Then
myLoc.Offset(0, 4).Value = "ERROR"
MsgBox ("Error")
Exit For
End If
'Second flag product match what populated for the location
If myLoc.Offset(0, 6).Value = "PASS" Then
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Adj_Qty
bzhao.Wait 0.2
bzhao.SendKey "<TAB>"
bzhao.Wait 0.2
bzhao.SendKey Adj_Dir
bzhao.Wait 0.2
myLoc.Offset(0, 4).Value = "ENTERED"
Else 'ERROR, bomb out
myLoc.Offset(0, 4).Value = "ERROR"
MsgBox ("Error")
Exit For
End If
Next i
'--------------------------------------------------------------------------------------
End Sub