告别重复劳动:用Excel VBA+SAP GUI脚本,5分钟搞定批量物料价格查询(CKM3N实战)

news2026/5/8 9:43:07
告别重复劳动用Excel VBASAP GUI脚本实现批量物料价格查询自动化1. 痛点场景与解决方案概述财务和成本会计人员每月都要面对一项耗时且容易出错的任务批量查询成百上千个物料的成本价格。传统手动操作SAP CKM3N事务码的方式每个物料需要重复执行登录、输入、查询、记录等步骤效率低下且容易出错。典型痛点表现每月需要处理500物料时手动操作耗时4-6小时人工输入容易导致数据错误或遗漏不同工厂/期间查询需要重复切换条件结果记录到Excel仍需二次手工整理我们开发的自动化解决方案整合了Excel VBA和SAP GUI Scripting技术实现端到端的流程自动化Excel作为操作界面和数据处理中心VBA控制整个流程逻辑SAP GUI Scripting实现与SAP系统的交互自动化的数据查询、抓取和回填2. 技术准备与环境配置2.1 SAP GUI脚本功能启用在开始前需确保SAP系统已启用脚本功能 检查SAP脚本是否可用 On Error Resume Next Set SapGuiAuto GetObject(SAPGUI) If Err.Number 0 Then MsgBox 请先安装SAP GUI并启用脚本功能, vbCritical Exit Sub End If启用步骤SAP登录后按AltF12打开脚本录制器点击更多→设置→勾选启用脚本保存设置后重启SAP GUI2.2 Excel VBA环境配置在Excel中启用开发工具和宏功能文件→选项→自定义功能区→勾选开发工具开发工具→宏安全性→启用所有宏按AltF11打开VBA编辑器添加对SAP脚本库的引用工具→引用→勾选SAP GUI Scripting API关键配置代码Sub EnableVBAEnvironment() Application.AutomationSecurity msoAutomationSecurityLow Application.TrustAccessToVBOM True End Sub3. 核心自动化流程实现3.1 主程序架构设计Sub Main_CKM3N_Query() 1. 初始化 Dim wb As Workbook, ws As Worksheet Set wb ThisWorkbook Set ws wb.Sheets(物料清单) 2. 连接SAP If Not ConnectToSAP() Then Exit Sub 3. 读取物料清单 Dim materialList As Variant materialList GetMaterialList(ws) 4. 批量查询 BatchQuerySAP materialList 5. 结果处理 ProcessResults ws End Sub3.2 SAP登录与会话控制智能登录函数Function ConnectToSAP() As Boolean On Error Resume Next Set SapGuiAuto GetObject(SAPGUI) Set application SapGuiAuto.GetScriptingEngine Set connection application.Children(0) Set session connection.Children(0) If session Is Nothing Then MsgBox SAP登录失败请检查连接状态, vbExclamation ConnectToSAP False Else session.findById(wnd[0]).maximize ConnectToSAP True End If End Function3.3 物料数据批量查询实现核心查询逻辑Sub QuerySingleMaterial(session As Object, plant As String, material As String, year As String, period As String) 输入事务码 session.findById(wnd[0]/tbar[0]/okcd).Text /nckm3n session.findById(wnd[0]).sendVKey 0 设置查询条件 session.findById(wnd[0]/usr/ctxtMLKEY-WERKS_ML_PRODUCTIVE).Text plant session.findById(wnd[0]/usr/ctxtMLKEY-MATNR).Text material session.findById(wnd[0]/usr/txtMLKEY-BDATJ).Text year session.findById(wnd[0]/usr/txtMLKEY-POPER).Text period 执行查询 session.findById(wnd[0]/tbar[1]/btn[13]).press 刷新按钮 获取结果数据 ExtractPriceData session End Sub3.4 价格数据提取技术多货币类型价格抓取Sub ExtractPriceData(session As Object) Dim priceData(1 To 5) As Variant 公司代码货币 session.findById(wnd[0]/usr/cmbMLKEY-CURTP).Key 10 priceData(1) session.findById(wnd[0]/usr/txtCKMLCR-STPRS).Text 标准价格 priceData(2) session.findById(wnd[0]/usr/txtCKMLCR-PEINH).Text 价格单位 集团公司货币 session.findById(wnd[0]/usr/cmbMLKEY-CURTP).Key 30 priceData(3) session.findById(wnd[0]/usr/txtCKMLCR-STPRS).Text 获取成本组件 priceData(4) GetCostComponents(session) 返回数据 Return priceData End Sub4. 高级功能实现4.1 多线程查询优化对于大批量查询可采用异步处理提升效率Sub AsyncBatchQuery(materialList As Variant) Dim i As Long, maxThread As Integer maxThread 4 根据电脑性能调整 For i LBound(materialList) To UBound(materialList) Step maxThread 创建多个SAP会话并行处理 Dim j As Integer For j 0 To maxThread - 1 If i j UBound(materialList) Then CreateNewSessionAndQuery materialList(i j) End If Next j 等待所有会话完成 WaitForCompletion Next i End Sub4.2 异常处理机制健壮的错误处理体系Sub SafeSAPOperation(session As Object, operation As String) On Error GoTo ErrorHandler Select Case operation Case login 登录逻辑 Case query 查询逻辑 Case logout 退出逻辑 End Select Exit Sub ErrorHandler: LogError 操作失败: operation , 错误: Err.Description ResetSAPSession session End Sub4.3 结果自动校验实现数据自动比对和异常标记Sub ValidateResults(ws As Worksheet) Dim lastRow As Long, i As Long lastRow ws.Cells(ws.Rows.Count, A).End(xlUp).Row For i 2 To lastRow 检查价格是否为零或异常值 If ws.Cells(i, G).Value 0 Or ws.Cells(i, G).Value 100000 Then ws.Cells(i, K).Value 异常价格 ws.Cells(i, K).Interior.Color RGB(255, 200, 200) End If 检查货币单位是否一致 If ws.Cells(i, H).Value CNY Then ws.Cells(i, L).Value 货币不符 End If Next i End Sub5. 实际应用案例5.1 月度成本核算自动化典型工作流程对比步骤传统方式自动化方案数据准备手动整理Excel清单自动读取ERP导出的原始数据价格查询每个物料3-5分钟每秒处理2-3个物料结果记录手工复制粘贴自动填充并格式化异常检查人工目视检查自动标记异常值总耗时4-6小时5-10分钟5.2 跨工厂价格比对分析实现多工厂数据自动聚合Sub CompareCrossPlantPrices() Dim plants As Variant, results As Collection plants Array(1000, 2000, 3000) 工厂列表 Set results New Collection 各工厂并行查询 Dim plant As Variant For Each plant In plants results.Add QueryPlantPrices(plant) Next 生成比对报告 GenerateComparisonReport results End Sub5.3 历史价格趋势分析自动获取多期间数据构建趋势Sub GetHistoricalPrices(material As String, periods As Variant) Dim historyData As Object Set historyData CreateObject(Scripting.Dictionary) Dim i As Long For i LBound(periods) To UBound(periods) Dim periodData As Variant periodData QueryMaterialPrice(material, periods(i)) historyData.Add periods(i), periodData Next i 绘制价格趋势图 PlotPriceTrend historyData End Sub6. 性能优化技巧6.1 查询速度提升方案实测性能对比优化措施查询速度(物料/分钟)内存占用(MB)基础版本6050禁用SAP界面更新12055多会话并行300150缓存复用会话350100关键优化代码 禁用界面刷新提升速度 session.findById(wnd[0]).setProperty visible, False 查询操作... 恢复界面显示 session.findById(wnd[0]).setProperty visible, True6.2 大规模数据处理百万级数据处理方案分块处理将物料清单拆分为每1000条一个批次中间存储每个批次结果保存为单独CSV文件内存管理定期清理对象释放内存断点续传记录已处理位置支持从中断处继续Sub ProcessLargeDataset(filePath As String) Const BATCH_SIZE As Long 1000 Dim batchCount As Long, i As Long 读取大文件 Dim allMaterials As Variant allMaterials ReadCSV(filePath) batchCount UBound(allMaterials, 1) \ BATCH_SIZE 分批处理 For i 0 To batchCount Dim startRow As Long, endRow As Long startRow i * BATCH_SIZE 1 endRow WorksheetFunction.Min((i 1) * BATCH_SIZE, UBound(allMaterials, 1)) ProcessMaterialBatch allMaterials, startRow, endRow SaveBatchResults i CleanMemory Next i End Sub7. 安全与维护建议7.1 脚本安全规范企业级安全措施认证加密所有脚本配置信息加密存储权限控制按角色分配不同查询权限操作审计记录所有自动化操作日志敏感数据处理自动脱敏关键价格信息安全连接示例Function SecureSAPConnection() As Boolean 使用加密凭证连接 Dim cred As Object Set cred GetSecureCredentials(SAP) 从安全存储获取 On Error Resume Next session.findById(wnd[0]/usr/txtRSYST-BNAME).Text cred.Username session.findById(wnd[0]/usr/pwdRSYST-BCODE).Text cred.Password ...其余登录逻辑 If Err.Number 0 Then SecureSAPConnection True Else SecureSAPConnection False End If End Function7.2 脚本维护策略版本控制方案使用Git管理脚本版本每次修改添加详细注释保留历史兼容接口模块化设计便于更新兼容性处理代码 适配不同SAP GUI版本 Function FindSAPElement(session As Object, idPattern As String) As Object Dim element As Object On Error Resume Next 尝试新版GUI元素ID Set element session.findById(idPattern _NEW) If element Is Nothing Then 回退到旧版ID Set element session.findById(idPattern) End If Set FindSAPElement element End Function8. 扩展应用场景8.1 其他SAP事务码集成常用事务自动化示例事务码功能自动化价值MM03物料主数据查询批量获取物料属性MB52库存查询多仓库库存汇总ME2N采购订单查询供应商交货分析FBL3N供应商行项目应付账款核对8.2 与Power BI集成自动化数据分析流程VBA定时执行SAP数据抓取自动清洗和转换数据格式生成Power BI可读取的CSV文件触发Power BI刷新数据模型Sub ExportForPowerBI(dataRange As Range) 导出为Power BI兼容格式 Dim exportPath As String exportPath ThisWorkbook.Path \SAP_Export_ Format(Now(), yyyymmdd) .csv 使用UTF-8编码保存 Dim fs As Object, ts As Object Set fs CreateObject(ADODB.Stream) fs.Type 2 文本类型 fs.Charset utf-8 fs.Open fs.WriteText RangeToCSV(dataRange) fs.SaveToFile exportPath, 2 fs.Close 更新Power BI数据源 UpdatePowerBIDatasource exportPath End Sub8.3 移动端应用集成企业微信/钉钉通知功能Sub SendWeChatNotification(message As String) Dim http As Object Set http CreateObject(MSXML2.XMLHTTP) 调用企业微信webhook Dim url As String url https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyYOUR_KEY Dim postData As String postData {msgtype:text,text:{content: message }} http.Open POST, url, False http.setRequestHeader Content-Type, application/json http.send postData If http.Status 200 Then LogError 通知发送失败: http.responseText End If End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2547413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…