Как перебирать строки Excel

#excel #vba #user-interface #scripting #sap-gui

Вопрос:

Я пытаюсь создать сценарий Excel VBA, который проходит через лист Excel, извлекает отчеты из системы SAP и помещает их в определенную папку. Параметры начинаются с A10 и B10, и они помещаются в поля экрана SAP, где создается отчет и загружается в папку на моем рабочем столе. Пожалуйста, смотрите здесь ниже пример листа Excel и скриншот экрана SAP и кода, который я использую.

Скрипт отлично работает для первых параметров A10 и B10 (он извлекает отчет из системы SAP и помещает его в нужную папку), однако я хотел бы зациклить скрипт для автоматического извлечения отчетов для других параметров ниже A10 и B10 и выше (Loop Until ActiveCell.Value = "")

Кто-нибудь может мне в этом помочь? Где и как мне поместить петлю?

excel с параметрами

Код:

 'Declaring variables for sub procedures  Option Explicit Public SapGuiAuto, WScript, msgcol Public objGui As GuiApplication Public objConn As GuiConnection Public session As GuiSession  'Creating sub procedure  Sub SAPCustomerReport()  'Pointing object variables to SAP session  Set SapGuiAuto = GetObject("SAPGUI") Set objGui = SapGuiAuto.GetScriptingEngine Set objConn = objGui.Children(0) Set session = objConn.Children(0) Dim Vendor As String Dim CoCo As String Dim FolderPath As String Dim SAPOutputLayout As String  Vendor = ActiveWorkbook.ActiveSheet.Range("A10") CoCo = ActiveWorkbook.ActiveSheet.Range("B10") FolderPath = ActiveWorkbook.ActiveSheet.Range("B3") SAPOutputLayout = ActiveWorkbook.ActiveSheet.Range("B4")  'Recorded SAP Script here  session.FindById("wnd[0]").Maximize session.FindById("wnd[0]/tbar[0]/okcd").Text = "/nFBL1N" session.FindById("wnd[0]").SendVKey 0 session.FindById("wnd[0]/usr/chkX_SHBV").Selected = True session.FindById("wnd[0]/usr/chkX_MERK").Selected = True session.FindById("wnd[0]/usr/chkX_PARK").Selected = True session.FindById("wnd[0]/usr/ctxtKD_LIFNR-LOW").Text = Vendor session.FindById("wnd[0]/usr/ctxtKD_BUKRS-LOW").Text = CoCo session.FindById("wnd[0]/usr/ctxtPA_VARI").Text = SAPOutputLayout session.FindById("wnd[0]/usr/ctxtPA_VARI").SetFocus session.FindById("wnd[0]/usr/ctxtPA_VARI").CaretPosition = 12 session.FindById("wnd[0]/tbar[1]/btn[8]").Press session.FindById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = FolderPath session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = Vendor amp; CoCo amp; ".XLSX" session.FindById("wnd[1]/usr/ctxtDY_FILENAME").CaretPosition = 4 session.FindById("wnd[1]/tbar[0]/btn[11]").Press  MsgBox "Script Completed."  End Sub   

Ответ №1:

Решение может выглядеть следующим образом:

 Sub SAPCustomerReport() ... Recorded SAP Script here i = 10 do  session.FindById("wnd[0]").Maximize  session.FindById("wnd[0]/tbar[0]/okcd").Text = "/nFBL1N"  ...  session.FindById("wnd[1]/tbar[0]/btn[11]").Press  i = i   1  Vendor = ActiveWorkbook.ActiveSheet.Range("A" amp; cstr(i))  CoCo = ActiveWorkbook.ActiveSheet.Range("B" amp; cstr(i)) loop until Vendor = ""  MsgBox "Script Completed."  End Sub  

С уважением, сценарист

Комментарии:

1. спасибо, я изменил сценарий в соответствии с вашим ответом, но он по-прежнему загружает только отчет первой строки A10 и B10, а затем останавливается. Я что-то упускаю?

2. Я предполагаю , что проблема в loop until Vendor lt;gt; "" том, что это означает, что он зацикливается до Vendorlt;gt;»», поэтому обрабатывает только первую строку…

3. @SandraRossi, спасибо за ваш комментарий. Есть ли предложение о том, как изменить сценарий, чтобы он также зацикливал остальные строки (11, 12 и более)?

4. Извините, пожалуйста, попробуйте следующее: … цикл до тех пор, пока Поставщик = «»

Ответ №2:

Вы должны разделить код на процедуру, которая повторяет конфигурацию, и процедуру, которая принимает в качестве входных данных поставщика и CoCo и создает отчет.

Кроме того, я предлагаю отформатировать вашу конфигурацию (A9:B12) в виде таблицы (Лента: Вставка gt; таблица), Затем вы можете использовать объект listobject в VBA, с которым намного проще работать в отношении диапазонов и т. Д. Я назвал таблицу «tblSAPReports».

 Option Explicit  Sub createAllReports() Dim lo As ListObject Set lo = ThisWorkbook.Worksheets("Table1").ListObjects("tblSAPReports") 'adjust to your needs  Dim lr As ListRow Dim Vendor As String, CoCo As String For Each lr In lo.ListRows  Vendor = lr.Range(1, 1): CoCo = lr.Range(1, 2)  SAPCustomerReport Vendor, CoCo Next  End Sub     Public Sub SAPCustomerReport(Vendor As String, CoCo As String)  'your code 'but remove Vendor and CoCo variable and the setting of the variables  End Sub