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