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