Excel VBA 基礎(03.1) - Excel對象模型之Range (一)

以下為基礎第二部分的重點,在進入第三部分之前請確保相關知識點已經掌握無誤,

1、試列舉遞歸的例子。

2、流程式控制制語句你知道哪些?

3、試描述Fori 以及 Foreach 的特點以及執行過程。

4、循環內部跳出循環的語句是什麼?

5、如何查看Excel VBA中的對象?如何從對象瀏覽器中區分屬性或方法?如何訪問屬性或方法?

6、字元串,數字,日期類型的常用函數有哪些?

如果有些知識點記憶不清楚,請務必再看一看相關的文章並且閉卷敲一敲示例代碼。如果上述問題你都能給出準確的答案,那麼恭喜你,你已經比我在實踐中遇到的絕大多數運用VBA的財務人員都要強。

從基礎第三部分開始,我們要講述Excel VBA的核心以及進階部分。其中Range(區域對象) 無疑是整個Excel VBA的靈魂。

什麼是Range? 簡單理解,即同一個工作表中一個或多個單元格組成的區域。介紹 類(Class) 之前,可以將Range理解為一種數據類型。之前說過Selection就是Range類型,這也就意味著Range類型所適用的屬性以及方法同樣也適用於Selection。

臭名昭著的select就是 Range 的方法之一。它的作用是,將目標區域值賦給Application的屬性Selection,分析如下程序片段。

Range("C1").Select 相當於 Set Selection = Range("C1") 區別是 Select 會在 圖形用戶界面顯示 並且 觸發綁定事件 引用類型賦值時 採用Set關鍵字, 注意區別 基本類型Range("C1").Select 此時 Selection 即為 Range("C1"), 99%的場景下 都用不到Select方法 在 99.9%的場景下 都可以 寫成 Range("C1").Value = 1Selection.Value = 1

如果沒有具體限定,Range("C1") 對象的全稱是 ActiveWorksheet.Range("C1"), 即默認所指為活動工作簿的活動工作表下C1單元格。 就好比在中國範圍內 談到 荊州 這個地名,一般不會刻意強調 中國 湖北 荊州。但是在世界範圍內 說到 牛津 時,為了避免誤解 則要指出 是 美國 麻省 牛津 還是位於 英國的 牛津。同理,多工作表操作甚至多工作簿操作時,具體限定所指工作表&工作簿則尤為必要。

標準全名Workbooks("工作簿名").Worksheets("工作表名").Range("C1") 省略 工作簿名 ,默認為 ActiveWorkbook,即活動工作簿中相應工作表的相應單元格Worksheets("工作表名").Range("C1") 同時省略 兩要素,默認為 ActiveWorksheet,即活動工作表中相應單元格Range("C1")

對於Excel VBA對象模型一知半解的教程作者則會告訴你,跨工作表操作之前一定要 激活(Activate)目標工作表 。因為他們完全不知道,對目標Range對象前面還能加上相關工作表限定。

這種 作用域 的思維其實在我們介紹 模塊 以及解釋器執行順序時就已經接觸過。範圍限定 對於其他編程語言也再平常不過,C#中的namespace, python/java中的import等等。

真正掌握Excel VBA精髓的程序員是不會容忍自己的程序通篇出現Select 和 Activate 的,另一角度來說,這也成為鑒別教程質量的一個最簡便易行的標準。

下列常用對象也屬於Range類型,

  • Cell (單元格)
  • Row (行)
  • Column (列)
  • Worksheet.UsedRange

Range對象具有 Cells, Rows, Columns 屬性。之前提到 VBA當中複數的屬性為 一般為集合屬性,除了之前介紹的 Foreach, 集合屬性本身都有Count 屬性,表示集合中元素的個數;

例如, 所選區域總行數可以表示為

? Selection.Rows.Count

集合屬於本身具有Item屬性,類似於數組索引,從1 起始 將當前集合中的元素進行排列 (同時還有可能是特殊的 鍵, 例如獲取第一張工作表對象不僅可以通過Worksheets(1) 或Worksheets.Item(1), 還可以通過第一張工作表 名稱 為索引),【引用類型的默認屬性,在訪問時可以省略。其中.Item作為集合對象的默認屬性,因此可以省略。】還記得上期代碼中有如下語句么

Set tmpRng = targetRng.Cells(i)

這個相當於

Set tmpRng = targetRng.Cells.Item(i)

我不想告訴你,其實也可以寫成

Set tmpRng = targetRng(i)

對! Range對象的默認屬性是.Cells, 而Cells作為集合對象的默認屬性為.Item, 經過兩步省略可以直接寫為上述形式。但是實踐中我個人不推薦這種寫法,Item省略基本上是約定俗成,但【如果涉及到具體屬性,請務必寫完整,以增加程序可讀性。】

同樣的,Cell默認屬性為Value,即單元格的值, 如果不加以區分 Cells(1) 和Cells(1).Value 而是通過程序上下文判斷所指為 引用類型(單元格)或是基礎類型(單元格的值),有時會造成不必要的麻煩。

現在對於單元格或是Range對象 的訪問進行一個總結

例子3.1.1. 選擇範圍為 B3到C3

在 立即窗口中 輸入以下命令。

? Selection(3,2)Company 2? Selection(3).Address(0,0)B4? Selection(1,3)after? Selection(1,0)before? [A3]before? Range("A3")before? Cells(3,1)before? Range(Cells(3,1), Cells(4,3)).Address $A$3:$C$4? [A3].Resize(2,3).Address$A$3:$C$4? Range([A3], [C4]).Address $A$3:$C$4? Selection.Offset(0,-1).Address$A$3:$B$6

以最左上角單元格為坐標(1, 1) ,其他單元格可以表示為

Rng(相對行位置, 相對列位置)

其中相對位置可以為零或為負,此例中最左上單元格B3為(1,1)。相對行位置加1表示下移1行,相對列位置加1表示向右移動1列,減1即表示相反方向。那麼此例中 (1,0) 表示在B3 相同行的左邊一列即A3。

Rng(序號)

區域內的單元格按從左到右從上到下的順序排列,序號從1開始。可以看到第3個單元地址為B4。 單元格地址的方法名稱為

.Address(行絕對引用,列絕對引用)

改變參數的過程對應Excel輸入公式時,選中地址按F4切換地址引用的操作的過程。

引用單元格時,

[A3] 與 Range("A3") 等價。但是此種寫法效率方面要遠低於 Cells(3,1)。

表示區域時

Range(左上頂點單元格引用, 右下頂點單元格引用)

另外,可以採用resize函數,此函數相當於工作表中,確定區域左上頂點拖選目標區域的操作。兩參數分別為目標區域的行數與列數。

? [A3].Resize(2,3).Address

表示以單元格A3為頂點,向下選取2行,向右選取3列所代表範圍的地址。

與之相應的是區域平移函數Offset(偏移行數,偏移列數), 其中行數或列數可以為0或為負

? Selection.Offset(0,-1).Address

表示返回所選區域向下移動0行,向左移動1行所得到區域地址。

以上為Range對象內容第一部分,之後會詳細說一說Range的特性與操作技巧。

有任何問題請在下方留言。

本專欄所有文章著作權歸屬本人。未經本人書面許可,除知乎日報外,任何人不得轉載。

推薦閱讀:

如何使用 Excel 透視表?
excel中vba是否能夠將數據填充到網頁中?
Excel 2007 版本之後,微軟為什麼要更改文件名的後綴?
你見過最漂亮的Excel表格什麼樣?
Excel 函數「vlookup」可不可以 lookup 到近似值?函數該怎麼寫?

TAG:MicrosoftExcel | VBA | 財務分析 |