Excel VBA编程在化工生产报表中的应用
2021-07-12吴梦龙刘福泉李宗昌中国石油四川石化有限责任公司生产三部四川成都611930
吴梦龙,刘福泉,李宗昌(中国石油四川石化有限责任公司生产三部,四川 成都 611930)
0 引言
随着炼化生产技术不断进步,生产过程自动化控制程度越来越高,生产过程数据报表多、数据量大的特点愈发凸显,数据处理的难度不断加大,传统数据处理方法不但费时费力,而且无法满足生产指导性数据的超高准确性要求。
1 常用数据处理方式
1.1 Excel函数、数据透视表
Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。直观的界面、出色的计算功能和图表工具,使Excel成为最流行的个人计算机数据处理软件[1]。利用其自带的函数和透视表等数据处理功能,能满足用户对数据处理的基础要求,但是处理效率不高。
1.2 Excel VBA编程扩展功能
VBA(visual basic for application)是编程语言VB的子集,“寄生于”已有的应用程序,例如:Excel、Powerpoint和Word等,其语法结构与VB非常相似,简单易懂,且可以灵活调用Off ice自带的函数功能,调试简单,不存在兼容性问题。利用Excel VBA创建个性化的数据处理方案,简单易行,快捷高效。
1.3 Python语言编程
Python是一种跨平台的计算机程序设计语言,简单易学且功能强大,它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程。Python的语法简单,代码可读性高,容易入门门槛低,拥有众多优秀的库以及工具可直接调用,逐渐成为近年来数据分析领域入门级的首选编程语言[2]。
2 不同处理方式的优缺点
Excel函数与数据透视表在处理格式统一、规律性很强能直接套用自带函数或利用透视表分类的数据时具有操作简单、执行效率高的优势,但是对于无明显规律或格式不统一的数据处理明显力不从心。VBA和Python同为编程语言,但是VBA源自VB与常用操作系统兼容性更好,执行效率更高,而且不需要单独安装IDE(集成开发环境),与Excel更是结合的天衣无缝,可以直接在Excel中编写、调试代码,可以做到所见及所得,每一步操作结果都能即时呈现出来。而Python则需要单独安装编译环境,并且具备一定的编程调试基础知识才能使用,且程序执行速度比VBA代码慢,但是具有跨平台适用的优势,比较适合具有一定编程基础的团队使用。
综合考虑,VBA编程更适合生产技术专业人员用来采集和处理生产运行数据。
3 生产月报表应用实例
3.1 月报原始数据简介
随着炼化行业技术不断发展进步,自动化程度也越来越高,尤其是以DCS为代表的分散控制系统的成功应用,给生产控制系统带来了质的飞跃。依托系统强大的数据存储功能,为日常操作优化、性能监控评估、事故原因分析等提供了数据支撑,但是典型化工生产流程日报数据动辄涉及成千上万个控制点,每个控制点每分钟取一个数据,有些关键参数取数频率甚至更高,对应产生的总数据量非常巨大,而数据则是按服务商预先设计的存储方式储存的,没有明显的规律。
日报数据是装置重要运行参数记录,是工艺管理不可或缺的基础数据,也是月报分析的主要数据来源。技术人员通过月报表的数据分析可以直观的了解装置运行情况,同时为下一步调整操作提供参考依据,但需要从众多日报数据中获取对应的数据进行采集、处理、计算,数据处理量大、准确度要求高。每月DCS数据由数十个文件夹组成,每个文件夹包含若干各按天生成的Excel表,每个Excel表囊括100~300个参数小时数据、均值、最大值和最小值等数据,总数据量达数十万个。传统的数据区里方法是Excel的“数据引用”方法,需要打开每日Excel表格,取出数据“Average”行后面的平均值,然后逐一粘贴到月报对应位置,需要重复操作数千次,工作量巨大,且极易出错。
月报分析的另一个重要数据来源是化验分析数据。每个月的化验分析数据至少有15 000行,每行有7个数据,数据总量超十万个。传统数据获取方法是用“筛选”的方法,筛选出需要的数据,然后再“复制—粘贴”到月报对应位置,完成月报数据需要重复操作上千次。
3.2 获取编程解决思路
想要从海量数据中获取目标数据,首先要对月报数据结构有深入的了解,并熟练掌握其内在关联方式;然后尝试在原始数据中找到单个目标数据的位置,对于不同来源的数据需要分别进行处理;接下需要通过多次数据比对找到最佳的可编程数据获取方法;最后利用VBA编写、调试、修改代码,实现一键自动取数功能(如图1所示)。
图1 一键自动取数功能流程
3.2.1 原始数据结构分析
我们通过查看数据文件可以分析得知日报数据是分装置分单元存储的、数据文件是以存储日期命名,且不同文件夹内数据文件名称基本一致、数据文件内各控制点参数数据的存储相对位置是固定的;而化验分析数据可以按取样时间分为“08:30”“20:00”和其他三大类、相同采样位号的分析项目是一致的、分析数据是按时间先后顺序排序的。
3.2.2 构思数据获取逻辑
月报中需要的是各控制点参数的日均值和关键采样位号各分析指标数值,可以通过查找指定控制点位号或采样位号来定位数值的大概位置,再通过数组相对引用将对应的数值获取,最终赋值到月报的相应单元格,完成数值获取。最后编写代码、调试、验证结果。
3.2.3 编写、调试、验证VBA代码
利用VBA与Excel的依托关系,参照报表本身制作程序版Excel报表,然后保存为“Excel启用宏的工作簿(*.xlsm)”,将代码写入“工作簿-开发工具-VisualBasic-模块”中,然后根据操作界面提示选择源数据所在的文件夹,点击“运行”,即可得到当月的报表数据和化验分析数据。
(1)获取原始数据路径。由于月报各部分数据来自不同文件,且各月的数据存放位置也是不一样的,因此我们需要先给程序指定日报数据存储的地址。通过以下代码即可实现。
(2)获取对应日报数据。根据数据综合分析结果,确定通过查找“仪表位号”来定位目标数据在日报表中的相对位置,然后利用相对引用赋值,获取目标数据的地址,最后通过赋值函数将目标数据采集到月报表指定的单元格完成数据采集,通过变量循环实现对其他数据的采集汇总工作。
(3)获取化验分析数据。化验分析数据获取按照取样时间特点划分为“08:30”和“20:00”两大类,首先用数组将所有符合采样时间为“08:30”或“20:00”的化验分析数据提取出来,然后采用与上面类似的思路和方法,通过查找采样位号分析项目获取目标数据的相对位置,再进行引用和赋值,实现一键批量获取化验分析数据功能。
4 应用效果
通过开发运用VBA代码,日报数据获取时间由24 h左右减少至5 min;化验分析数据获取由6 h缩短至3 min,工作效率显著提高,同时正确率达到100%,助力装置及时、准确的获取第一手生产数据。
5 VBA扩展应用尝试
鉴于VBA编程在月报数据处理中的应用效果,根据工作需要目前已完成《报警分级台账》《化验分析台账》《异常报警台账》等报表的编程自动化取数工作,极大提高了工作效率。
6 结语
文章介绍了VBA编程在化工生产报表中的应用,通过数据分析确定解决思路,巧妙利用简短的代码完成枯燥的重复工作,利用数据校验功能实现获取的数据100%正确。通过代码模块化编辑,方便初学者调用,使VBA编程更广泛的应用到各类数据处理场景中,实现数据处理自动化,提高工作效率。