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

VBA遍历SAP节点:展开Sales Order后打开Process Order遇阻求助

批量处理DRB文档树中Process Order的VBA解决方案

问题概述

需求为给每个交货单查找并打开对应Process Order,从DRB文档树中批量提取指定字段内容。当前代码存在两个核心问题:

  • 展开“Sales Order”节点后,无法打开其子节点中的Process Order,但单独运行打开代码可正常生效
  • 未处理窗口切换后的会话冲突,可能导致后续操作失效

原代码

Set tree = session.findById("wnd[0]/usr/cntlBROWSER/shellcont/shell/shellcont[1]/shell[1]")
Set ListNodeKeys = tree.getallnodekeys

For Each nodeKey In ListNodeKeys
 nodeText = tree.GetNodeTextByKey(nodeKey)
 If nodeText = "Sales Order" Then
    tree.expandNode (nodeKey)
 End If
Next nodeKey

For Each nodeKey In ListNodeKeys
    nodeText = tree.GetNodeTextByKey(nodeKey)
    If nodeText = "Process Order" Then
        tree.selectNode (nodeKey)
        tree.doubleClickNode (nodeKey)
        testExtract = session.findById("wnd[0]/usr/tabsTABSTRIP_5115/tabpKOZE/ssubSUBSCR_5115:SAPLCOKO:5120/ctxtAFPOD-KDPOS").Text
        MsgBox testExtract
    End If
Next nodeKey

问题原因

  1. 节点集合未更新:第一次调用getallnodekeys时,“Sales Order”处于折叠状态,其子节点(Process Order)未被纳入返回的节点列表。展开后第二次遍历仍使用旧集合,自然无法找到目标节点。
  2. 窗口会话冲突:双击打开Process Order后,当前会话切换到详情页,后续操作原文档树会因窗口上下文变化失效。

修正后的代码

Set tree = session.findById("wnd[0]/usr/cntlBROWSER/shellcont/shell/shellcont[1]/shell[1]")

' 1. 展开所有Sales Order节点
For Each nodeKey In tree.getallnodekeys
    If tree.GetNodeTextByKey(nodeKey) = "Sales Order" Then
        tree.expandNode nodeKey
    End If
Next nodeKey

' 2. 重新获取展开后的完整节点集合
Set updatedNodeKeys = tree.getallnodekeys

' 3. 遍历处理每个Process Order并提取字段
For Each nodeKey In updatedNodeKeys
    If tree.GetNodeTextByKey(nodeKey) = "Process Order" Then
        tree.selectNode nodeKey
        tree.doubleClickNode nodeKey
        
        ' 提取指定字段内容
        Dim extractedValue As String
        extractedValue = session.findById("wnd[0]/usr/tabsTABSTRIP_5115/tabpKOZE/ssubSUBSCR_5115:SAPLCOKO:5120/ctxtAFPOD-KDPOS").Text
        
        ' 可选:将结果存入工作表(替换MsgBox实现批量存储)
        ' Sheets("结果表").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = extractedValue
        
        ' 返回原DRB文档树窗口,保证后续操作正常
        session.findById("wnd[0]/tbar[0]/btn[3]").press
    End If
Next nodeKey

关键优化点

  • 动态更新节点集合:展开Sales Order后重新调用getallnodekeys,确保获取到所有子节点
  • 恢复窗口上下文:提取字段后点击返回按钮,回到原文档树窗口,避免会话冲突
  • 增强扩展性:将弹窗输出替换为工作表写入逻辑,适配批量数据存储需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:05:11