陈蜀 曹剑利
摘 要: 海量数据处理是石油地质项目开展过程中的重要工作,若依靠纯手工处理工作量巨大。文章提出了基于VBA数据批量处理方法,以气藏数值模拟工艺改造数据的处理为例,在EXCEL中运用VBA进行编程,实现海量射孔數据的提取与标准化处理。首先从井史数据出发,借助文件对象打开对应井单的射孔数据文件,然后循环提取射孔数据中的相关数据信息,进行标准化处理后写入工艺改造数据表格中,生成气藏数值模拟的基础数据体。针对示范工区数据处理表明,该方法不但极大地提高了气藏数值模拟基础数据的整理效率,同时也能克服人工处理因疲劳导致的错误,提高了数据处理的质量。
关键词: VBA; EXCEL; 海量数据; 批处理
中图分类号:TP399 文献标志码:A 文章编号:1006-8228(2018)09-48-03
Abstract: Massive data processing is often faced in the process of petroleum geological projects, and it is hard by manual process. This paper proposes a data batch processing method via VBA. Taking the data processing of numerical simulation process for gas reservoir as an example, the Excel spreadsheet is used with VBA programming to realize the massive perforation data extraction and standardized processing. Firstly, from well history data, opening the perforation data file of the corresponding well sheet with the help of the file object, then circularly extracting relevant data information from perforation data and writing into the data form of process modification after standardized processing, at last generating the basic data volume for numerical simulation of gas reservoir. Data processing for demonstration area shows that this method not only greatly improves the efficiency of sorting out the basic data of gas reservoir numerical simulation but also overcomes the errors caused by fatigue and improves the quality of data processing.
Key words: VBA; Excel; massive data; batch processing
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