使用VBA处理地质数据的方法及步骤——以Excel二次编程为例
2011-12-28邱骏挺余心起李春麟杨赫鸣
邱骏挺,余心起,李春麟,杨赫鸣
中国地质大学(北京)地球科学与资源学院,北京 100083
使用VBA处理地质数据的方法及步骤
——以Excel二次编程为例
邱骏挺,余心起,李春麟,杨赫鸣
中国地质大学(北京)地球科学与资源学院,北京 100083
VBA是一类适用面广、功能强大的编程语言,能通过控制应用程序运行而实现办公自动化,因而在处理地质数据和绘制图形等方面拥有很大的开发前景。笔者提出一种编程步骤及编程技巧,非常适于没有编程经验的地质工作者使用。操作者不仅可以自行发开和发布工作程序,也可以使用和修改他人的程序,从而使地质工作的自动化水平得到整体的提升。
地质数据;VBA;编程技巧
VBA (Visual Basic For Application)是美国微软公司开发的一类应用程序控制语言[1]。它可以定义一系列规则以便替换一定的文本模式,从而实现办公软件的自动化。目前,已有多款应用程序集成了VBA模块(如Excel、Word、AutoCAD等)[2-5],用户可根据需要对工作进行预安排和自动化处理,从而提高工作效率。
Excel使用VBA语言编制出的程序叫做“宏”。“宏”不仅可以实现Excel对数据的自动处理,而且非常便于发布和共享。著名的GeoKit就是一款基于VBA构建的宏程序[6]。它已成为许多地球化学研究者必备的工具。简单、快捷、小巧、易共享的特点使VBA编程在处理复杂地质学问题的过程中始终占有一定的优越性。以VBA为基础编写的宏程序必将在地质学领域发挥重大的作用。
虽然VBA具有诸多优势,许多地质学家对此依然望而却步,考虑到使用VBA可能需要具备一定的编程基础,而且非常耗费时间,所以很多人更愿意使用Excel的编辑栏代替VBA进行工作。这种做法并不是最好的选择,一方面,用编辑栏编辑公式不能独立保存,所以在共享方面存在很大制约,同时用这种方法只能处理数值数据而不能用于绘图;另一方面,微软公司为了推行统一的应用程序编程语言已陆续发布很多VBA辅助工具和相关技术手册,有了它们,即便是没有任何编程基础的人同样能写出非常好的宏程序。
笔者通过实际操作和研究,归纳总结出一套适用于所有非计算机类地质人员运用VBA编写程序以处理地质数据的方法。下文将详细介绍这种方法,同时配合一个应用实例阐述如何灵活运用该方法。
一、方法和步骤
引入VBA最根本的目的是更高效地解决地质问题,所以第一步工作就是去发现一个待解决或者有待改进的问题。对于长期从事地质专业的研究人员来说,发现问题并不是难事,例如在野外描述线理的工作中,通常测定的是面的产状和侧伏角的大小,然后运用解析几何的知识换算出线理的产状。上述问题已在刘鹤的研究[7]中得到了解决,但该文采用的是VB编写独立应用程序的工作模式,用户需下载相关软件且必须将数据从Excel导出为TXT文件后才可以运算,使操作步骤变得异常繁琐。如果使用VBA代替VB,不仅不用转化数据格式,还免去了安装应用软件的过程,所以从高效性原则上来讲,此问题依然有待改善。
发现一个问题后,接下来要判断该问题是否可解。所谓可解是指问题的结果与已知条件间存在某些确定的关系,且这种关系能用数学和逻辑语言描述。比如:已知某一层面的真倾角大小(a),求与该层面倾向呈一定角度(b)的观察面上的视倾角大小(c),这个问题就是可解的,因为视倾角大小与真倾角大小间存在确定关系c=arctan(tan(a)·cos(b))。又如已知某一地区岩层倾角,求另一地区岩层倾角就是不可解的,因为两个地区的岩层产状间没有确定的关系。当代地球化学研究使用的各类投影图中每一个点的坐标都与原始数据间存在确定的对应关系,这也是诸如Geoplot和GeoKit等软件可以处理图形的根本原因。
一旦确定问题是可解的,接下来就可以用VBA编写宏程序了。Excel为使用者提供了“录制新宏”的工具。使用者可以在完全不接触代码的情况下让计算机自动完成编写代码的工作,而使用者只需要将整个解题的过程操作一遍就可以了。当然使用者也可以通过Excel自带的Visual Basic编辑器查看并编辑刚刚录制的过程代码。一般情况下,对于操作步骤复杂的宏程序而言,很难一次性将所有过程代码完整的记录下来,这时可以考虑分步录制,直到整个操作完成后再在Visual Basic编辑器里将每一步的过程代码拼接起来(图1)。
一个刚编写好的宏程序存在不尽如人意的地方是很正常的。为提高程序的稳定性,需要使用者对代码进行修改,不过由于主要的过程代码已由计算机完成,所以只需在此基础上对部分代码进行适当的修改就可以了。这里强烈建议用户遵循“先录制,再修改”的原则,尽可能地让计算机完成主要的编程工作。经过多次调试和修改,程序稳定性会有很大的提高,接下来用户可以考虑发布和共享代码。
综上所述,地质人员编写VBA程序可遵循5个步骤,首先是要能发现一个地质问题;其次需要判断这个问题是否可解;在可解的基础上,接下来要完成整个宏编程的基本录制工作;再经过若干次的调试和修改以提高程序的稳定性;最后发布宏程序(图1a)。
图1 程序编写流程图
二、实例研究
考虑到绝大多数人并没有编写VBA的经验,这里我们举一个例子对上述步骤进行阐释。本例将以判断大地构造背景工作中常用的花岗岩Hf-Rb/10-Ta×3图解[8]作为待解决的问题,同时严格遵照之前提出的方法求解。
1.发现问题
三角图是岩石学和地球化学领域解决问题的一类重要工具,经常被用来划分岩石类型、判别构造环境和估计岩石矿物组成等。目前已有多种计算机软件提供了对三角图作图的支持(如Minpet、Sigmaplot等)。然而当前绝大多数地质数据都以Excel工作簿格式存储,使用这些软件往往需要转换数据格式,增加操作步骤,所以设计一种能让Excel本身绘制三角图的宏程序可以大大提高工作效率。
2.判断是否可解
虽然三角图比一般的直角坐标图多出一个坐标轴,但它依然属于平面坐标的范畴,三角图里的每一个点都同时具有三角坐标和平面直角坐标两套坐标,只要找出两种坐标间的数学关系就可以将三角坐标转化为直角坐标。
设空间中有一直角坐标系(图2),等边三角形ABC三个顶点位置如图所示。三角形边长为200(边长理论上可以取任何值,这里取200主要是为了计算方便),如将三角形三个顶点作为三角图的三个端元,则A、B、C三点的直角坐标分别为( 0,、(-100,0)、(100,0),对应的三角坐标为 (100,0,0)、(0,100,0)、(0,0,100), 设 三 角坐标系内有一点D,其直角坐标为(Xd,Yd),三角坐标为(a,b,c)。
图2 三角图坐标转换的证明
由比例关系可知:
即该问题是可解的。
3.编写主要过程代码
在这一步中,使用者需要完成两项工作,首先,要把三角坐标转化为直角坐标,其次要把转化好的直角坐标绘制出来。为避免出错,用户可以考虑录制两个宏来分别处理这两个过程。
(1)录制坐标转换宏。
①将需要处理的数据输入Excel(图3)。
②执行“工具”→“宏”→“录制新宏”进入“录制新宏”窗口,将宏名设置为“坐标转换”。单击“确定”按钮。
③此时在Excel工作簿上会出现一个名为“停”的小窗口,表示计算机已经开始记录用户的每一步操作。
④在A6单元格输入字母“x”,在A7单元格输入字母“y”,然后在B6格编辑公式“=B5-B4”,在B7格编辑公式“=1.732*B3”。
⑤单击“停”窗口里的“停止录制”按钮,完成坐标转换的工作。
⑥使用“自动填充”工具将6、7两行的其他单元格完成(图3)。
这一过程中编写的两个公式会被封装在VBA程序当中,即使删除B6和B7里的公式,只要执行“工具”→“宏”→“运行宏”,则两个公式又会出现在B6和B7单元格里。所以使用VBA编程可以有效地保存用户编辑的公式,同时用户也可以考虑使用宏封装公式以达到共享和发布公式的目的。
(2)录制绘图宏。
①执行“工具”→“宏”→“录制新宏”进入“录制新宏”窗口,将宏名设置为“绘图”。单击“确定”按钮。
②按表1中的信息在指定的单元格内填写指定数值。完成后如图3所示。
③执行“插入”→“图表”,在“图表向导—类型”窗口中选择图表类型为“X-Y散点图”,子图类型选择最后一个,单击“下一步”。
表1 制表数据
④在“系列”选项卡下设置添加六个系列。系列名称、取值区域参见表2。添加完成后点“完成”按钮。
表2 系列选项
⑤结束宏录制。
这时工作簿中已经出现了三角图的雏形,但此时这个三角图还没添加任何数据(图3)。用户可以对图表进行“添加数据源”的操作,将上一个过程结束后得到的坐标数据录入三角图即可。
由于三角图是采用直角坐标绘制的,所以图件上还保留有直角坐标轴和部分刻度,用户可以根据需要添加或去除这些元素。本过程中输入的表1中的数据会被宏自动录制下来,所以即便是删除部分数据也不会出现错误。
图3 过程演示
4.调试代码
将所有宏录制过程中生成的数据和图表全部删除,只保留原始数据,然后依次执行两个宏程序,结果发现两个宏在很短时间内便将三角图绘制完了,说明程序运行没有问题。
当前这个三角图还不是十分美观,为达到更好的展示效果,用户可以继续录制其他针对图表美化的操作(比如修改曲线的颜色,修改系列点的形状等,图4a),直到图表变得美观为止(图4b)。执行“工具”→“宏”→“Visual Basic编辑器”打开VBA编辑窗口,在这里可以看到之前计算机自动录制的全部过程代码。如果之前采用的是分步录制的方式,此时可以将不同过程的代码复制粘贴到一个过程代码中,这样就完成了对代码的连接工作。再次对程序进行调试,如果没有问题就可以发布宏程序了。
5.发布宏和共享宏程序
执行“文件”→“另存为”命令,在另存为对话框中设置保存路径和保存文件名,然后将保存类型设置为“加载宏(.xla)”,最后点击确定,这样刚才编辑好的宏程序就被保存了。被保存宏程序可以通过互联网进行共享,也可使用移动设备传播。
如果另外一台计算机的用户打算使用这段宏代码,只需执行“工具”→“加载宏”命令,然后通过“浏览”找到宏程序所在的位置,最后单击“确定”按钮就可以使用宏程序了。
三、讨论
随着地质工作不断地深入化和细致化,很多研究已从最初的定性逐渐向半定量、定量方向发展[9-10]。在此过程中如能掌握一门计算编程语言将会使工作变得更为简单。由于计算机可以长时间、无间断、反复地重复一项工作,使它非常适于处理数据量大、计算过程复杂的地质类问题,如地球化学、岩石学、岩石地球化学类的问题。
VBA作为一类常见的应用程序编程语言已为许多计算机应用程序所集成。用户不仅可以在诸如Excel等面向数据处理一类的应用程序中使用VBA编程,甚至还可以在CorelDRAW这类图形处理程序中编写VBA程序以处理图形文件。可见VBA是一种适用范围广泛、平台支持有力的计算机编程语言,所以用户完全不必为程序的兼容性和可执行性担忧。不仅如此,使用VBA编写的宏程序非常易于共享和发布,使用者甚至可以在授权情况下对别人的代码进行修改,使共享程序更好地为自己的工作服务。
目前已经有许多VBA程序用于处理地质学的数据和图形问题,但这些程序仅能提供有限的功能和服务,这对于一个快速发展的学科来说显然是不够的。这里,鼓励各位研究人员自行开发VBA程序,并将源程序公开。虽然很多地质学家并没有编程基础,但当前的计算机技术完全可以满足智能化编程的要求。用户完全可以将复杂的代码编写工作首先交给计算机处理,自己只完成对代码的行修改和调试就可以了。在这样一种形势下,掌握一种正确的编程思想和方法往往比编程本身更重要。
本文提出的方法非常适合没有编程经验的人使用。如今我国有一大批工作于生产和科研一线的优秀地质学家,他们活跃的表现使地质学在最近几年内迅猛发展,但同时也出现了一系列亟待解决的问题。在这种情况下,努力寻找一种解决问题的方法是当代地质学家必须面对的事情,而使用计算机编程解决问题就是一种非常有效地方法。
图4 运行结果
然而计算机并不是万能的,它只能按照固定的套路行事,而不能像人一样具备独立思考的能力。因此,不能指望计算机自己去开发一种解题思路,更不要期望它独立判断一个问题是否可解。事实上编程人员必须首先对问题的可解性进行分析,然后给出具体的工作流程,最后才能让计算机完成工作。
在编制工作流程时,使用者可以充分利用VBA模块本身提供的“录制宏”工具进行智能编程。对于复杂的过程最好不要一次性将所有的操作都记录下来,因为操作步骤越多,错误操作的可能性就越大,当然计算机记录下的无效语句的数目也会增加,这样日后在调用程序的时候会使程序的工作效率大打折扣。所以正确的做法是将一个多步操作分解为若干个简单的操作过程(图1b),然后分别对每个小过程进行录制,最后再把所有的过程代码通过“Visual Basic编辑器”连接起来,这样即便其中某一个过程出现了错误,只需要对该过程进行修改就可以了。
程序编写完成后需要进行调试,这里建议各位编程人员采用“开源”方式共享自己的代码,这样其他程序员不仅可以享用程序本身所带来的便利,同时也可以根据实际情况对代码进行更进一步的修改和调试,这就相当于一位程序员编写程序,多位程序员协助调试(图1c),不仅可以节省时间,代码本身也可以得到及时更新。
虽然遵照上述步骤和方法可以有效地编写VBA程序,但在编程过程中不断积累经验也是很重要的,因为随着地质学的发展,未来的数据计算过程会变的更加复杂,这时就需要用使用一些特殊的编程技巧。为更好地适应新情况,各位地质学家在调试VBA程序时可使用“逐语句调试”命令,尽快地掌握每一条语句的作用,以便在日后的编程工作中能更加灵活地使用这些语句。
四、结论
(1)在智能化编程的总体形势下,使用VBA编程的关键不在于编程本身而在于编程方法,即便是没有任何编程经验的地质学家只要掌握正确的方法也能编写程序。
(2)对于没有任何编程经验的地质学家而言,一种行之有效地编程步骤包括:发现问题、判断问题可解性、编写主要过程代码、调试程序和发布程序5个步骤。
(3)在编写主要过程代码时需充分利用VBA模块提供的智能编程工具。
(4)对于比较复杂的过程可以考虑将一个总过程分解为多个子过程进行录制,最后再将所有的过程代码连接起来。
(5)在调试阶段可以考虑将程序代码采用开源方式共享,以借助其他编程人员的力量对程序进行修改和优化处理。
[1] 王芳,李波,刘慧鹏.利用Excel VBA自动绘制物化探平剖图[J].云南地质,2010,29(2):231-234.
[2] 刘军.在Word下实现汉字注音直接输入输出[J].电脑编程技巧与维护,2010,(15):10-14.
[3] 韩芳,牛利兵,牛利军,等.基于AutoCAD VBA的两圆外公切线编程[J].机械,2010,37(S):38-40.
[4] 朱剑君,范忠明.Excel VBA编制河道断面观测业内计算程序[J].江苏水利,2010,(6):15-17.
[5] 钟炜.利用CorelDraw VBA开发宏程序绘制地图[J].江西测绘,2007,(3):4-6.
[6] 路远发.GeoKit:一个用VBA构建的地球化学工具软件包[J].地球化学,2004, (5):28-33.
[7] Hugh R Rollison.岩石地球化学[M].杨学明,杨晓勇,陈双喜.译.合肥:中国科学技术大学出版社,2000:157.
[8] 杨广全,梁晓,王根厚.逆冲断裂及相关褶皱的几何学与运动学定量化研究进展[J].地质通报,2010,29(1):58-61.
[9] 张艳,刘丹强,周璐红.地质灾害土地资源易损性评价定量探讨[J].水文地质工程地质,2010,37(3):122-126.
Method and Steps in Geological Data Processing with a VBA Program
QIU Jun-ting, YU Xin-qi, LI Chun-lin, YANG He-ming
China University of Geosciences, Beijing 100083, China
VBA (Visual Basic For Application) is a wide, powerful programming language which contributes to office automation by controlling application.It has great prospects in rendering the processing of geological data and graphics.The authors put forward a programming method and programming techniques, which well fit geologists without much programming experience.The geologist can not only develop and release their own work, but also use and modify others’ programs, so that the automation level of geological work will generally get improved.
geological data; VBA; programming technique
G642
A
1006-9372 (2011)01-0078-06
2010-12-10;
2011-01-20。
国家自然科学基金项目“北武夷地区逆冲推覆构造及其对铜铅锌矿床的控制作用”(40772134);浙江省第三地质大队、浙江省核工业二六九大队的“江绍拼合带中西段铜多金属矿床成矿与成矿规律研究”项目;国家自然科学基金项目“华北克拉通晚中生代岩石圈减薄过程中的地壳拆离作用与岩石流变学约束”(90814006)。
邱骏挺,男,2010级硕士研究生,构造地质学专业。