胡新惠
廣東中山地質(zhì)工程勘察院 廣東 中山 528400
正文:
理正工程地質(zhì)勘察軟件因具有功能強大、性能穩(wěn)定及通用性強的優(yōu)點而被廣泛應(yīng)用于工程勘察內(nèi)業(yè)資料整理工作中。當(dāng)勘察項目規(guī)模大、場地地層情況復(fù)雜時,若直接在軟件界面上進(jìn)行數(shù)據(jù)錄入,往往工作會十分繁瑣,且容易出錯。Excel軟件數(shù)據(jù)處理功能強大,界面友好,交互性強,且具有二次開發(fā)功能。若直接在Excel軟件上進(jìn)行勘察資料錄入,然后生成接口文件導(dǎo)入理正勘察軟件中再進(jìn)行下一步工作,則可以大大提高勘察工作的效率。本文結(jié)合工程實例,介紹采用VBA語言在Excel軟件上開發(fā)新功能的方法。該新功能可將Excel表格內(nèi)按特定格式錄入的數(shù)據(jù)轉(zhuǎn)換為能被理正勘察軟件識別的文本格式接口文件。
理正勘察軟件接口文件的內(nèi)容可以包含勘察項目的各種數(shù)據(jù),每種數(shù)據(jù)又由不同的成員組成。理正勘察軟件的幫助文檔對接口文件的格式及數(shù)據(jù)有詳細(xì)的說明(見表1)。這些數(shù)據(jù)的成員一般可由軟件界面輸入。接口文件中的數(shù)據(jù)類型有幾十種之多;每個數(shù)據(jù)的成員又有幾個到幾十個不等。通常,在對一個勘察項目進(jìn)內(nèi)業(yè)資料整理時,僅需要用到幾種常見的數(shù)據(jù),以及數(shù)據(jù)中幾個常用的成員。
表1 理正勘察軟件接口文件常用數(shù)據(jù)說明表
接口文件格式說明:
(1)同一行中數(shù)據(jù)以制表符(Tab鍵)分隔,如果某些字段的值為空直接用Tab鍵跳過,不能用空格鍵代替Tab鍵。每行數(shù)據(jù)表示一條記錄。
(2)在輸入鉆孔數(shù)據(jù)時前四個字符必須為#ZK#,輸入土層數(shù)據(jù)時前四個字符必須為#TC#,輸入取樣數(shù)據(jù)時前四個字符必須是#QY#。原位試驗和室內(nèi)試驗按格式對應(yīng)不同的字符交互相應(yīng)的數(shù)據(jù)。
(3)輸入接口數(shù)據(jù)時,一個鉆孔對應(yīng)有多個土層數(shù)據(jù)、多個原位試驗數(shù)據(jù)、多個取樣數(shù)據(jù)和室內(nèi)試驗數(shù)據(jù);則每條記錄前都需輸入其相對應(yīng)的字符。
理正勘察軟件中關(guān)于勘察項目的全部錄入信息量比較龐大。但在實際工作中,我們可能僅僅需要一小部分信息。本文以在Excel 2010軟件上生成理正CAD8.5PB2格式接口文件的范例來闡述生成接口文件的方法。同時,本實例主要對勘察項目中的鉆孔土層信息中常用數(shù)據(jù)進(jìn)行處理。
生成理正勘察接口文件之前,需要在Excel表格中按一定格式輸入相應(yīng)數(shù)據(jù),首先需要進(jìn)行相應(yīng)的數(shù)據(jù)錄入界面設(shè)計。本文范例設(shè)計的Excel表格界面如圖1所示。圖中白色區(qū)域為數(shù)據(jù)錄入?yún)^(qū)域。
圖1 數(shù)據(jù)錄入界面
圖1 界面中包含四個按鈕(“清理內(nèi)容”、“生成標(biāo)準(zhǔn)地層”、“刪除行”及“生成接口文件”),均為ActiveX控件。“清理內(nèi)容”按鈕的作用是清空數(shù)據(jù)輸入?yún)^(qū)域既有的內(nèi)容,為后續(xù)數(shù)據(jù)輸入準(zhǔn)備?!吧蓸?biāo)準(zhǔn)地層”按鈕的作用是根據(jù)第一個鉆孔錄入的地層信息以及總孔數(shù),在界面上為第一個孔之外的每個孔生成與第一個孔一樣的地層信息?!皠h除行”按鈕的作用是在數(shù)據(jù)編輯過程中,刪除光標(biāo)所在行?!吧山涌谖募卑粹o的作用是當(dāng)每個孔的錄入信息都準(zhǔn)備好并檢查無誤時,生成能被理正CAD8.5PB2識別并讀入的文本格式文件。
VBA代碼的編制一般在VBE環(huán)境中進(jìn)行??梢酝ㄟ^如下方式進(jìn)入VBE環(huán)境:點擊Excel工作薄菜單欄中開發(fā)工具選項卡,使選項卡中的設(shè)計模式按鈕處于選中狀態(tài)。然后雙擊界面中的按鈕,便可進(jìn)入到VBE(VBA的編程環(huán)境)界面中,如圖2所示。每個按鈕均有一段相應(yīng)代碼與之對應(yīng)。
圖2 VBE環(huán)境
2.2.1 “清理內(nèi)容”相關(guān)代碼
Dim ColNum, RowNum As Long '表格總列數(shù)與總行數(shù)
Dim AcColNum As Long '表格實際內(nèi)容占據(jù)的列數(shù)
Dim AllRange, ClearRange As Range
ColNum = ActiveSheet.Cells.Columns.Count
RowNum = ActiveSheet.Cells.Rows.Count
AcColNum = Cells(3, ColNum).End(xlToLeft).Column
Set ClearRange = Union(Range(Cells(4, 1), Cells(RowNum,ColNum)), Range(Cells(1, AcColNum + 1), Cells(4, ColNum)))
ClearRange.Clear
2.2.2 “生成標(biāo)準(zhǔn)地層”相關(guān)代碼
Dim ZKNum, DicenNum, ColNum, RowNum, Tempi, ZKLen,ZKStNum, AcColNum As Long '鉆孔數(shù)、地層數(shù)、表格列數(shù)、表格行數(shù)、臨時變量、鉆孔字符長度、鉆孔起始編號、實際列數(shù)
Dim ZKStr As String '鉆孔字符
Dim TempRng '臨時區(qū)域
ColNum = ActiveSheet.Cells.Columns.Count
RowNum = ActiveSheet.Cells.Rows.Count
DicenNum = ActiveSheet.Cells(RowNum, 2).End(xlUp).Row - 3
If (DicenNum > 0) Then
ZKNum = Application.InputBox(Prompt:="輸入鉆孔個數(shù)", Title:="孔數(shù)", Type:=1)
If (ZKNum > 1) Then
ZKStr = Left(Cells(4, 1), 2)
ZKLen = Len(Cells(4, 1))
ZKStNum = CLng(Right(Cells(4, 1), ZKLen - 2))
AcColNum = Cells(3, ColNum).End(xlToLeft).Column
For Tempi = 2 To ZKNum
Range(Cells(4, 2), Cells(DicenNum + 3, AcColNum)).Copy Range(Cells((Tempi - 1) * DicenNum + 4, 2), Cells(Tempi * DicenNum +3, AcColNum))
Cells((Tempi - 1) * DicenNum + 4, 1) = ZKStr ﹠ (Tempi + ZKStNum- 1)
If Tempi Mod 2 = 0 Then Range(Cells((Tempi - 1) * DicenNum + 4,1), Cells(Tempi * DicenNum + 3, AcColNum)).Interior.ColorIndex = 33
Next Tempi
End If
End If
2.2.3 “刪除行”相關(guān)代碼
Selection.EntireRow.Delete
2.2.4 “生成接口文件”相關(guān)代碼
Dim FoldPos, Tempi, DicenNum, RowNum As Long '文件夾字符數(shù)、臨時變量、總地層個數(shù)、表格總行數(shù)
Dim FileName, FolderAddress, DicengFile As String '文件名、文件夾及地層文件
Dim ZKStr, InputZK, DCInfo, InputInfo As String '鉆孔名及錄入數(shù)據(jù)
FileName = ThisWorkbook.FullName
FoldPos = InStrRev(FileName, "")
FolderAddress = Left(FileName, FoldPos) '文件夾
DicengFile = FolderAddress ﹠ Cells(2, 10) ﹠ "diceng.txt" '地層文件
Open DicengFile For Output As #1
RowNum = ActiveSheet.Cells.Rows.Count
DicenNum = ActiveSheet.Cells(RowNum, 2).End(xlUp).Row - 3
For Tempi = 4 To DicenNum + 3
ZKStr = Replace(Cells(Tempi, 1), " ", "")
If Len(ZKStr) > 0 Then
InputZK = "#ZK#" ﹠ ZKStr
Print #1, InputZK
End If
InputInfo = "#TC#" ﹠ Cells(Tempi, 6) ﹠ Chr(9) ﹠ Cells(Tempi, 5) ﹠String(2, Chr(9)) '輸入信息添加土層名稱及層底深度并到主層編號前
DCInfo = Replace(Cells(Tempi, 2), " ", "") '獲取主層編號數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo ﹠ Chr(9) '輸入信息添加主層號并到亞層編號前
Else
InputInfo = InputInfo ﹠ Chr(9)
End If
DCInfo = Replace(Cells(Tempi, 3), " ", "") '獲取亞層編號數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo ﹠ Chr(9) '輸入信息添加亞層號并到次亞層編號前
Else
InputInfo = InputInfo ﹠ Chr(9)
End If
DCInfo = Replace(Cells(Tempi, 4), " ", "") '獲取次亞層編號數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo ﹠ Chr(9) '輸入信息添加次亞層號并到地質(zhì)時代編號前
Else
InputInfo = InputInfo ﹠ Chr(9)
End If
DCInfo = Replace(Cells(Tempi, 7), " ", "") '獲取地質(zhì)時代數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo ﹠ Chr(9) '輸入信息添加地質(zhì)時代并到成因前
Else
InputInfo = InputInfo ﹠ Chr(9)
End If
DCInfo = Replace(Cells(Tempi, 8), " ", "") '獲取成因數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo ﹠ String(7, Chr(9)) '輸入信息添加地質(zhì)時代并到風(fēng)化程度前
Else
InputInfo = InputInfo ﹠ String(7, Chr(9))
End If
DCInfo = Replace(Cells(Tempi, 9), " ", "") '獲取風(fēng)化程度數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo ﹠ String(7, Chr(9)) '輸入信息添加風(fēng)化程度并到描述號前
Else
InputInfo = InputInfo ﹠ String(7, Chr(9))
End If
DCInfo = Replace(Cells(Tempi, 10), " ", "") '獲取描述數(shù)據(jù)
If Len(DCInfo) > 0 Then
InputInfo = InputInfo ﹠ DCInfo '輸入信息添加描述數(shù)據(jù)
Else
InputInfo = InputInfo ﹠ Chr(9)
End If
Print #1, InputInfo
Next
Close #1
當(dāng)每個鉆孔的錄入信息都已輸入并檢查無誤時,點擊“生成接口文件”按鈕就可以生成能被理正CAD8.5PB2識別并讀入的文本格式文件,該文件與Excel界面文件保存于同一目錄中。本范例中與圖1界面中所輸入內(nèi)容相對應(yīng)的接口文件如圖3所示。
圖3 理正接口文件
本文結(jié)合工程實例,介紹了利用VBA編程在Excel軟件中生成理正勘察軟件接口文件的方法。為巖土工程勘察數(shù)據(jù)處理提供了一個新的思路。該方法已經(jīng)在實際工程中有所應(yīng)用,大大減輕了工程人員的勞動強度,節(jié)省了人力投入,同時滿足了勘察工作內(nèi)業(yè)處理進(jìn)度的要求,保證了數(shù)據(jù)處理的準(zhǔn)確性,已初步顯現(xiàn)出良好的應(yīng)用價值。