海量数据处理是石油地质项目开展过程中的重要工作,若依靠纯手工处理工作量巨大。文章提出了基于VBA数据批量处理方法,以气藏数值模拟工艺改造数据的处理为例,在EXCEL中运用VBA进行编程,实现海量射孔數据的提取与标准化处理。首先从井史数据出发,借助文件对象打开对应井单的射孔数据文件,然后循环提取射孔数据中的相关数据信息,进行标准化处理后写入工艺改造数据表格中,生成气藏数值模拟的基础数据体。针对示范工区数据处理表明,该方法不但极大地提高了气藏数值模拟基础数据的整理效率,同时也能克服人工处理因疲劳导致的错误,提高了数据处理的质量。
《贵州地质》是本刊1984创刊,国内外公开发行,季刊。贵州省地质矿产勘查开发局主管,贵州省地质调查院主办的公开发行的科技季刊。其主要任务是:反映我省地学进展和科研成果,介绍国内外地学发展动态,报道地学界重大事件,为我省的社会经济发展普及地学知识,为我省的地学发展培育人才。
0 引言
虽然Excel功能强大且提供了丰富的函数辅助数据处理,但仍然不能满足一些特殊数据的处理要求。为了处理一些模型更为复杂的数据,我们可以利用Excel自带的开发环境VBA实现数据处理在某些方面的特殊要求[1-2]。例如:Dydowicz, P.基于VBA对海量公司数据进行了批量格式转换[3]。DJ Zhang利用Excel VBA进行本地奇点分析批量运算[4]。在Excel中,处理少量数据的时候可以人工操作处理,当数据处理需要不断重复相同的操作时,可以用Excel中的录制宏来操作,而当我们处理繁琐并且重复量很大的数据时,VBA的编写就可以帮助减少大量重复的工作。VBA属于面向对象的编程语言,具有易理解、语法简单的特点,加之,VBA是针对某个特定程序开发,利用简单的代码即可完成复杂的功能[5-6]。VBA处理数据比其他语言处理数据需要编写的代码量少,简单易操作,不仅能提高效率节省时间,还能大大提高数据正确率。本文针对VBA在油气勘探开发中海量数据处理的应用开展了研究,运用其实现了高效地数据整理与标准化工作。
1 工作流程
基于VBA的海量数据批量处理会涉及多个射孔数据表与一个井单表,射孔数据表存放于一个单独的射孔数据文件夹中,首先通过循环一个工作簿中“井号”表单中的井名,依次在射孔数据文件夹中查找对应井号的工作簿,并依次将其打开,然后逐个复制其中关键信息,粘贴到首次打开的工作簿中的“工艺改造数据”表单中指定的位置,经过整理,生成气藏数值模拟的基础数据体。
2 实现方法
2.1 文件的读取
2.1.1 使用FSO对象
读取射孔数据文件夹需要创建一个FSO对象,它不仅可以实现文件的创建、改变、移动和删除,而且可以检测是否存在指定的文件夹。此外,FSO 对象模型还可以获取关于文件和文件夹的信息,如名称、创建日期或修改日期等以及系统中使用的驱动器的信息。FileSystemObject是FSO对象模型中最主要对象,它提供了一套完整的可用于创建、删除文件和文件夹,收集驱动器、文件夹、文件相关信息的方法。
创建FSO对象的关键代码:
Set objFileSystem=CreateObject("Scripting
.FileSystemObject")
2.1.2 获取文件路径
每口井的射孔数据都存放在同一个文件夹中,而数据的处理需要先获取这个文件夹的路径。
获取文件夹路径的关键代码:
strPath=ActiveWorkbook.Path+"\射孔數据\"
2.2 设置输出表头
工作簿中的“工艺改造数据”表中有相应的表头,在指定的位置写入对应的表头,同时,对存放数据的区域单元格进行格式设置。
2.2.1 写入表头
在该工作簿中的“工艺改造数据”表单中写入表头,需要用到Excel中的Range对象,它代表Excel中的单元格,可以是单个单元格,也可以是单元格区域。通过VBA中的Range属性,依次将表头数据写入到指定的单元格中。
写入表头关键代码,以A列为例:
Range("A1")="DATE(dd.mm.yyyy)"
2.2.2 设置格式
利用Columns属性中的NumberFormatLocal属性,以用户语言字符串设置对象的格式代码,将指定区域的单元格格式设置为文本格式。
设置格式关键代码,以A列为例:
Columns("A").NumberFormatLocal="@"
2.3 数据批量提取与处理
2.3.1 打开井号对应的射孔数据
⑴ 计算“井号”表单中井口的数量,首先定义一个wellCount接收“井号”表单中的井口数量,Range对象的CurrentRegion属性可以返回包含指定单元格在内的一个连续的矩形区域,Rows表示某个区域中所有行组成的集合,通过Count属性返回工作簿中所有的工作表数量。
计算井口数量关键代码为:
wellCount=Range("A1").CurrentRegion.Rows.Count-1
⑵ 定义一个wellName获取井号,通过当前活动单元格ActiveCell属性的Value值,来获取当前单元格的井号。通过Trim函数,移除字符串两侧的空白字符或其他预定义字符。
获取井号关键代码为:
wellname=Trim(ActiveCell.Value)
⑶ 打开工射孔数据文件,即对应井号的射孔数据。定义wellFile存放射孔数据文件路径,通过OFS对象的fileExists方法判断射孔数据文件是否存在,若存在,则通过Workbooks中的Open事件打开射孔数据。
打开射孔数据关键代码为:
wellFile=strPath+wellname+".xlsx"
If objFileSystem.fileExists(wellFile) Then
Application.Workbooks.Open wellFile
⑷ Worksheet对象的UsedRange属性可以返回工作表中已经使用的单元格围成的矩形区域,首先计算出“工艺改造数据”表单中将“工艺改造数据”表中已经使用的单元格围成的矩形区域的行数,插入“工艺改造数据”表并使每个区域与下一个区域之间有两行的距离。通过Range对象的Value属性为指定的单元格赋值。
以A列为例,关键代码为:
insertWellIndex=ActiveSheet.UsedRange.Rows.Count+2
myRange="A"+Trim(Str(insertWellIndex))
Range(myRange).Value="WELLNAME"
2.3.2 提取所需射孔数据写入到“工艺改造数据”表中的指定位置
⑴ 计通过Range对象中的Count属性计算工作簿2中的射孔数据条数。
计算射孔数据条数关键代码为:
n=Range("A1").CurrentRegion.Rows.Count-1
⑵ 通过循环判断射孔数据的条数是否大于1,对射孔数据进行遍历,当射孔数据是1条时,说明只有表头,故不进行操作,进入下一次循环;当射孔数据条数多于1条时,对射孔数据中的关键信息进行提取,并写入到 “工艺改造数据”表指定单元格中。写入其他信息,再提取工作簿1中的“井号”表单日期数据,处理后写入“工艺改造数据”表中的指定单元格中。
以提取顶深为例,主要代码为:
myRange="B"+Trim(Str(i+1))
Range(myRange).Select
Selection.Copy
'粘贴到指定单元格
myRange="F"+Trim(Str(insertWellIndex+i))
Range(myRange).Select
ActiveSheet.Paste
⑶ 通过Range对象的Value属性,在“工艺改造数据”表单指定单元格中写入其他信息。
以I列为例,关键代码为:
myRange="I"+Trim(Str(insertWellIndex+i))
Range(myRange).Value=0.2
⑷ 通过Day方法,提取日期中的“日”;Month方法提取日期中的“月”;Year方法提取日期中的“年”。将“年”、“月”、“日”写入到“工艺改造数据”表单中。
以“日”为例,关键代码为:
currDay=Str(Day(currDate))+"."
Sheets("工艺改造数据").Select
myRange="A"+Trim(Str(insertWellIndex+i))
Range(myRange).Value=currDay
2.3.3 利用射孔记录,创建压裂记录
复制有效射孔记录区块,将其粘贴到与它相邻的下一行区块,通过Range对象的value属性修改部分单元格的值,生成压裂记录数据。
3 应用效果
经过VBA的编程处理,将多个Excel中的射孔数据提取并整理在了一个Excel中,使需要的数据更规范整齐。
4 结束语
在石油地质项目中会产生成百上千条井的信息,而用软件进行油藏成图时,大部分的数据是无效的,在此,有用信息的快速提取显得至关重要。通过Excel VBA编程,可以将几百上千个Excel中的射孔数据批量提取出指定的关键数据,并将其整理成需要的格式,不但简单方便,而且极大的提高了效率,节约了时间还提高了数据质量。但需要明确的是,Excel VBA也存在运行速度相对较慢等问题,因此,在实际处理问题时应具体分析是否适合使用这一方法,再做决断。
参考文献(References):
[1] 张佩英.自编函数处理Excel中复杂数据[J].实验室研究与探索,2007.8:150-152
[2] 陈红柳.Excel 2000中VBA的应用实例[J].职业教育研究,2005.2:120-121
[3] Dydowicz,p.(2013). VBA as a tool for improving outputs from mass data processing,3.1313-1322
[4] Zhang D, Cheng Q, Agterberg F, et al. An improved solution of local window parameters setting for local singularity analysis based on Excel VBA batch processing technology[J]. Computers&Geosciences;,2016.88(C):54-66
[5] 焦萍萍,周顯春.EXCEL中的VBA程序设计[J].电脑知识与技术,2016.11(12):63-64
[6] 李晓玫,杨小平.Excel中的VBA程序设计[J].四川师范大学学报(自然科学版),2004.4:423-426