關於在Excel VBA中使用方括弧表示Range的問題
經常看到一些別人編寫的VBA代碼中,用到了一個特殊的單元格表示法:方括弧,特別是一些VBA「老鳥」很願意使用這樣的方式,因為寫起代碼來十分方便,同時也顯得自己經驗豐富。那麼到底這樣寫的好處和局限是什麼?為什麼大多數教材或課程都不直接推薦這種方法呢?為避免大家困惑,我們今天就簡單講一下這種表示法的原理,以及它的優缺點。
VBA中最常用的兩種單元格表示法是 Cells 和 Range(其實二者本質上都是Range對象),常見用法如下圖所示,我們都給大家講解過,這裡就不贅述了。
而我們今天講到的另外一種表示方法,就是使用方括弧,也就是大家經常在其他「老手」編寫的案例中看到的樣子。它的用法說起來非常簡單,就是把Range、圓括弧以及雙引號全部換成一對方括弧,就可以了:
我想很多初學VBA的同學一定會很驚訝:有這麼簡單的寫法,為什麼還要大家使用繁瑣的Cells和Range呢?!事實上,目前VBA領域的主流著作和專家大多數都不支持這種用法。我們看一下方括弧的「真面目」,就能搞清楚其中的原因。
方括弧其實只是一個「快捷方式」(shortcut),它真正引用的是Application對象的一個方法,叫做Evaluate。Evaluate方法的作用,簡單理解,就是把一個字元串翻譯成一個有實際意義的程序表達式。比如 x=Application.Evaluate("Sum(A3:B5)"),效果就是把字元串 "Sum(A3:B5)" 轉換成真正的Excel表格公式 Sum(A3:B5),然後運行並把結果賦值給 x 。學過Javascript等語言的同學肯定會知道,Evaluate的功能有多麼強大。所以,如果寫 Application.Evaluate ( "A3:B5"),功能就是把 "A3:B5" 這個字元串轉換為一個真正有意義的 A3:B5,也就是從A3到B5這個矩形區域的單元格Range。由於方括弧是Evaluate的縮寫,所以直接寫[A3:B5]是一樣的效果,而且不用寫字元串的雙引號。
但是這也意味著,當使用 [A3:B5]=5 這種語句時,計算機要先把它轉換為 Evaluate 函數處理,然後在Evaluate函數中,要對字元串 "A3:B5" 做一個「求值"運算,才能得到最終的Range。而對一個字元串求值,需要很多的步驟,包括判斷它是公式還是單元格,是否符合邊界要求等等,因此最終計算效率會有明顯的損失。據別人測試,使用方括弧的程序比直接使用普通類型引用慢 70%(J.Walkenbach, 2014)。所以如果我們需要處理大量單元格,方括弧用法會嚴重影響運行速度。
此外如果大家頻繁使用方括弧,一定也會感覺到,整個代碼的可讀性明顯下降,讀代碼吃力許多,遠沒有明確寫著 Range() 的方式更易懂。所以也有很多專家從代碼風格角度反對使用方括弧。
不過在編程序時,使用方括弧畢竟可以少打很多下鍵盤,而且看起來確實比較酷,所以我們還是會經常看到這種風格的代碼。那麼大家只要看懂就好,自己還是要保持更加清晰、高效的編碼習慣。
推薦閱讀:
※Mysql——將CSV文件導入表中
※網路營銷離不開這4個方面的數據分析
※淺談麥當勞食品的營養價值
※好指標與壞指標
※Python數據分析及可視化實例之基礎-交叉驗證及預測(波士頓房價)(22)
TAG:VBA | MicrosoftExcel | 数据分析 |