You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel数据批量导入SAP GUI的VBScript循环问题求助

解决SAP GUI VBScript循环导入Excel数据的问题

看起来你踩了个很典型的坑——你把数组里存的单元格值当成了行号来用,这就是循环里值传不到SAP的核心原因!让我帮你拆解问题并修正代码:

问题根源分析

你这段代码里:

Do Until objExcel.Cells(i,"N").Value = ""
    ReDim Preserve arrExcelValues(x)
    arrExcelValues(x) = objExcel.Cells(i, "N").Value ' 这里存的是N列的单元格内容,不是行号i!
    i = i + 1
    x = x + 1
Loop
For Each werk in arrExcelValues
    ' 错误:werk是N列的内容,不是行号,所以objSheet.Cells(werk,"N")完全不对
    session.findById("wnd[1]/usr/ctxtRMMG1-WERKS").text = (objSheet.Cells(werk,"N").Value)

arrExcelValues里存的是Excel第N列的具体数值,而不是你需要的行号i。当你用For Each循环时,werk是这些数值,不是行号,自然无法正确读取对应行的N/O/P列数据。

修正后的代码方案

我们可以直接存储行号到数组,或者用索引循环来跟踪当前处理的行号,这里推荐更直观的索引循环方式:

Dim rowNumbers()
i = 7
x = 0
' 先收集需要处理的行号,而不是单元格值
Do Until objExcel.Cells(i,"N").Value = ""
    ReDim Preserve rowNumbers(x)
    rowNumbers(x) = i ' 存储行号i,而不是单元格内容
    i = i + 1
    x = x + 1
Loop

' 用索引循环,直接拿到对应的行号
For idx = 0 To UBound(rowNumbers)
    currentRow = rowNumbers(idx) ' 当前处理的行号
    session.findById("wnd[0]/tbar[0]/okcd").text = "mm01"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = objSheet.Cells(46,"F").Value
    session.findById("wnd[0]/usr/ctxtRMMG1_REF-MATNR").text = objSheet.Cells(46,"F").Value
    session.findById("wnd[0]/usr/ctxtRMMG1_REF-MATNR").setFocus
    session.findById("wnd[0]/usr/ctxtRMMG1_REF-MATNR").caretPosition = 8
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[1]").sendVKey 0
    
    ' 现在用currentRow(正确的行号)读取单元格数据
    session.findById("wnd[1]/usr/ctxtRMMG1-WERKS").text = objSheet.Cells(currentRow,"N").Value
    session.findById("wnd[1]/usr/ctxtRMMG1-VKORG").text = objSheet.Cells(currentRow,"O").Value
    
    session.findById("wnd[1]/usr/ctxtRMMG1_REF-WERKS").text = objSheet.Cells(6,"N").Value
    session.findById("wnd[1]/usr/ctxtRMMG1_REF-VKORG").text = objSheet.Cells(6,"O").Value
    session.findById("wnd[1]/usr/ctxtRMMG1-VKORG").setFocus
    session.findById("wnd[1]/usr/ctxtRMMG1-VKORG").caretPosition = 4
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]/tbar[0]/btn[0]").press
    session.findById("wnd[0]/tbar[0]/btn[0]").press
    
    ' 同样替换成currentRow
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP06/ssubTABFRA1:SAPLMGMM:2000/subSUB5:SAPLZMM_GINCOFIELDS:5802/ctxtMARC-PRCTR").text = objSheet.Cells(currentRow,"P").Value & objSheet.Cells(38,"P").Value
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP06/ssubTABFRA1:SAPLMGMM:2000/subSUB5:SAPLZMM_GINCOFIELDS:5802/ctxtMARC-PRCTR").setFocus
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP06/ssubTABFRA1:SAPLMGMM:2000/subSUB5:SAPLZMM_GINCOFIELDS:5802/ctxtMARC-PRCTR").caretPosition = 6
    
    ' 把重复的按钮点击改成循环,简化代码
    For pressCount = 1 To 13
        session.findById("wnd[0]/tbar[0]/btn[0]").press
    Next
    
    session.findById("wnd[1]/usr/btnSPOP-OPTION1").press
    session.findById("wnd[0]/tbar[0]/btn[15]").press
Next

额外优化建议

  • 可以添加错误处理逻辑,比如On Error Resume Next配合错误判断,避免单条数据导入失败导致整个脚本终止:
    On Error Resume Next
    ' 循环内的导入代码
    If Err.Number <> 0 Then
        ' 可以记录错误行号或内容,方便排查
        WScript.Echo "处理行" & currentRow & "时出错:" & Err.Description
        Err.Clear
    End If
    On Error GoTo 0
    

内容的提问来源于stack exchange,提问作者Marek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:31:04