Начните с упрощения имеющегося сценария, разбив его на более мелкие компоненты. Например, создайте функцию для входа в систему, особенно если вы собираетесь начать создавать несколько разных функций.
Public Function StartSAPSession() as Variant
' Enter your script here for logging in and starting a new session
'....
' Return the session
Set StartSAPSession = Connection.Children(0)
End Function
Я бы объявил объект сеанса глобально, чтобы при каждом запуске макроса вам не приходилось входить в систему и открывать новый сеанс. Обратите внимание, что использование сеанса в качестве нижнего регистра упростит копирование и вставку из регистратора сценариев SAP GUI.
Public session as Variant
Затем наступает момент "делать" то, что вы ищете ...
Предположим, у вас есть Table1 с 3 полями, которые нужно запросить; Номер документа, код компании и финансовый год. Мы будем циклически проходить по каждой строке в этой таблице. Мы также предполагаем, что количество документов может меняться для каждого.
Мы проверяем, существует ли сессия (если не создала), заполняем поля запроса, просматриваем вложения через контекстное меню и скачиваем их.
Примечание. В настоящее время у меня нет доступа к экземпляру SAP, поэтому у меня нет возможности проверить это. Он был адаптирован из предыдущих инструментов, которые я скомпилировал. Это должно будет пройти и сделать некоторое тестирование. Я также обычно проводил много тестов, чтобы понять возможные ошибки, а затем найти способы их эффективной обработки.
Во всяком случае, здесь вы идете ...
Public Function ExtractDocuments()
Dim Arr() as Variant
Dim DocNum as String
Dim Company as String
Dim FY as String
Dim AttCnt as Integer
Dim i as Long
Dim j as Long
' When session is Nothing then we need to create a new session
' else assume we can re-use the session
If session Is Nothing Then
Set session = StartSAPSession
End If
' Load the table as an Array, this will be faster
Arr = Range("Table1").ListObject.DataBodyRange
' Cycle through each row of the table (Arr)
For i = 1 to Ubound(Arr, 1)
' Start by loading the row you will enter
DocNum = Arr(i, 1)
Company = Arr(i, 2)
FY = Arr(i, 3)
With session
.findById("wnd[0]").maximize
.StartTransaction "FB03" ' Load the transaction you are after
.findById("wnd[0]/usr/txtRF05L-BELNR").Text = DocNum
.findById("wnd[0]/usr/ctxtRF05L-BUKRS").Text = Company
.findById("wnd[0]/usr/txtRF05L-GJAHR").Text = FY
.findById("wnd[0]").sendVKey 0 ' Execute transaction
' The query runs and you select context menu and attachments
.findById("wnd[0]/titl/shellcont/shell").pressContextButton "%GOS_TOOLBOX"
.findById("wnd[0]/titl/shellcont/shell").selectContextMenuItem "%GOS_VIEW_ATTA"
' How many attachments are there? If 1 or more then save each.
AttCnt = .findById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").RowCount
If AttCnt > 0 Then
For j = 0 to AttCnt -1
.findById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").selectedRows = j
.findById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").pressToolbarButton "%ATTA_EXPORT"
Next j
.findById("wnd[1]/tbar[0]/btn[0]").press ' Exit the Attachments window
End If
End With
Next i
End Function
Существует также больше возможностей разбить это далее на дополнительные подпрограммы и функции, чтобы сделать его более читабельным и многократно используемым.
Удачи!