利用VBA自动计算历年日平均气温月标准差
2013-09-29吴有恒孙永顺吴世美
吴有恒,孙永顺,吴世美
(1.贵州省贵阳市气象局,贵州 贵阳 550001;2.贵州省三穗县气象局,贵州 三穗 556500)
1 引言
VBA是Visual Basic For Application的简称,也叫做宏程序,是建立在Office中的一种应用程序开发工具。通过编写代码,使Excel显示我们想要的计算结果,对于新建相同样式的表格只需通过宏录制功能便能使Excel自动生成,无需浪费时间去重复设计,在VB编辑器中还提供了可视化的窗体设计功能,只需拖动相应的控件到想要放置的位置上,再编写相关事件,一个简单的窗体便产生了。笔者通过实现工作中用到的历年日均气温月标准差的自动计算来扩展VBA编程能力。
2 功能分析及算法
2.1 读取A文件气温并求平均值
打开Excel文件,使用快捷键Alt+F11即可调出VB编辑器,在编辑器左上角的工程资源管理窗口中点击鼠标右键新建标准模块,模块即是编写程序代码的一个框架,通过在其中创建Sub子过程来实现算法。
月地面气象资料格式文件(A文件)按一定顺序存放着该月各气象要素数据,通过Open语句打开A文件并存放在Open语句分配的缓冲区内供文件进行输入或输出操作,下面是读取A文件气温并求日平均的值的语句(中文部分是注释):
2.2 自动生成所需样式的表格
打开Excel,选择“工具”→“宏”→“录制新宏”打开录制窗口,借助宏录制功能设计表格样式、字体大小等,录制完成后生成的代码会保存在VB编辑器的模块中。读取A文件气温数据计算得到的日平均值要在生成的表格中按顺序存放,如图1。
图1 各年日平均气温及月标准差表
在表的最后一行是日平均气温的月标准差,Excel中有直接计算样本标准差的公式,以1月为例在程序中加入代码Range("B35").FormulaR1C1="=STDEV(R[-32]C:R[-2]C)",该语句表示B35这个单元格使用公式STDEV计算从第3行(R[-32]表示35-32=3)到第33行(R[-2]表示35-2=33)的样本标准差。对于新建如图1的其余年份的表格,只需把生成表格样式的代码放到循环语句中便能自动生成。
2.3 创建超链接方便查阅
在求日平均气温月标准差的30 a均值时新建如图2的表格。
为方便查看各年日平均气温及月标准差,在该表的A列创建访问相应年份的超链接,需要用到Hyperlinks对象的Add方法,即超链接的添加方法,以代码中的语句为例:
图2 历年日平均气温月标准差及均值表
"跳转到"&Sheets("各年日平均气温月标准差及30 a均值").Name,TextToDisplay:="返回目录"
该句中Anchor:=.Range("A2")表示设置A2单元格为超链接;Address:=""表示无引用外部文件或访问网址的链接;SubAddress:="目录"表示引用本工作薄内名为“目录”的区域;ScreenTip:="跳转到"&Sheets("各年日平均气温月标准差及30 a均值").Name表示当鼠标移动到A2单元格时会提示“跳转到各年日平均气温月标准差及30 a均值”;TextToDisplay:="返回目录"表示在A2单元上显示“返回目录”,如图1中A2单元格的蓝色字体所示。
3 窗体设计
在VB编辑器中通过插入用户窗体,设计了3个文本框用于获取区站号、开始年份和结束年份,通过传递用户输入的数据改变A文件名,使得日平均气温月标准差的计算同样适用于其他台站,而且开始和结束年份不固定可以任意输入,但是对于文本框输入内容都有条件限定,区站号只允许输入5位数字,开始和结束年份只允许输入4位数字,因为旬月历史数据用的都是近30 a的气候资料,所以年份间隔必须为30 a,输入错误会弹出消息框要求重新输入,区站号和年份输入正确后会提示“确保所有的A文件都放置在D:OSSMO 2004ReportFile下”,该目录也是测报软件默认存放A文件的路径。
最后点击上图中计算按钮后便会呈现如图1、图2所示样式的31张表格。
4 小结
图3 计算器界面
使用Excel内置的VB编辑器编写宏程序计算历年日平均气温月标准差虽然只是实现了旬月历史数据中的一项,但通过此次编程实践提升了解决工作问题的能力,对于其他历史数据只需对代码做相应改动即可实现。之所以选择使用VBA还在于Office办公软件的普及,它能引导Excel创建自动化操作并快速处理数据,实现很多Excel基本功能所不能实现的功能。最后还需说明的是宏的运行,打开“工具”→“宏”→“安全性”,只需选择中级即可,之后在打开本文所示已写好宏程序的Excel文档时,点击“启用宏”便会弹出图3对话框。
[1]韩小良,韩舒婷.Excel VBA高效办公实用宝典[M].北京:中国铁道出版社,2008.
[2]黄世芹,王珺.VB编程环境下如何调用和生成EXCEL文档[J]. 贵州气象,2010,34(2):38-39.