基于VBA 的EXCEL 智能岸罐计重通用表单的设计与应用
2020-02-01封亚辉
唐 晨 赵 伟 吴 璟 封亚辉
(南京海关工业产品检测中心 江苏南京 210019)
1 引言
海关是进出口商品监管机构,为深入贯彻落实国务院“放管服”改革要求,进一步优化口岸营商环境,提高贸易便利化水平,海关总署于2019 年发布了159 号公告[1],对进口大宗商品重量鉴定监管方式进行优化,进口大宗商品收货人或者代理人需要向海关申请实施重量鉴定并出具重量证书,不申请海关重量鉴定的,必要时海关依据职权实施鉴定或抽查验证。首先,企业可委托获得海关许可的进出口商品检验鉴定机构(以下简称鉴定机构)实施重量鉴定,海关依据需要核验鉴定机构的鉴定结果,但是由于客观原因,海关关员无法及时查阅到原始的岸罐检定容量数据,无法判断数值是否准确无误。 其次,海关对鉴定机构负有监管职权,但在日常监管中又缺乏有效便捷的手段,不能实时了解鉴定机构日常鉴定活动,月度年度鉴定业务情况获取严重滞后,若第三方采信完全开展,亟需一个鉴定监管系统为海关第三方机构日常管理提供技术支撑,岸罐计重的智能验核会成为该系统的重要模块之一。
岸罐计重,全称为岸上立式金属罐静态计重。是容器计重的一种表现形式,以检定合格的岸罐自身作为计量容器岸罐计重普遍采用手工检尺的方法,首先需要测量罐内液货的液位高度,其次测量罐内液货平均温度,必要时还需测量罐外大气温度,而后获取液货实验室测得的密度及测定温度,最后结合容量表及液货理化参数计算出罐内液货重量。
由于整个计算过程涉及的数据量大且过于烦琐,人工计算易出错,人工复核较困难。 本文充分研究了岸上立式金属罐静态计重标准SN/T 2389.2《进出口商品容器计重规程 第2 部分:动植物油岸上立式金属罐静态计重》[2]、SN/T 2389.5《进出口商品容器计重规程 石油岸上立式金属罐静态计重》[3]、SN/T 2389.11《进出口商品容器计重规程 第11 部分:液体化工品岸上立式金属罐静态计重》[4]、SN/T 2389.16《进出口商品容器计重规程 第16 部分:岸上立式金属罐静态计重通则》[5]以及GB/T 1885—1998《石油计量表》[6],归纳总结了计重标准和方法的共同点与不同点,设计了一张通用的EXCEL 表单,通过VAB(Visual Basic for Applications)宏语言扩展Microsoft Excel 应用程序[7],实现了条件选择及代码组合,同时满足动植物油脂、液体化工品、石油产品的计算需求。
2 智能计算表单的设计与应用研究
2.1 研究技术路线
深入研究SN/T 2389 系列标准中有关岸罐计重的内容后发现,不同货物类别既有共同点,又有差异性。 共同点表现在对同一个岸罐检定机构出具的容量表,查表过程和各种修正过程相同。差异性表现在修正后容量VT计算重量的过程,如石油产品使用VCF修正法,先在GB/T 1885—1998 表60 中查出液温T时对应的VCF 修正值,再将VT乘以该值,计算得到V20℃,最后带入20℃标准密度求得重量;对于动植物油脂,则使用密度修正法,先查出油脂密度温度变化系数γ,再用该值将实验室测定的T0温度时的密度ρ0修正到液温T 时ρT,而后在VT求得重量;对于液体化工品,可以使用密度修正法,过程同植物油脂,也可以使用体积修正法,先查出体积温度变化系数f,再用该值将VT修正到密度测定温度时的体积,再带入密度求得重量。根据上述异同点,归纳总结绘制出岸罐计重一般流程图(图1),图中含有底色的为原始输入数值。对于一些含有底水的货物,应在计算过程中扣除底水容量或重量,对于含有浮顶的岸罐,最终的重量结果中应扣除浮顶重量。
本表单集成了以下6 个主要功能模块代码:视容量自动查找计算、油品视密度反推查找计算、油品VCF 值查找计算、液货密度温度变化系数查找、液货体积温度变化系数查找、方法选择计算。
2.2 表单设计
图1 岸罐计重一般流程图
针对液货产品设计了如图2 的表单,含灰色底纹的单元格是需要填写原始数值和需要选择的计算方法参数,含密点底纹的单元格是经过代码计算回写至表单的计算值和参数。货物名称、罐区、罐号、岸罐类别、计算方法栏中使用了严格的序列选择,以确保序列中文字与代码中判别条件保持一致, 目前正在考虑使用ActiveX 控件实现罐区、罐号联动。
图2 岸罐计重智能计算表单
2.3 基础数据的准备与维护
基础数据包括不同岸罐的鉴定容量数据、成品油标准密度表59B、成品油体积修正系数表60B、液体化工品密度温度变化系数及体积温度变化系数表等。 以上数据需建立独立的EXCEL 文件,并按照一定的规则命名文件,并存储在相对固定的文件夹下,如计算表单所在文件夹下的“数据库”文件夹内。 岸罐的鉴定容量数据应在EXCEL 中划定固定的存放区域,如岸罐属性参数区域、分米容量值区域、厘米毫米容量值区域、静压力修正容量值区域,以方便代码在此区域内调用查找。
2.4 模块设计及功能的实现
为了实现条件判别选择,并尽量避免代码过于冗长,将整个计算判别过程切分成多个模块,利用模块间的相互依存关系,使用Call 语句调用对应的模块。采用模块设计易于修正,当某个模块代码执行过程中出现特殊情况下的BUG 时,易于在该模块中调试查找BUG 原因并修订,无需对整个代码检查修正,避免牵一发动全身,详见表1。
表1 各模块名称和功能
2.5 数据的输入与输出
在执行计算代码前,应先定义数值存储的变量,有些变量是需要作用于整个代码区域,应提前使用“Public”语句声明全局变量,有些则是子代码中的过程计算变量,在代码中声明赋值。
在运行智能计算代码时,首先是读取表单中填入的原始数值,使用“变量 = ThisWorkbook.Sheets(1).Cells(行指引,列指引)”语句,给全局变量赋值。 当完成某项计算, 需要将数值写入表单中时, 使用“ThisWorkbook.Sheets (1).Cells-(行指引, 列指引) =全局变量”语句。 行指引为表单中数值所在的行号,列指引为表单中数值所在的列号, 如前尺液位高度为Cells(8,3),由表单可以看出,前尺数据的列号都为3,后尺数据列号都为5,执行的所有计算过程完全相同, 因此只需要编写一套含有列指引全局变量x 的代码,先赋值x=3 执行代码,再赋值x=5 执行相同代码,如下:
此方法减少了前后两次编写同类型的代码,有效避免代码过于冗长,更方便代码维护和修改。
2.6 基础数据的调用与数值查找
使用VBA 中“Workbooks.Open(FilePath)”语句,打开需要调用的基础数据文件,使用“ActiveWorkbook.Sheets(1).Select”语句选择并激活存放基础数值的表单。 利用循环语句+条件判断语句, 依次判别Cells中的数值是否是所需要的,若是,则将所需的数值赋值给对应的变量,跳出本循环语句或本模块,继续执行后续代码。
以静压力修正容量查找计算为例, 静压力修正容量表呈现形式如表2 所示,查找代码如下:
假定液位高度为4.532 m,根据静压力查表计算方法,需要找到4.5 m 和4.6 m 端点处对应的数值,再通过内插法计算出4.532 m 处的静压力容量值。使用“Do 循环”语句,声明行指引i,利用if 语句判别Cells(i, 1)是否等于米刻度数值4,若是,则将i 值赋值给行指引变量Index_Row,并结束“Do 循环”,若否且cells(i, 1)不为空值,则再次执行Do 语句,此时i 递增1 直至Index_Row 被赋值。 然后更改if 语句判别式,用同样的方式,赋值变量Index_Column。 进代码运算, 最终Index_Row = 6,Index_Column =7,4.5m 对应的Cells (Index_Row, Index_Column) =866,4.6m 对应的Cells(Index_Row, Index_Column +1) = 905,通过内插法计算得到4.532 m 对应的静压力修正容量修约后为878 L。 考虑到当Index_Column = 11 时,Cells(Index_Row, Index_Column +1)为空值,因此又加入了if 判别式,取Cells(Index_Row + 1, 2)端点值。
表2 静压力修正容量表(部分)
液位高度容量、油品VCF 修正值、油品当前液温下密度、密度温度变化系数、体积温度变化系数也都采用上述类似结构的代码形式。 完成基础数据表单的调用计算后,使用“ActiveWorkbook.Close Save Changes:=False”语句关闭表单。
2.7 重量计算方法的自动选择
为了使代码编写更加简单方便, 暂时没有编写代码使之能够通过所填货物名称自动选择方法,在执行运算前,在原始数据录入时,需要人为选定该货物适用的重量计算方法, 即在表单计算方法栏中下拉选择,使用“if…then…elseif…then…else”语句判别选中的方法,执行对应的模块,此举可大大降低编码难度。
2.8 特殊情况处理
在代码中增加了液温高度异常输入值判定,以提高代码整体流畅性和适用性,如液温高度超出岸罐计量最大范围时,终止执行后续代码,并给出对应的信息提示框,提醒检查输入数值是否真确;当液位高度出于浮顶起浮不可计量高度范围内,终止执行后续代码,并给出对应的信息提示框;液温高度为0时,直接返写重量结果为0。
在油品岸罐计重静压力容量修正时,依据标准和岸罐检定使用要求,实际静压力修正容量值应使用液体实际密度进行修正如公式(1):
其中,ΔVp—实际静压力修正容量;ΔVs—以4℃时水的密度编制的静压力修正容量值;—液体在t℃时的密度与水在4℃时密度的比值。
然而,在现场条件下很难测定当前液温下密度,而实验室测定又费时费力,不能及时给出检测值,因此考虑使用油品在20℃时的标准密度,利用成品油标准密度表59B,编写代码反向推算当前液温下密度,实现了密度数值的及时获取。
3 结语
经测试,本研究设计的表单能够满足石油产品、动植物油脂、液体化工品岸罐计重使用要求,代码运算流畅,单次执行平均用时1~2 s,与人工查表计算相比,效率明显增加,并有效避免了人为的、不经过严苛的内插计算,使用相近值的情况,减小计算误差,更能够避免人为计算错误;集成了3 种类别货物的计算方法,适用性更强,基础数据文件管理和维护更加简单便捷,避免了每个品种单独创建计算表单以及文件管理上的混乱;运算代码采用模块组合,易于维护和修正。
本研究基于常规EXCEL 软件,从事该项工作的检验鉴定人员或机构都可以根据本思路建立适用于自身工作情形的计算表单。 本研究还为海关检验鉴定活动在线监管系统提供了思路,以海关监管为纽带,开发Web 网页版和App 版等在线系统,实现多平台使用,由岸罐所属方维护容量表数据,赋予进出口检验鉴定机构和人员一定的使用权限,海关可以第一时间了解货物鉴定相关结果,并为海关信息化建设添砖加瓦。
本研究目前不足之处主要表现在基础数据不够完善,成品油标准密度表59B 和成品油体积修正系数表60B 数据庞大,目前只维护了部分数据,鉴定容量数据也只维护了少量试验用岸罐容量数据,液体化工品密度温度变化系数及体积温度变化系数也只维护了常见的十几种货物。因此,全面的推广和使用还需要联合多方共同参与,花时间和精力做好基础数据的维护工作。此外还需继续完善表单,减少原始参数填入不规范造成的运行BUG。