鈕洪亮 楊 武
(中交第二公路勘察設計研究院有限公司 武漢 430053)
在高速公路設計項目中,各種工程數量的計算與統計是項重要而又繁瑣的工作。在路基路面設計工作中,很多設計內容都是以設計通用圖紙為基礎,依據設計圖確定的單位工程數量逐段計算并統計全線的工程量,編制工程數量總表,如路基防護工程數量表、路基排水工程數量表、路面工程數量表,等等。對于這些工程數量的計算與統計,Micr osoft公司的EXCEL電子表格軟件是最適合的輔助工具,在目前的設計工作中發揮了巨大的作用。但是多數設計人員只運用了EXCEL提供的內置函數和方法,尤其以嵌套的IF語句居多。雖然可以解決一些問題,但是存在計算公式的可讀性差、檢查和復核困難、嵌套層數有限等一些問題,而且對于一個邏輯判斷較復雜的計算過程,僅通過常規的內置函數無疑增加了公式編寫的難度。因此,能夠利用EXCEL提供的VBA編程技術,編制適用于特定要求的自定義函數顯得尤為重要,其不僅可以實現復雜的計算,而且便于計算公式的修改和維護,代碼可讀性高,有利于高效率、高質量地完成各項工程數量的計算工作。本文介紹了在EXCEL中運用VBA編程實現工程數量計算與統計的方法與技巧,并以巴達高速公路兩階段施工圖設計項目中的路基防護工程數量計算為例,介紹其在實際工程中的應用效果。
VBA是Visual Basic f or Application的簡稱,是內嵌于 Microsoft Excel中的程序語言,它的語法結構與Visual Basic極其相似,是為了更高效地使用Excel應用程序而有針對性地優化設置過的Visual Basic。VBA的主要任務是組織或集合Excel程序的功能,它無法脫離Excel環境獨立運行[1]。
EXCEL中的VBA有著豐富的類庫和組件,通過VBA編程可以實現功能強大且復雜的EXCEL擴展應用程序。而針對高速公路設計項目中的工程數量計算而言,僅需其中幾條簡單的語法即可完成幾乎所有的工程數量計算工作,下面對所需的語法歸納總結如下。
語法:Di m par a m As Type
Di m是聲明局部變量的關鍵字,par a m是變量名,As Type是數據類型關鍵字,可以是As Integer(整數)或As Double(雙精度浮點數)或As String(字符串)等。
語法:Function f unna me(par a m As Type,……)As Type
…
End Function
Function是聲明一個函數的關鍵字,f unname是函數名,par am是函數所需要的形參,As Type代表各自的數據類型(同上)。
語法:IF(condition)Then
tr ue_instr uctions
Else f alse_instr uctions
End If
IF-Then是條件判斷構造語句,condition為條件表達式,tr ue時執行tr ue_instr uctions語句,
false時執行f alse_instr uctions語句。適用于2
種或3種選擇的情況。
語法:Select Case testex pression
Case ex pressionlist-n
Instr uctions-n
Case Else
Def ault_instr uctions
End Select
Select Case構造用于在3個或更多的選項之間做選擇的情況,可用于替代多層IF嵌套語句。
語法:For counter =start To end Step stepval
instr uctions
Next counter
For-Next語句是應用最多的一種簡單循環語句。counter以start為起點,以stepval為步距,到End終止循環運行。
在EXCEL中運用VBA編程實現工程數量計算的主要方法就是自定義函數。用VBA編制的自定義函數與EXCEL中的內置函數(如:SUM()求和函數[2])是等價的,應用方法也是相同的。編制一個有自定義函數名和特定運算規則的VBA函數的基本步驟與方法如下。
(1)啟動VBA編程環境。選擇EXCEL應用程序(2003版)中的“工具→宏→Visual Basic編輯器”(或Alt+F11快捷鍵)打開VBA編程環境。然后在左側“工程資源管理器”(若沒有可通過點擊“視圖→工程資源管理器”開啟)窗口中右鍵單擊EXCEL文檔名稱,然后選擇“插入→模塊”菜單,創建一個模塊(默認名稱為“模塊1”,可在屬性面板中重命名)。此時右側出現一個可供輸入代碼的窗口(見圖1),完成VBA編程環境的啟動。

圖1 VBA編程環境界面
(2)編制代碼。在代碼窗口中按照VBA語法規則及用戶意圖輸入代碼。下面以路基防護數量計算中的三維網植草防護數量計算為例,說明自定義一個函數的方法,具體代碼及說明見表1。

表1 示例代碼與說明表
(3)使用自定義函數。在Excel單元格編輯器中輸入“=SWWFH($A2,$B2,$C2,D$1)”即可,$A2,$B2,$C2和D$1單元格分別為lengt h(長度),height(邊坡高度),sl ope(邊坡坡率),mat Type(材料類型)參數的輸入值。
在實際的高速公路工程數量計算中,最為常用的語句就是條件判斷語句(IF語句),但往往因一張工程數量表中涉及到的工程類型很多,不得不采用多層嵌套的IF語句才能夠完成數量計算。這種傳統的計算方法不僅受到EXCEL應用程序本身對IF嵌套層數的限制,而且對于計算公式的復核、修改和維護都變得很困難,尤其在每種工程類型采用各自單獨的計算公式時,很容易因工程類型與計算公式不一致而導致工程數量計算結果有誤。利用EXCEL應用程序的VBA編制自定義函數,可以輕松地避免以上問題,而且對于一個具體的工程數量計算問題,經過對其計算特點的分析,合理地組織程序結構,便可得到一個邏輯嚴緊、層次清晰、易于修改維護、計算準確、應用便捷的工程數量計算表。下面以在巴中至達州高速公路兩階段施工圖設計中采用VBA編程實現的路基防護工程數量計算表為例,介紹所采用的程序結構與應用效果。
路基防護工程數量計算表中一般都會包括多種防護形式,每種防護形式都有各自的材料數量,不同防護形式可能包括相同的材料類型(如M7.5漿砌片石),為了采用統一的計算公式獲得所有防護類型的所有工程數量,設計如下程序結構:
'按防護類型計算數量
Select Case typeProj ect
Case…
Case"02-三維掛網" '掛三維網噴播植草
Quantit y =SWWF H(length,height,slope,mat-Type)
Case…
End Select
End Function
'掛三維網噴播植草工程數量
Private Function SWWF H (length…,mat Type As String)As Double
…
Select Case mat Type
Case"三維網" '三維網面積
SWWFH =SWWF H =area*1.0354 'm2
Case…
End Select
End Function
…… 其他防護類型工程數量計算函數
'獲取工程數量主函數
Public Function Quantity(start Stake … ,typeP-roj ect As String,mat Ty pe As String)As Double
Quantity()函數為數量計算的主函數,也是在EXCEL表格中調用的唯一函數,采用公有(Public)屬性,其他函數(如SWWFH())在 EXCEL表格中不需要調用,只被Quantity()主函數引用,采用私有(Private)屬性。Quantity()主函數除了基本的起點樁號、終點樁號、邊坡高度、邊坡坡率等參數外,另外還包括了typePr oject防護形式和mat Type材料類型2個參數,通過2次Select Case條件選擇獲得某種防護形式中的某種材料的數量。在EXCEL表格所有的工程數量單元格中調用Quantity()函數,利用單元格數據的有效性及鎖定功能,即可得到應用便捷的路基防護工程數量計算表,見圖2。

圖2 利用VBA編程實現的路基防護工程數量表
通過在巴中至達州高速公路設計項目中對利用VBA編程實現路基防護工程數量計算的實際應用,得出如下結論:
(1)利用EXCEL應用程序中的VBA編程功能,可以有效地避免采用多層嵌套IF語句所帶來的不便,有利于提高工作效率和計算的準確性。
(2)利用EXCEL應用程序中的VBA編程功能,可以實現統一的計算函數,避免了一個EXCEL表中因包含多個計算公式而帶來的混淆計算錯誤問題。
(3)利用EXCEL應用程序中的VBA編程功能,可以將所有的計算代碼集中在一起,利用Select Case語句代替IF語句,使代碼的層次更加清晰,可讀性高,便于公式的復核、修改和維護。
(4)結合EXCEL應用程序中的單元格數據有效性、鎖定和表格保護等功能,能夠實現類似程序輸入界面的計算表格,使數據輸入區與計算結果區完全分開,有效地避免了對計算公式的無意修改,同時參數輸入集中,操作便捷。
(5)能夠適用于高速公路設計項目中所有的工程數量計算,涉及到的VBA語法少而簡單,便于推廣應用。
[1] John Walkenbach.Excel 2003高級 VBA編程寶典[M].北京:電子工業出版社,2005.
[2] John Walkenbach.Excel 2002公式與函數應用寶典[M].北京:電子工業出版社,2002.