陳蜀 曹劍利
摘 要: 海量數(shù)據(jù)處理是石油地質項目開展過程中的重要工作,若依靠純手工處理工作量巨大。文章提出了基于VBA數(shù)據(jù)批量處理方法,以氣藏數(shù)值模擬工藝改造數(shù)據(jù)的處理為例,在EXCEL中運用VBA進行編程,實現(xiàn)海量射孔數(shù)據(jù)的提取與標準化處理。首先從井史數(shù)據(jù)出發(fā),借助文件對象打開對應井單的射孔數(shù)據(jù)文件,然后循環(huán)提取射孔數(shù)據(jù)中的相關數(shù)據(jù)信息,進行標準化處理后寫入工藝改造數(shù)據(jù)表格中,生成氣藏數(shù)值模擬的基礎數(shù)據(jù)體。針對示范工區(qū)數(shù)據(jù)處理表明,該方法不但極大地提高了氣藏數(shù)值模擬基礎數(shù)據(jù)的整理效率,同時也能克服人工處理因疲勞導致的錯誤,提高了數(shù)據(jù)處理的質量。
關鍵詞: VBA; EXCEL; 海量數(shù)據(jù); 批處理
中圖分類號: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功能強大且提供了豐富的函數(shù)輔助數(shù)據(jù)處理,但仍然不能滿足一些特殊數(shù)據(jù)的處理要求。為了處理一些模型更為復雜的數(shù)據(jù),我們可以利用Excel自帶的開發(fā)環(huán)境VBA實現(xiàn)數(shù)據(jù)處理在某些方面的特殊要求[1-2]。例如:Dydowicz, P.基于VBA對海量公司數(shù)據(jù)進行了批量格式轉換[3]。DJ Zhang利用Excel VBA進行本地奇點分析批量運算[4]。在Excel中,處理少量數(shù)據(jù)的時候可以人工操作處理,當數(shù)據(jù)處理需要不斷重復相同的操作時,可以用Excel中的錄制宏來操作,而當我們處理繁瑣并且重復量很大的數(shù)據(jù)時,VBA的編寫就可以幫助減少大量重復的工作。VBA屬于面向對象的編程語言,具有易理解、語法簡單的特點,加之,VBA是針對某個特定程序開發(fā),利用簡單的代碼即可完成復雜的功能[5-6]。VBA處理數(shù)據(jù)比其他語言處理數(shù)據(jù)需要編寫的代碼量少,簡單易操作,不僅能提高效率節(jié)省時間,還能大大提高數(shù)據(jù)正確率。本文針對VBA在油氣勘探開發(fā)中海量數(shù)據(jù)處理的應用開展了研究,運用其實現(xiàn)了高效地數(shù)據(jù)整理與標準化工作。
1 工作流程
基于VBA的海量數(shù)據(jù)批量處理會涉及多個射孔數(shù)據(jù)表與一個井單表,射孔數(shù)據(jù)表存放于一個單獨的射孔數(shù)據(jù)文件夾中,首先通過循環(huán)一個工作簿中“井號”表單中的井名,依次在射孔數(shù)據(jù)文件夾中查找對應井號的工作簿,并依次將其打開,然后逐個復制其中關鍵信息,粘貼到首次打開的工作簿中的“工藝改造數(shù)據(jù)”表單中指定的位置,經過整理,生成氣藏數(shù)值模擬的基礎數(shù)據(jù)體。
2 實現(xiàn)方法
2.1 文件的讀取
2.1.1 使用FSO對象
讀取射孔數(shù)據(jù)文件夾需要創(chuàng)建一個FSO對象,它不僅可以實現(xiàn)文件的創(chuàng)建、改變、移動和刪除,而且可以檢測是否存在指定的文件夾。此外,F(xiàn)SO 對象模型還可以獲取關于文件和文件夾的信息,如名稱、創(chuàng)建日期或修改日期等以及系統(tǒng)中使用的驅動器的信息。FileSystemObject是FSO對象模型中最主要對象,它提供了一套完整的可用于創(chuàng)建、刪除文件和文件夾,收集驅動器、文件夾、文件相關信息的方法。
創(chuàng)建FSO對象的關鍵代碼:
Set objFileSystem=CreateObject("Scripting
.FileSystemObject")
2.1.2 獲取文件路徑
每口井的射孔數(shù)據(jù)都存放在同一個文件夾中,而數(shù)據(jù)的處理需要先獲取這個文件夾的路徑。
獲取文件夾路徑的關鍵代碼:
strPath=ActiveWorkbook.Path+"\射孔數(shù)據(jù)\"
2.2 設置輸出表頭
工作簿中的“工藝改造數(shù)據(jù)”表中有相應的表頭,在指定的位置寫入對應的表頭,同時,對存放數(shù)據(jù)的區(qū)域單元格進行格式設置。
2.2.1 寫入表頭
在該工作簿中的“工藝改造數(shù)據(jù)”表單中寫入表頭,需要用到Excel中的Range對象,它代表Excel中的單元格,可以是單個單元格,也可以是單元格區(qū)域。通過VBA中的Range屬性,依次將表頭數(shù)據(jù)寫入到指定的單元格中。
寫入表頭關鍵代碼,以A列為例:
Range("A1")="DATE(dd.mm.yyyy)"
2.2.2 設置格式
利用Columns屬性中的NumberFormatLocal屬性,以用戶語言字符串設置對象的格式代碼,將指定區(qū)域的單元格格式設置為文本格式。
設置格式關鍵代碼,以A列為例:
Columns("A").NumberFormatLocal="@"
2.3 數(shù)據(jù)批量提取與處理
2.3.1 打開井號對應的射孔數(shù)據(jù)
⑴ 計算“井號”表單中井口的數(shù)量,首先定義一個wellCount接收“井號”表單中的井口數(shù)量,Range對象的CurrentRegion屬性可以返回包含指定單元格在內的一個連續(xù)的矩形區(qū)域,Rows表示某個區(qū)域中所有行組成的集合,通過Count屬性返回工作簿中所有的工作表數(shù)量。
計算井口數(shù)量關鍵代碼為:
wellCount=Range("A1").CurrentRegion.Rows.Count-1
⑵ 定義一個wellName獲取井號,通過當前活動單元格ActiveCell屬性的Value值,來獲取當前單元格的井號。通過Trim函數(shù),移除字符串兩側的空白字符或其他預定義字符。
獲取井號關鍵代碼為:
wellname=Trim(ActiveCell.Value)
⑶ 打開工射孔數(shù)據(jù)文件,即對應井號的射孔數(shù)據(jù)。定義wellFile存放射孔數(shù)據(jù)文件路徑,通過OFS對象的fileExists方法判斷射孔數(shù)據(jù)文件是否存在,若存在,則通過Workbooks中的Open事件打開射孔數(shù)據(jù)。
打開射孔數(shù)據(jù)關鍵代碼為:
wellFile=strPath+wellname+".xlsx"
If objFileSystem.fileExists(wellFile) Then
Application.Workbooks.Open wellFile
⑷ Worksheet對象的UsedRange屬性可以返回工作表中已經使用的單元格圍成的矩形區(qū)域,首先計算出“工藝改造數(shù)據(jù)”表單中將“工藝改造數(shù)據(jù)”表中已經使用的單元格圍成的矩形區(qū)域的行數(shù),插入“工藝改造數(shù)據(jù)”表并使每個區(qū)域與下一個區(qū)域之間有兩行的距離。通過Range對象的Value屬性為指定的單元格賦值。
以A列為例,關鍵代碼為:
insertWellIndex=ActiveSheet.UsedRange.Rows.Count+2
myRange="A"+Trim(Str(insertWellIndex))
Range(myRange).Value="WELLNAME"
2.3.2 提取所需射孔數(shù)據(jù)寫入到“工藝改造數(shù)據(jù)”表中的指定位置
⑴ 計通過Range對象中的Count屬性計算工作簿2中的射孔數(shù)據(jù)條數(shù)。
計算射孔數(shù)據(jù)條數(shù)關鍵代碼為:
n=Range("A1").CurrentRegion.Rows.Count-1
⑵ 通過循環(huán)判斷射孔數(shù)據(jù)的條數(shù)是否大于1,對射孔數(shù)據(jù)進行遍歷,當射孔數(shù)據(jù)是1條時,說明只有表頭,故不進行操作,進入下一次循環(huán);當射孔數(shù)據(jù)條數(shù)多于1條時,對射孔數(shù)據(jù)中的關鍵信息進行提取,并寫入到 “工藝改造數(shù)據(jù)”表指定單元格中。寫入其他信息,再提取工作簿1中的“井號”表單日期數(shù)據(jù),處理后寫入“工藝改造數(shù)據(jù)”表中的指定單元格中。
以提取頂深為例,主要代碼為:
myRange="B"+Trim(Str(i+1))
Range(myRange).Select
Selection.Copy
'粘貼到指定單元格
myRange="F"+Trim(Str(insertWellIndex+i))
Range(myRange).Select
ActiveSheet.Paste
⑶ 通過Range對象的Value屬性,在“工藝改造數(shù)據(jù)”表單指定單元格中寫入其他信息。
以I列為例,關鍵代碼為:
myRange="I"+Trim(Str(insertWellIndex+i))
Range(myRange).Value=0.2
⑷ 通過Day方法,提取日期中的“日”;Month方法提取日期中的“月”;Year方法提取日期中的“年”。將“年”、“月”、“日”寫入到“工藝改造數(shù)據(jù)”表單中。
以“日”為例,關鍵代碼為:
currDay=Str(Day(currDate))+"."
Sheets("工藝改造數(shù)據(jù)").Select
myRange="A"+Trim(Str(insertWellIndex+i))
Range(myRange).Value=currDay
2.3.3 利用射孔記錄,創(chuàng)建壓裂記錄
復制有效射孔記錄區(qū)塊,將其粘貼到與它相鄰的下一行區(qū)塊,通過Range對象的value屬性修改部分單元格的值,生成壓裂記錄數(shù)據(jù)。
3 應用效果
經過VBA的編程處理,將多個Excel中的射孔數(shù)據(jù)提取并整理在了一個Excel中,使需要的數(shù)據(jù)更規(guī)范整齊。
4 結束語
在石油地質項目中會產生成百上千條井的信息,而用軟件進行油藏成圖時,大部分的數(shù)據(jù)是無效的,在此,有用信息的快速提取顯得至關重要。通過Excel VBA編程,可以將幾百上千個Excel中的射孔數(shù)據(jù)批量提取出指定的關鍵數(shù)據(jù),并將其整理成需要的格式,不但簡單方便,而且極大的提高了效率,節(jié)約了時間還提高了數(shù)據(jù)質量。但需要明確的是,Excel VBA也存在運行速度相對較慢等問題,因此,在實際處理問題時應具體分析是否適合使用這一方法,再做決斷。
參考文獻(References):
[1] 張佩英.自編函數(shù)處理Excel中復雜數(shù)據(jù)[J].實驗室研究與探索,2007.8:150-152
[2] 陳紅柳.Excel 2000中VBA的應用實例[J].職業(yè)教育研究,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