余志荣
国家能源集团黄金埠发电有限公司,江西上饶 335101
摘要:借助Excel VBA模块化编程,解决重复的人工查找替换工作,且能够经简单地操作实现电气操作票自动生成,避免因删除文件或修改关键词导致出错,影响操作安全性。
关键词:VBA语言;火电厂;电气操作票
1 概述
常规电气操作票相似度较高,只需要修改关键字段即可变更。但在实际工作中,工作人员常为了简便,会直接搜索相关电气操作票,用关键字段替换后保存导致原票实效。因此,为了规避此类重复人工操作,使用Excel VBA程序设计开发自动生成功能,按照统一的模板生成不同设备的电气操作票,从而提高了工作人员的效率,且可减少电气操作票错误率。
2 项目设计
电气操作票设备的开关转换状态共计有10种,但设备的操作主要区别可分为测绝缘和不测绝缘两类。因此,可针对两种类型分别设计通用代码模块,但主要功能都是通过创建Word对象来打开对应的模板电气操作票,查找关键字段,用Excel单元格的内容进行替换。
在Excel文件中,集成6KV设备的关键字段数据库,设备关键字段可根据需求进行删除或者增加。在需要生成一张指定的电气操作票时,可使用命令按钮(ActiveX控件),在CommandButton1_Click()事件代码中运行CreateTickets()程序,在输入设备开关转换状态序号(0~9)及6KV设备关键字段的行号后,即可在指定路径下找到所要电气操作票。
2.1 设备不测绝缘类代码设计
由表1可知,在不测绝缘类别中,共计有6种开关转换状态。根据自定义的模板电气操作票内容,可将关键字段统一写成“#X机某设备电机XXXX”。
“#X机某设备电机XXXX”关键字段各关键词代表的含义:
#X机-机组号;某设备-6KV设备名称;XXXX-设备开关编号。
因此,针对这6种开关转换状态的电气操作票,可将代码写成一个不测绝缘类通用程序模块。
利用该程序模块,可在打开自定义模板电气操作票后,自动查找关键字段“#X机某设备电机XXXX”,并将该关键字段替换成Excel单元格Cells(i,?k)内容,达到自动生成设备电气操作票的目的。
2.2 设备测绝缘类代码设计
由表1可知,在测绝缘类别中,共计有4种开关转换状态。根据自定义模板电气操作票内容,可将关键字段统一写成“#X机某设备电机XXXX”及“#X机某设备电机”。
测绝缘类通用程序模块可实现关键字段“#X机某设备电机XXXX”及“#X机某设备电机”分别被替换成Excel单元格Cells(i,?k)及Cells(i,?k?+?1)的内容。
3 程序实现
程序由主程序及子程序两部分组成。
3.1 主程序点击事件
点击事件CommandButton1_Click()代码如下:
Private Sub CommandButton1_Click()
Call CreateTickets '引用子程序代码
End Sub
3.2 子程序执行程序
CreateTickets()子过程代码如下:
Sub CreateTickets()
'功能:对多个设备进行自动电气操作票生成
Application.Volatile '实时更新
Dim WordDoc, WordApp
Dim i, j As Integer '定义整数值,设备对应的行数i、 开关转换状态序号j
Dim k As Integer '定义列数值k
Dim number(0 To 9) As String '定义字符串一维数组,存储电气操作票文件地址,例如:D:\电气操作票系统\模板电气操作票\模板0-#X机某设备电机XXXX开关由冷备用状态转为检修状态.docx
'将自定义模板电气操作票文件地址赋值给数组
number(0) = "D:\电气操作票系统\模板电气操作票\模板0-#X机某设备电机XXXX开关由冷备用状态转为检修状态.docx"
number(1) = "D:\电气操作票系统\模板电气操作票\模板1-#X机某设备电机XXXX开关由冷备用状态转为热备用状态.docx"
number(2) = "D:\电气操作票系统\模板电气操作票\模板2-#X机某设备电机XXXX开关由热备用状态转为检修状态.docx"
number(3) = "D:\电气操作票系统\模板电气操作票\模板3-#X机某设备电机XXXX开关由热备用状态转为冷备用状态.docx"
number(4) = "D:\电气操作票系统\模板电气操作票\模板4-#X机某设备电机XXXX开关由检修状态转为热备用状态(不测绝缘).docx"
number(5) = "D:\电气操作票系统\模板电气操作票\模板5-#X机某设备电机XXXX开关由检修状态转为冷备用状态.docx"
number(6) = "D:\电气操作票系统\模板电气操作票\模板6-#X机某设备电机XXXX开关由冷备用状态转为热备用状态(测绝缘).docx"
number(7) = "D:\电气操作票系统\模板电气操作票\模板7-#X机某设备电机XXXX开关冷备用状态测绝缘.docx"
number(8) = "D:\电气操作票系统\模板电气操作票\模板8-#X机某设备电机XXXX开关由检修状态转为冷备用状态(测绝缘).docx"
number(9) = "D:\电气操作票系统\模板电气操作票\模板9-#X机某设备电机XXXX开关由检修状态转为热备用状态(测绝缘).docx"
Dim content(0 To 9) As String '定义开关转换状态一维数组,例如:由冷备用状态转为检修状态.docx;在生成文件名时会用到
content(0) = "由冷备用状态转为检修状态.docx"
content(1) = "由冷备用状态转为热备用状态.docx"
content(2) = "由热备用状态转为检修状态.docx"
content(3) = "由热备用状态转为冷备用状态.docx"
content(4) = "由检修状态转为热备用状态(不测绝缘).docx"
content(5) = "由检修状态转为冷备用状态.docx"
content(6) = "由冷备用状态转为热备用状态(测绝缘).docx"
content(7) = "冷备用状态测绝缘.docx"
content(8) = "由检修状态转为冷备用状态(测绝缘).docx"
content(9) = "由检修状态转为热备用状态(测绝缘).docx"
j = InputBox("请输入开关转换状态序号(0~9)")
i = InputBox("请输入设备对应的行数(≥3)")
k = 3 '将列数值赋值为3
Application.DisplayAlerts = False '返回或设置运行宏时的一些警告或消息处理
Application.ScreenUpdating = False '关闭屏幕更新;如果开启,则布尔值为true
Set WordApp = CreateObject("word.application") '在excel中创建word对象,方便在excel中控制word文档
If j <= 5 Then
'不测绝缘类通用模块
Set WordDoc = WordApp.Documents.Open(number(j))
WordApp.Visible = False
WordApp.Selection.Find.ClearFormatting
WordApp.Selection.Find.Replacement.ClearFormatting
With WordApp.Selection.Find
.Text = "#X机某设备电机XXXX"
.Replacement.Text = Sheets("数据").Cells(i, k)
.Forward = True
.Wrap = wdFindContinue
End With
WordApp.Selection.Find.Execute Replace:=wdReplaceAll
ElseIf 5 < j <= 9 Then
'测绝缘类通用模块
Set WordDoc = WordApp.Documents.Open(number(j))
WordApp.Visible = False
WordApp.Selection.Find.ClearFormatting
WordApp.Selection.Find.Replacement.ClearFormatting
With WordApp.Selection.Find
.Text = "#X机某设备电机XXXX"
.Replacement.Text = Sheets("数据").Cells(i, k)
.Forward = True
.Wrap = wdFindContinue
End With
WordApp.Selection.Find.Execute Replace:=wdReplaceAll
WordApp.Selection.Find.ClearFormatting
WordApp.Selection.Find.Replacement.ClearFormatting
With WordApp.Selection.Find
.Text = "#X机某设备电机"
.Replacement.Text = Sheets("数据").Cells(i, k + 1)
.Forward = True
.Wrap = wdFindContinue
End With
WordApp.Selection.Find.Execute Replace:=wdReplaceAll
End If
'电气操作票生成存储位置
WordDoc.SaveAs "D:\电气操作票系统\电气操作票生成\" & Sheets("数据").Cells(i, k - 1) & content(j)
WordDoc.Close 'Word文件关闭
WordApp.Quit 'Word程序退出
Set WordDoc = Nothing '取消对象变量与实际对象的关联
Set WordApp = Nothing
Application.DisplayAlerts = False
Application.ScreenUpdating = True
MsgBox "电气操作票已生成,请在电气票生成文件夹中查找!", vbOKOnly, "" '消息提示
End Sub
4 结束语
Excel VBA的通用模块化编程方法,很好地解决了电气操作票大量重复的人工查找替换操作。通过简单的点击事件,加上输入开关转换状态序号及设备的行号,能够快速准确地生成所要的电气操作票。该电气操作票自动生成系统已经在实际工作中试运过一段时间,从各方面测试情况来看,系统运行稳定,各岗位人员均反馈操作简单,交互界面友好,能够很快掌握程序化操作流程。
参考文献
[1] 陈倩怡. VBA实现账务统一管理.电脑编程技巧与维护, 2021, (5):111-130+125
[2] 时坤. Excel VBA经典代码应用大全. 北京大学出版社, 2019.
[3] 国能黄金埠发电有限公司. Q/GN-HJB 101.001-2020, 国能黄金埠发电有限公司企业标准,2020