【问题标题】:How to loop through Excel rows如何循环遍历 Excel 行
【发布时间】:2021-12-07 22:56:20
【问题描述】:

我正在尝试构建一个 Excel VBA 脚本,该脚本通过 Excel 工作表运行并从 SAP 系统中提取报告并将它们放在特定文件夹中。 参数从 A10 和 B10 开始,它们放在 SAP 屏幕字段中,在我桌面上的文件夹中创建和下载报告。 请参阅下面的 Excel 表格示例和 SAP 屏幕的屏幕截图以及我正在使用的代码。

该脚本适用于第一个参数 A10 和 B10(它从 SAP 系统中提取报告并将其放入所需的文件夹中)但是我想循环该脚本以自动提取 A10 以下其他参数的报告和B10及以上(Loop Until ActiveCell.Value = "")

有人可以帮我解决这个问题吗?我应该在哪里以及如何放置循环?

代码:

'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 & CoCo & ".XLSX"
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").CaretPosition = 4
session.FindById("wnd[1]/tbar[0]/btn[11]").Press

MsgBox "Script Completed."

End Sub

【问题讨论】:

    标签: excel vba user-interface scripting sap-gui


    【解决方案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" & cstr(i))
     CoCo = ActiveWorkbook.ActiveSheet.Range("B" & cstr(i))
    loop until Vendor = ""
    
    MsgBox "Script Completed."
    
    End Sub
    

    问候,脚本人

    【讨论】:

    • 谢谢您,我根据您的回答修改了脚本,但它仍然只下载第一行 A10 和 B10 的报告然后停止。我错过了什么吗?
    • 我猜问题出在loop until Vendor <> "",这意味着它会一直循环到 Vendor "",所以只处理第一行...
    • @SandraRossi,感谢您的评论。有没有关于如何修改脚本的建议,以便它也循环其余的行(11、12 和更多)?
    • 抱歉,请尝试以下操作:...循环直到 Vendor = ""
    【解决方案2】:

    您应该将代码拆分为一个迭代配置的例程和一个将供应商和 CoCo 作为输入并创建报告的例程。

    此外,我建议将您的配置 (A9:B12) 格式化为表格(功能区:插入 > 表格),然后您可以在 VBA 中使用 listobject - 这对于范围等更容易处理。我将表格命名为“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多