基于Excel-VBA的深水井柱状图绘制程序的设计和实现

2015-08-19 08:35刘守东李怡文河南省周口水文水资源勘测局
河南水利与南水北调 2015年22期
关键词:柱状图标尺单元格

□刘守东 □李怡文(河南省周口水文水资源勘测局)

0 引言

绘制钻孔柱状图是凿井工作中的一项重要工作。随着计算机图形技术的普及,利用计算机绘制深水井柱状图取代了费时、费力、容易出错的传统手工绘制方法逐渐成为了主流。目前,计算机绘制柱状图主要是利用MapGis、AutoCad 等商业绘图软件制作,往往需要大量的软件授权费。针对上述问题,特别是只需要生成柱状图的简单绘图场合,文章提出了一种新的解决方案:采用MicrosoftExcel 为基础平台,利用MicrosoftExcel 内嵌的VBA 编程环境,快速生成深水井柱状图。

1 深水井柱状图的数据组织结构

如图1所示,一张典型的深水井柱状图可以拆分3 个部分:表头、深度标尺、累进的地层数据。表头、深度标尺格式固定,不需要专门组织数据描述,因此描述一张深水井柱状图只需组织数据描述累进的地层数据即可。累进的地层数据由一个个的地层数据组成,每一个地层数据又包含5 个属性,分别是:层底深度、层厚、剖面、岩性、井斜。其中,剖面为填充图形,可由地层数据的岩性属性推出,故在程序设计中,用层底深度、层厚、岩性、井斜4 个属性来描述一个地层数据。利用MicrosoftExcel 数据表本身的行列组织性质,柱状图累进的地层数据可以如下组织:

以数据表一行表达单个地层数据,递增的行数表达地层数据累进的关系。以数据表中一行的前4 列表达单个地层数据的层底深度、层厚、岩性、井斜4 个属性。

图1 典型深水井柱状图及组成部分示例图

如图2所示,绘制一张深层井柱状图就简化为输入以MicrosoftExcel 数据表本身行列组织结构表达的累进地层数据。

2 深水井柱状图的描绘

如图1所示,一张典型的深水井柱状图可以拆分3 个部分:表头、深度标尺、累进的地层数据。相应的柱状图的描绘也是分为同样的3 部分先后描绘。

图2 累进地图数据在MicrosoftExcel 中的表达图

2.1 表头的绘制

由于表头格式固定且需要工作表来容纳即将生成的深水井柱状图,故事先在工作簿中建立含有完整表头的工作表。将事先建立的包含表头的工作表通过VBA 操作拷贝重命名即可完成上述两项任务。

表头绘制主要涉及对工作表对象的操作,相关模块的伪码如下:

//复制“原件”工作表;

Sheets("原件").CopyBefore:=Sheets(2);

//将复制的工作表重命名;

Sheets("原件(2)").Name="柱状图"。

2.2 深度标尺的绘制

深度标尺涉及深度数据的表达的同时,还需要表达出地层数据的精度,例如层底深度最常见的是精确到小数点后一位或者两位。MicrosoftExcel 中没有相关的概念,为此程序设计中利用单元格行高来表达精度、将多个单元格合并来表达深度数据。以图一所示柱状图为例,每个深度标尺为25m,地层数据的精度为小数点后两位。为了表达出此柱状图的深度和精度数据,使用VBA 操作单元格对象,将绘图区单元格行高设置为0.01,同一列的2500 个单元格合并成一个单元格,以此合并后的单元格作为一个深度标尺。由于深度标尺是以一定量累进的,使用VBA 中的For-Next 语句构建循环,以此以上述方法依次画出每一个深度标尺。

深度标尺绘制主要涉及对单元格对象的操作,以图一所示柱状图为例,相关模块的伪码如下:

//柱状图开始的地层深度;

DimiBgnAsInteger;

//柱状图结束的地层深度

DimiEndAsInteger

//计算绘图区所需要的行数并在For-Next 循环中设置每一行行高

ForrowCnt=5To((iEnd-iBgn)/25+1)*2500+5

//设置一行行高

Rows(rowCnt).RowHeight=0.01

Next

//计算出需要描绘的深度标尺数量

DimiCntAsInteger

iTmp1=(iEnd+12.499)/25

iTmp2=(iBgn-12.499)/25

iCnt=iTmp1-iTmp2

//For-Next 循环中,描绘每一个深度标尺

Forcnt=0ToiCnt-1

//计算出所需要描绘深度标尺所占单元格,并选择

Cells(5+cnt*2500,1).Resize(2500,1).Select

//合并选中的单元格

Selection.Merge

//设置合并后单元格的字体、对其方式等各种属性

WithSelection

.HorizontalAlignment=xlCenter

.VerticalAlignment=xlBottom

…….

//计算当前单元格对应深度标尺的深度并设置

DimiTmpAsInteger

iTmp=(iBgn-12.499)/25+cnt+1

ActiveCell.Value=iTmp*25

Next

2.3 地层数据的绘制

地层数据的绘制类似于深度标尺的绘制,不同的是:地层数据根据其层厚属性来决定需要合并的单元格,依次在不同列的合并单元格里填充属性数字和填充图形。

柱状图剖面列为填充图形,由地层数据的岩性属性推出。为此,在程序设计中,将每种岩性和其要填充的图形单独列出(如图3所示)。描画时,读取岩性属性,利用VBA 的查找函数,找出该岩性属性所在单元行。根据查找到的行,偏移一列,读取该单元格的图案属性,将查到的图案属性填充到柱状图剖面列所要填充的合并单元格中。

图3 岩性填充图

剖面列图形填充主要涉及对VBA 的查找功能以及单元格对象属相的赋值,以图1所示柱状图为例,相关模块的伪码如下:

3 结语

目前该程序设计只是基于特定柱状图描画(游标刻度尺25m递进,地层数据精确的小数点后两位)设计,在用户友好性和通用性方面有所不足。在实际使用中,可将柱状图可变量,例如游标刻度尺递进数、地层数据精确度,设计成输入变量,根据读取的数值描画,增加程序的通用性。同时,在输入界面加入对话框、按钮,做到一键描画,增加程序的易用性。

猜你喜欢
柱状图标尺单元格
如何立起廉洁自律硬标尺?
流水账分类统计巧实现
基于Unity3D 的冒泡排序算法动态可视化设计及实现
玩转方格
玩转方格
学好党章,立好“四个标尺”
“李云龙式”干部如何发现,怎样用好——这也是为担当者担当、为干事者撑腰的重要标尺
浅谈Excel中常见统计个数函数的用法
高中地理图像图表题解析技巧之管窥
由科研论文中一个柱状图引发的编辑思考