树人论文网一个专业的学术咨询网站!!!
树人论文网

工程地质论文发表基于VBA的石油地质数据处理

来源: 树人论文网发表时间:2019-01-15
简要:海量数据处理是石油地质项目开展过程中的重要工作,若依靠纯手工处理工作量巨大。文章提出了基于VBA数据批量处理方法,以气藏数值模拟工艺改造数据的处理为例,在EXCEL中运用V

  海量数据处理是石油地质项目开展过程中的重要工作,若依靠纯手工处理工作量巨大。文章提出了基于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