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
相关产品推荐
相关产品推荐

