ilaoyao 2020.09.23  

    编制工程算量报价中的一个效率低下的表象就是同专业不同工程在过程中一直在进行大量重复效率低下的工作内容,调整格式,布局页面,输入相同的结构行内容,耗费了大量时间而完成的成果往往跟其他工程的区别仅仅在量与价格上区别,而且大量数据手工来输入,容易产生错误难以发现,所以针对这种情况,采用excel做一个自动化处理的方案,就有一定的价值。

    思路参照了工程造价软件的方式。工程造价软件在处理这样的情况大同小异,首先提供一个库(也就是定额),每条定额对应的内置信息包括定额编号,定额名称,定额单价以及综合单价等等,在进入新工程中一般都是通过定额编号来确定定额库与工程之间的联系,而用户在编制过程中对名称,单价的修改不会修改到定额库自身,它不会限制用户的修改,但是又将用户的修改局限于有限的区域里,所以这种单向操作在灵活性和实用性方面都处理得较为理想。借鉴这种思路,于是尝试进行采用excel进行类似的自动化操作。

    流程及条件判断:

1)   算量计算书:最先使用的应该是工程量计算书的界面,这个界面为整个流程的第一界面,在此界面中,用户通过数据输入与计算得到汇总,完成最多的交互操作。这里面设置一个关键列,关键列的作用在于与其他界面的数据适配查询从而使得工程量的修改达到全局联动。譬如这里设置的关键列为材料名称,通过材料名称的变化增删来:1)影响整体预算报价列表结果的自动变化增删,包含工程量,单位等。2)影响材料价格表条目的自动变化增删,包括单价,总价等。

工程量计算书具备的自动功能:1)公式计算结果,可以通过内置的evaluate()来实现。好处就是省去了手工计算的费时以及失误,尤其在多重嵌套的情况下极具优势。附加功能:自动对公式中的非参与计算数据,例如注释内容等在计算时候自动剔除从而获得正确结果,此功能在工程原始数据的检查和复核的时候极为便利。2)分组自动识别,可以自动识别进入预算的为第一级,其他的为第二级,对于数据量大的后期检查和页面浏览更便利。3)附加功能:计算公式的不同类型文本自动颜色,即类似代码高亮功能,对不同类型的文本采用不同的颜色显示,提高公式检查的效率。

2)价格表:在工程量完成数据输入和计算后就进入下一个界面流程,针对不同部位、不同做法以及不同材料的确定对应的价格指标,该表数据与工程量计算书的关键列应具备对应关系,即在工程量计算书中修改的内容(名称、结果)等在该表中应获得同步更新,同样在本表中的价格修改应该同步反应到预算书中的单价总价。本表的数据联动处理中应该考虑到以下的因素:1)计算书不同部位可能会采用同样的做法与材料,而这些同样做法与材料在价格表中应该只统计为一条数据,而不应该统计为多条同样内容,减少工作量以及无谓的失误。所以这里应该考虑到重复数据的清理。2)计算书工程量中的材料增加新材料条目后,此价格表应同步增加该新条目,并且相应进行默认库对应价格导入的处理,同样计算书中删除条目后,并且只有在工程中该材料工程量为零的时候触发价格表对应条目的删除。

具备的自动化功能:1)自动统计计算书中的材料类别,每种类别的总量,自动清理因为计算书增删的无效材料类别。2)自动导入价格。导入价格的思路遵循:A)在未指定价格的空白类别中根据指定关键词如材料编码从价格库中读取对应价格,如果价格库中存在多个对应价格,则自动生成下拉列表供选择,如果价格库中只存在唯一的价格,则自动导入该价格。B)对已经存在价格的条目视为已经人工调整,不再从库中读取,这样防止二次修改价格后被库原始价格覆盖。C)自动链接预算报价表中的条目,输出对应价格到预算汇总表内。上述价格导入的功能采用库字典匹配当前价格表数据的形式。

3)预算表:在工程量和价格都完成调整后,下一个界面流程就是关于预算书的编制。预算书相对来说自动化内容少些,主要属于数据获取,而数据修改从而影响其他表格的要求偏低。

具备的自动化功能:1)从计算书中自动读取需要进入预算的字母,关键列为材料列表,也可以考虑增加一个切换开关列(如是否01这样的布尔值来实现),通过判断计算书的关键列来决定进入预算书的条目。2)根据对应的材料名称条目来导入价格表中的对应价格,这里涉及到字典的查询即匹配功能,即采用价格表的名称和价格组成生成字典,对预算书中的材料名称进行字典查询匹配并获得对应的价格数据,填充到预算书中。形成一个完整的条目组成。3)自动生成汇总区域,如管理费,利润税金等等,其中管利税具备交互修改的权限。4)自动修改报价封面的总价与大写等功能。

4)库文件:库文件作为底层资料输出的界面,提供数据查询匹配,但是不提供工程数据修改库的权限,这种操作借鉴定额库,提供原始的价格组成,但是在人工修改价格后库不再提供查询匹配了,默认人工修改的优先级更高。库文件作为半只读的数据记录,只提供人工入库修改扩充库数据,而不提供工程修改库内容。其不需要具备自动化处理的程序,只提供一个词典供程序查询匹配使用。

库本身设置里面需要一个处理列,就是材料的关键词。程序是通过关键词来获取库里面的材料价格,而材料名称在计算书中的写法会因人因时而异,不同的人甚至同一个人在不同时候对一个材料的描述可能会存在差异,譬如对内墙涂料的描述,在计算书中可以写成内墙涂料,可以写成内墙乳胶漆,或者乳胶涂料等等。而在库里面不可能对同一个材料的不同叫法都设置价单独的子目,这样增加了库本身的数据处理性能占用,但是同时也不能要求用户输入的名称一定符合库文件的命名规范,所以这里设置一个关键词就很有必要。同样时上面的例子,对乳胶涂料设置以下的关键词:乳胶|内墙|涂料,这样基本上每一个写该材料名称的时候都会出现这三个中的一种或多种,至于是否明白库内材料名称的规范描述就不重要了,只需要通过关键词后来逐一匹配,如果符合其中一个或多个就将此材料添加进入适配列表。这样做的好处就是不要求工程量编写人员熟悉库结构和材料规范命名的细节,只要按照自己的常用习惯称呼命名包含关键词的描述就可以,毕竟一种材料的叫法工程上不外乎三四种别称而已。同样比如说埋板,有的叫埋件,有的叫后置铁板,有的叫预埋铁板等等,设置预埋|铁板|后置这样的关键词就可以解决,毕竟不会把埋件喊成为玻璃的,这样库数据的扩充和增强广泛的适应性就非常便利。

5)所以经过这样的一个整体流程:计算书编制→自动生成材料价格表→自动导入价格库的价格→人工修改价格表→生成预算书报表与封面。在这一整个流程中,计算书的编制输入量占据90%的劳动量,剩余的就是价格表的人工修改。完成这些样一个流程报价预算就已经完成了,其具备了自动统计,自动分类统计,自动计算等一系列内容。对工作效率的提升还是非常明显,而且对后期修改以及查错都非常便利。至于表格外观字体大小页面打印范围等等就不需要重复去考虑。这样后期的工作主要就是对库的扩充和维护。当然在整个调试过程中需要对各种不可预测的操作进行测试,逐一排除掉可能出现的中断。这种调试过程需要预设实际操作过程中各种可能。

在整个代码编写和运行的过程中几个备忘:

1)代码里面尽量少用内置公式,特别时同一列大量相同功能的代码,大量的重复公式对运行的性能影响较大,在确定代码运算无误的时候,尽量采用直接赋值比公式运算速度更快;也可以采用增加一个判断,如[a1].HasFormula的布尔值来判断,减少写入操作,后期可以增加一个一次性刷新公式的方式来加快处理速度。

2)采用字典进行查找匹配获得结果时一个非常不错的方法。

3)尽量减少在selectchange过程设置代码,除非是必要。第一它会影响操作的体验,第二它对一些功能会产生影响,如复制粘贴等等。

4)善于利用worksheet的active功能,对于同步数据联动刷新在不采用公式的情况下是个较好的处理方式,但是一定程度会影响到性能。

5)如果采用窗体中引用sheet内部的sub或者function的时候,需要sub和funciton非private形式。

这种思路加以扩展后,应该同样适用于不同行业的不同数据处理的要求。这种方法的优点是可定制性强,可以根据不同的要求编制不同的界面,小巧灵活。缺点是对海量数据的处理不如专业的数据库性能好,对小量数据的处理需要具备除错修正的能力。