基于Excel VBA实现角规调查小班蓄积量的自动计算

2015-12-03 02:29徐礼来
自然保护地 2015年1期
关键词:蓄积量记录表单元格

徐礼来

(安徽省旌德县林业局 242600)

VBA 的英文全称是Visual Basic For Application,是由Microsoft(微软)公司设计开发,并内置于Microsoft Office 系列产品中的一套开发平台。VBA 与Office 产品高度集成,用户利用简单的语法和规则,通过简易快速的编程手法来实现高级的软件功能[1]。小班蓄积量等于小班面积和小班每公顷蓄积量的乘积,小班每公顷蓄积量可用角规测树、样段调查法、样地调查法、卫片判读法等方法确定[2]。角规是一种构造简单、使用方便的测树工具,主要用来测定森林每公顷胸高断面积,计算森林疏密度和蓄积量,在我国森林调查中已得到广泛应用。其构造由一根木棍和带有缺口的金属薄片组成,缺口宽度与棍长一般成1∶50[3],常用的棍长有三种100、70、50cm 等三种。我国于1957年引进角规,起初称之为疏密度测定器,在试验研究的基础上逐步得到了推广[4]。小班每公顷蓄积量的计算是否正确,直接影响小班蓄积量,是二类调查质量管理的重要内容。由于电子计算机的普及,现整个森林经理的内业、外业工作已广泛应用电子计算机技术[5],下面以Excel VBA 代码编制为例,探索实现角规调查小班蓄积量的自动计算技术。

1 传统人工计算

野外调查时,根据林木分布特点和生长状况,选择有代表性的地段布设调查点进行调查,并在《角规样地调查记录表》中分别角规点和树种填写观测株数、坡度、平均树高。坡度超过120时,要通过《角规观测值按坡度改算表》对观测值进行坡度改正[6]。因此,计算时要分别角规点和树种,根据观测株数、坡度,通过《角规观测值按坡度改算表》对观测值进行改算,再求林分平均观测改算值,又分别树种和林分平均高,通过《常用树种断面积标准表》查找同树种的公顷蓄积量,并乘以林分平均观测改算值,后求和,即求算得小班每公顷蓄积量。由于森林资源规划设计调查(简称“二类调查”)工作量大,小班调查卡片内业处理数据多,调查计算人员业务参差不齐,小班蓄积量计算过程需2 次查表引用和多次计算,易导致工作人员疲劳和查表计算结果易错误。

2 VBA 自动计算

2.1 模块和流程

二类调查小班区划条件为:权属、地类、森林类别及林种、生态公益林的事权与保护等级、林业工程级别、起源、优势树种(组)比例相差二成以上、龄级、郁闭度、立地条件类型。结合旌德县森林树种结构特点,角规样地调查计算模块主要分为:杉-松-阔、松-阔-阔、杉-阔-阔3 个模块。下面,以杉-松-阔模块为例来说明。

角规调查小班蓄积量自动计算流程见图1。常用表编制是指编制角规观测值按坡度改算表和常用树种断面积标准表;角规样地调查记录表设置是指根据式样表将表格设置为Excel 表格;公式编辑是指通过VBA 编制角规观测值按坡度改算表及常用树种断面积标准表中相应的数据引用和计算公式代码;角规样地调查记录表复制是指根据同模块的小班数据,复制相应的表格及公式;计算应用是指将小班角规调查记录数据录入表中,小班蓄积量自动计算。

图1 角规调查小班蓄积量自动计算流程

2.2 表格编制及VBA 设置应用

2.2.1 常用表编制

根据安徽省林业勘察设计院1985年3月《林业调查设计常用手册》中的角规观测值按坡度改算表,打开excel,将excel 工作簿命名为角规调查小班蓄积量自动计算,在sheet1 工作表中进行如下设置表格(表1),坡度从120、140…460,观测值从0.5、1.0…30.0,表中区为改算值,将此工作表命名为角规表;根据安徽省林业厅2012年4月《安徽省森林资源规划设计调查实施细则》中的常用树种断面积标准表,在sheet2 中进行如下设置表格(表2),松包括马尾松、湿地松、火炬松等树种,阔包括硬阔、软阔等树种,杉主要指杉木树种,各树种数据范围如表2所示,并将此工作表命名为蓄积量表。此两个表主要用于VBA 代码编制查找引用的工具表。

表1 角规表

表2 蓄积量表

2.2.2 记录表编制

根据《安徽森林资源规划设计调查实施细则》中的森林资源规划设计小班调查卡片式样,结合自动计算设计的需要,将角规样地调查记录表按如下设置,具体操作步骤是:打开角规调查小班蓄积量自动计算Excel 工作簿,点击sheet3,在此工作表中将角规样地调查记录表设置如下图(表3),并将单元格区域(G4∶I9,J9∶l9,M9∶P9,R4∶Z9)设置为浅蓝色区域,提示使用者这些单元格数据结果会自动计算显示,将单元格区域M4∶P8 设为浅绿色区域,提示使用者不用录入计算数据,最后将sheet3 重命为杉松阔角规样地调查记录表。

表3 角规样地调查记录表

2.2.3 自动引用和计算代码编制

小班各树种(组)每公顷蓄积量计算,需要根据树种(组)角规观测值和坡度查找相应的坡度改算值,并求各树种(组)的平均改算值,再根据林分平均树高在《常用树种断面积标准表》中查找相应树种的每公顷蓄积标准值,这二者之积为各组成树种(组)每公顷蓄积量。为了实现小班蓄积量自动计算,VBA 代码可按如下流程(图2)进行编制。

森林认证是推动可持续林业管理的市场性手段,为此,全国志愿性马来西亚木材认证体系得以建立,对森林管理实践进行独立审核、对可持续森林管理的完成度进行评估、对林产公司林产品木材来源进行审核。

图2 VBA 代码编制流程图

2.2.3.1 改正后株数(面积)自动引用和平均改算值自动计算代码编制

区域G4∶I8 需根据调查坡度和观测株数,调查坡度大于12°,需进行观测株数改算;调查坡度小于12°,不需改算。改正后株数(面积)平均值计算是分别对G4∶G8、H4∶H8、I4∶I8 三个区域求平均。依据表1和表3,下面以G4 自动引用和以G9 单元格平均值计算为例:

G4 单元格数据自动引用的主要代码:Range("G4").Select:ActiveCell.FormulaR1C1="=IF(RC[-4]=0,0,IF(RC6<12,RC[-4],INDEX( 角规表!R4C2:R63C19,MATCH(RC[-4],角规表!R4C1:R63C1,0),MATCH(RC6,角规表!R3C2:R3C19,0))))"。

G9 单元格平均改算值自动计算的主要代码:Range("G9").Select:ActiveCell.FormulaR1C1=“=IF(SUM(R[-5]C:R[-1]C)=0,"""",ROUND(SUM(R[-5]C:R[-1]C)/COUNTIF(R[-5]C[19]:R[-1]C[19],"">0""),2))"。

2.2.3.2 树高平均值自动计算代码编制

J4∶L8 单元格区域为人工分树种填写树高值区,J9、K9、L9 分别对相应树种树高值求平均,以J9 单元格树高平均值自动计算为例。

J9 单元格树高平均值自动计算的主要代码:Range("J9").Select:ActiveCell.FormulaR1C1="=IF(SUM(R[-5]C:R[-1]C)=0,"""",ROUND(SUM(R[-5]C:R[-1]C)/COUNTA(R[-5]C:R[-1]C),0))"。

2.2.3.3 每公顷蓄积自动计算代码编制

N9 单元格杉类每公顷蓄积自动计算的主要 代 码 : Range("N9").Select:ActiveCell.FormulaR1C1="=(IF(RC[-4]="""","""",ROUND(LOOKUP(RC[-4],蓄积量表!R5C1:R18C1,蓄积量表!R5C4:R18C4)*RC[-7],1)))"。

M9 单元格各树种的每公顷蓄积自动求和的主要代码:Range("M9").Select:ActiveCell.FormulaR1C1="=SUM(RC[1]:RC[3])"。

2.2.3.4 树种组成系数自动计算代码编制

各树种的每公顷蓄积与样地各树种的每公顷蓄积之和的比值,以十分法表示。杉、松、阔对应的系数在合并的单元格R4∶R9、S4∶S9、T4∶T9。下面以合并的单元格R4∶R9 为例。

R4∶R9 合并的单元格树种组成系数自动计算的主要代码:Range("R4∶R9").Select∶ActiveCell.FormulaR1C1="=IF(SUM(RC[-15]∶R[4]C[-15])=0,"""",IF(R[5]C[-8]="""","""",ROUND(R[5]C[-4]/R[5]C13*10,0)))"。

2.2.3.5 小班蓄积量自动计算代码编制

纯林:小班蓄积量=小班每公顷蓄积量×小班面积;混交林:小班蓄积量=各组成树种(组)每公顷蓄积量之和×小班面积,各组成树种(组)小班蓄积量=小班蓄积量×各组成树种(组)组成系数。合并单元格V4∶V9、W4∶W9、X4∶X9 分别计算杉、松、阔树种组小班蓄积量,合并单元格U4∶U9 计算小班总蓄积量。下面以合并的单元格V4∶V9 和U4∶U9 为例。

合并单元格V4∶V9 自动计算杉类小班蓄积量主要代码:Range("V4:V9").Select:ActiveCell.FormulaR1C1="=IF(SUM(RC[-19]:R[4]C[-19])=0,0,IF(R[5]C[-12]="""","""",ROUND(RC[-4]*RC[-1]/10,0)))"。

合并单元格U4:U9 自动计算小班总蓄积量主要代码:Range("U4:U9").Select:ActiveCell.FormulaR1C1="=ROUND(RC[-4]*R[5]C[-8],0)":Range("V4:V9").Select:ActiveCell.FormulaR1C1="=IF(SUM(RC[-19]:R[4]C[-19])=0,0,IF(R[5]C[-12]="""","""",ROUND(RC[-4]*RC[-1]/10,0)))"。

2.2.4 表格和公式复制

2013年兴隆乡全乡二类调查林地面积0.56 万hm2,共区划小班1258 个,其中正小班979 个、副小班279 个。为了计算查数方便,通过VBA 操作,对角规调查记录表格和公式进行复制,生成表格,以后只需录入保存就可以了。主要VBA 代码编制如下:

Rows("4:9").Select:Range("B4").Activate:S election.Copy:Dim amount As String: amount=InputBox("请输入有角规数据的正副小班合计数:"):For i=1 To amount:Cells(4+6*i,1).Select:ActiveCell.PasteSpecial:Next。

2.3 VBA 应用

在2013年旌德县森林资源二类调查中,全县林地面积6.5 万hm2,共区划小班14863个,其中正小班12986 个,副小班1877 个。从事这项工作的人都知道,小班卡片内业处理是一个相当大的工作量。该县5 个乡镇的林业调查人员积极参加角规调查小班蓄积量的自动计算程序应用,参加应用者有刚毕业参加工作的年轻大学生,也有工作三十多年、年龄达50 多岁的老林业工作者,使用之后都说“操作简单,结果正确,大大降低了工作量,效果好”。具体步骤是:打开已编制有角规表和蓄积量表的角规调查小班蓄积量自动计算excel 工作簿,在杉松阔角规调查记录工作表中,点击[开发工具]→[宏],弹出宏对话框(如图3),选中宏名为公式编制,点击[执行]按扭,自动计算公式自动填入角规调查记录表相应的单元格内;同样,表格公式复制也是如此操作。这些完成之后,就可以进行角规调查记录数据录入计算,录入完成后,只需对录入数据进行核对,核对无误后,可根据小班号将浅蓝区域的计算结果直接填入小班调查卡片中。

本次二类调查对树种组成,要求由两个树种(组)组成,优势树种(组)占65%以上划为纯林,优势树种(组)达不到65%的划为混交林;由三个或三个以上树种(组)组成,其中不足1成的树种(组)可加至龄级相同的树种(组)合并计算。树种组成按十分法填写,如10 杉、6马4 栎、5 杉5 檫等。填写小班卡片树种组成时,根据上面的要求,稍加注意填写,即可。

图3 宏对话框

3 结语

目前,Excel 应用范围广泛,利用Excel VBA 进行二次开发,编制杉松阔模块的角规调查小班蓄积量自动计算的VBA 代码,可以实现角规调查小班蓄积量的自动计算,节省了二类调查小班蓄积量内业处理的大量时间和精力,提高了工作质量。同理,照此方法,也可以编制松阔阔、杉阔阔模块的角规调查小班蓄积量自动计算的VBA 代码,还可以进一步处理,将小班蓄积量数据引用到小班登记表中,省略重新录入工作,具有较高的实用价值。

[1] 钟声,李远祥,郑开敏编著.Excel2007VBA 入门与提高实例大全[M].重庆:电脑报电子音像出版社,2009.

[2] 安徽省林业厅.安徽森林资源规划设计调查实施细则[M],2003.

[3] 安徽省林业勘察设计院.林业调查设计常用手册[M],1985.

[4] 北京林业大学.测树学[M].北京∶中国林业出版社,1993.

[5] 于政中主编.森林经理学[M].北京∶中国林业出版社,1993.

[6] 安徽省林业厅.安徽森林资源规划设计调查实施细则[M],2012.

猜你喜欢
蓄积量记录表单元格
2022.04.21~2022.05.20国外运载火箭发射记录表
2022.1.21~2022.2.20国外运载火箭发射记录表
合并单元格 公式巧录入
流水账分类统计巧实现
2021.01.21~2021.02.20 国外运载火箭发射记录表
2020.7.21~2020.8.20国外运载火箭发射记录表
玩转方格
玩转方格
当阳市森林植被碳储量及其价值评价
祁连山青海云杉林生物量与碳储量及其影响因素分析