田林钢 郭静
摘要:为了利用工程量清单中的工程量计算公式方便快速地得到工程量计算结果,文章在Excel中开发函数,采用正则匹配算法处理数据,完成插入函数即可使计算公式表达式转化为计算结果,为类似工程量计算公式的转化提供了可借鉴的经验。
关键词:正则表达式;正则匹配;函数开发;Excel
中图分类号:O174 文献标识码: A 文章编号:
0 引言
工程量清单是工程投资计算的基础,工程量清单计算底稿更是工程存档的重要资料,如何合理利用工程量清单中的计算公式快速方便地计算出工程量是工程设计人员一直以来关心的课题。文中利用正则匹配算法处理数据,在Excel中开发函数,以实现工程量计算公式表达式转化为计算结果的效果。文章中以水利工程为例阐述主流的两类工程量计算公式的转化方法,为各类工程的工程量计算公式转化提供了可借鉴的经验。
现阶段工程量清单的状况
工程量清单底稿制度是建设工程的一项基本制度,旨在为工程量计算结果提供明确依据。纵观现阶段工程量清单的计算过程,大多数工程设计人员仍然采用手动添加等号抑或从网络上下载他人计算模板的方式来完成计算公式向公式计算结果的转化。然而,前者重复操作次数多、速度慢、效率低,且遇到有文字说明的计算公式就出现错误;后者虽适当避免了前者的缺点,可是模板的模式固定不可调整、适用性差,且用户对模板的后台运行模式全然不知,很容易出现出现了错误而不自知的情况,十分危险。鉴于以上原因,开发一款操作方便、适用性广、运行模式为用户掌握的工程量转化程序是十分必要的。文章采用正则配方法开发函数编写程序,完成公式向其计算结果的转化。
正则表达式匹配算法
正则表达式英文名为Regular Expression,是一种描述字符串结构模式的形式化表达方法,通常用于搜索和替换符合某个模式的文本内容[1]。正则匹配算法即利用正则表达式的匹配模式参数(Pattern)实现提取、替换或获取符合目标模式的文本内容的算法。
正则表达式的应用十分广泛,通常从杂乱的语句中获取E-mail地址、汇总含非数字字符的数据、删除重复字符等普通搜索替换完成不了的工作,正则表达式都可以顺利完成。在VBA中引用正则表达式转化工程量计算公式也是汇总含非数字字符数据应用的一种。
设计开发函数
2.1开发函数实现工程量计算公式转化为计算结果
水利工程量计算公式分为两种,即纯计算公式(计算式一)和带标注性文字的计算公式(计算式二)两种,如下所示:
0.24*(0.4-0.06)*2.76*4*4 (计算式一)
0.64[宽]*0.15[厚]*(1.5-0.24)[长]*4[面]*10[个同上] (计算式二)
对于纯计算公式而言,我们可以利用VBA语言在Excel中开发一般函数(如Eva函数),而对于带有标注性文字的计算公式普通的VBA语言却无能为力,可是正则匹配方法却可以解决这个难题。
正则表达式英文名为Regular Expression,是一种描述字符串结构模式的形式化表达方法,通常用于搜索和替换符合某个模式的文本内容[7]。正则匹配算法即利用正则表达式的匹配模式参数(Pattern)实现提取、替换或获取符合目标模式的文本内容的算法。
正则表达式的应用十分广泛,通常从杂乱的语句中获取E-mail地址、汇总含非数字字符的数据、删除重复字符等普通搜索替换完成不了的工作,正则表达式都可以顺利完成。在VBA中引用正则表达式转化工程量计算公式也是汇总含非数字字符数据应用的一种。
2.2 正则计算函数代码设计
打开工程量清单,同时按Alt+F11键调出Visual Basic编辑器,单击[插入] / [模块]命令则新建一个空的全局模块(模块1),双击工程资源管理器中的模块1 ,输入以下代码(代码 code1):
Function 正则计算(rng As Range)
Application.Volatile'设置强制性计算
Dim str As String '定义str为字符串变量
Dim regExp As Object '定义regExp为对象变量
Set regExp = CreateObject("VBSCRIPT.REGEXP")'创建正则表达式引用对象
If Len(rng) = 0 Then'判断rng是否为空
正则计算 = ""'若rng为空则赋空值给函数正则表达式
Else
'若rng不为空则对正则对象进行匹配设计
With regExp
.Pattern = "[.*?]" '设置正则匹配规则
.Global = True '设置匹配为全局的
str = .Replace(rng.Text, "") '将匹配结果替换为空
End With
正则计算 = Round(Application.Evaluate(str), 2)
End If
End Function
本段代码(代码code1)中,首先用set语句创建对正则表达式的引用,其次对rng对象进行是否为空的判断,如果不为空则进行正则匹配,匹配公式“.Pattern = "[.*?]"”的含义是匹配中括号及其内的所有字符,如果公式中不含中括号和文字性说明(如计算式一),则跳过匹配,将计算式赋值给str并进行下一步计算;如果含(如计算式二),则将中括号和其内的文字删除(即删除[宽]、[厚] 、[长] 、[面]和[个同上]),则剩下的字符就是就是纯计算公式str:0.64*0.15*(1.5-0.24)*4*10。最后用Evaluate方法将str转化为计算结果,同时用 Round函数将计算结果保留到两位小数。
2.3 正则计算函数在水里工程量清单中的应用
在单元格[D4]、[D5]中分别输入公式一和公式二,选择[E4]单元格,单击插入函数,在弹出的对话框中“或选择类别(C):”下拉菜单中选择“全部”,然后在“选择函数(N):”列表框中拨动滚动条则可以找到(代码code1)中新建的函数“正则计算”,选择它并单击确定,在弹出的“函数参数”对话框中选择rng参数为单元格[D4],单击确定,则[E4]中即计算出单元格[D4]中计算公式的结果3.6。在[E5]内同样填充“正则计算”公式,则计算式二的计算结果4.84也显示在单元格中。
由上述操作效果来看,正则计算函数对于纯计算公式的计算和含有文字说明的数据计算都是非常有效的。这里必须强调一下,正则表达式用于在杂乱语句中搜索和替换符合某个模式的文本内容,在上述水利工程量清单示例中即为匹配中括号及其中的字符;如果目标字符串没有任何规则和模式可循,那么正则表达式对其也是无能为力的。
3结语
正则匹配方法开发函数将工程量计算式转化为计算结果是有效的,它不仅适用于纯计算公式也适用于含有文字说明的计算模式。正则匹配函数的计算效果和应用广泛性都令人满意,为各类工程量计算公式的转化提供了可借鉴的经验。
参考文献
[1] 罗刚君.ExcelVBA程序开发自学宝典(第2版).北京:电子工业出版社,2011.8
[作者简介] 田林钢,男,生于1968,河南郑州人,华北水利水电学院教授级高工,研究方向:工程造价管理,水工结构,工程风险管理。