我是一個急性子,干什么事都希望馬上能夠完成,也希望馬上能夠知道事情的結果,去什么地方也希望馬上能夠到達目的地。我不知道大家是不是都跟我一樣,但我知道Excel中有滿足我們這些急性子人的快速功能。
下圖所示為帶有一組數據的工作表,活動單元格(也稱為當前單元格)為單元格A1。按下組合鍵,當前單元格會快速移動到單元格A10;接著按下組合鍵,當前單元格會快速移動到單元格C10;再按下組合箭,當前單元格會快速移動到單元格C1;再按下組合箭,當前單元格又回到單元格A1。
現在,在Excel中打開宏錄制器(即單擊“開發工具”——“錄制宏”),從當前單元格A1開始,按上面所述的方法,使用 Ctrl+方向箭組合箭快速移動單元格,即從A1移至A10再移至C10再移至C1最后回到A1,最后關閉宏錄制器(即單擊“開發工具”——“停止錄制“)。
宏錄制器錄制的代碼如下:
Sub 宏1()
‘
‘ 宏1 宏
‘
‘
Selection.End(xlDown).Select
Selection.End(xlToRight).Select
Selection.End(xlUp).Select
Selection.End(xlToLeft).Select
End Sub
將錄制的宏代碼與對應的操作解析如下所示:
觀察宏錄制的代碼和相應的解析,可以看出Selection代表當前活動單元格,單元格對象的End屬性使單元格快速移動到同一列或行的末尾或者開頭,其括號內的參數值指示單元格移動的方向。
End屬性的語法表達式為:
Range對象.End(Direction)
返回一個Range對象,代表連續區域內的一個單元格,該單元格在該區域的末尾或開頭。
說明:
Range對象代表區域內的任一單元格。也就是說,不一定是上文所演示的第一個單元格,可以是其它任何單元格。
參數Direction的取值及說明如下:
以本文開頭所示的工作表為例,說明End屬性的使用。
下面的語句:
Range(“B5”).End(xlUp).Select
選擇單元格B1。
下面的語句:
Range(“B5”).End(xlDown).Select
選擇單元格B10。
下面的語句:
Range(“B5”).End(xlToLeft).Select
選擇單元格A5。
下面的語句:
Range(“B5”).End(xlToRight).Select
選擇單元格C5。
注意:上面的示例均為在同一行或列中連續的單元格區域中移動,也就是說區域中沒有空單元格。如果列或行中存在空單元格,那么在向下或向右移動時,End屬性將單元格移動到同一列或行中空單元格之前的那個單元格;在向上或向左移動時,End屬性將單元格移動到同一列或行中空單元格之后的那個單元格。(我們可以在工作表中輸入一些數據,并有意在數據之間留有空單元格,然后使用Ctrl+箭頭方向鍵試驗,體會Excel是怎么快速移動單元格的)
一般,我們使用End屬性查找連續單元格區域的最后一個單元格所在的行或列。
仍然以本文開頭所示的工作表為例,下面的語句:
Range(“A1”).End(xlDown).Select
選擇單元格A10。即列A中有數據的單元格區域的最后一個單元格。
繼續!下面的語句:
Range(“A10”).End(xlDown).Select
選擇單元格A1048576(如果是Excel 2003則為A65536),即列A中的最后一個單元格。換句話說,以有數據的單元格區域的最后一個單元格為起點,結合參數值xlDown(向下移)使用End屬性,活動單元格將移動到工作表中該列或該行所在的最后一個單元格。呵呵,有點意思了!
再試試下面的語句(Excel 2007及以上版本):
Range(“A1048576”).End(xlUp).Select
或者是(Excel 2003及以下版本):
Range(“A65536”).End(xlUp).Select
選擇單元格A10。也就是列A中有數據的單元格區域的最后一個單元格。
我們來小結一下。
類似于本文開頭所示的工作表,如果列A中的單元格區域放置著連續的數據,即表中的單元格區域A1:A10,我們要找到列A中存放數據的最后一個單元格,有兩種方法。第一種是從單元格A1開始使用End屬性向下移至A10,即語句Range(“A1”).End(xlDown).Select。第二種是從工作表列A中的最后一個單元格開始向上移至A10,即語句Range(“A1048576”).End(xlUp).Select。
但是,如果在A1:A10中某個單元格為空(假設是單元格A5),那么語句Range(“A1”).End(xlDown).Select就不會移至單元格A10,而是移至單元格A4。所以,第一種方法不保險,僅在能確保單元格區域連續的情況下使用。通常,我們偏向于使用第二種方法,即從工作表中列中的最后一個單元格向上移,確保能移至該列中最后一個有數據的單元格上。
看看使用第二種方法選取單元格區域最后一個單元格的語句,對于Excel 2007之前或之后的版本,由于行數不同,使用的單元格也不一樣:Range(“A1048576”)或Range(“A65536”)。
在本系列前面的文章中曾介紹,Application對象有一個Rows屬性,可以返回工作表所在的行。該屬性也可以返回工作表中的總行數,語句如下:
Rows.Count
如果是Excel 2003,則返回值65536;如果是Excel 2007及以后的版本,則返回值1048576。
因此,工作表列A中處于最底端(即最后)一個單元格可表示為:
Range(“A” & Rows.Count)
從而上述第二種方法的代碼也可以寫為:
Range(“A” &Rows.Count).End(xlUp).Select
同樣是選擇單元格A10(即列A中有數據的單元格區域的最后一個單元格)。并且,該代碼更具有通用性,這樣就不怕Excel的版本問題了。
注意:上面是以列為例來說明如何選取某列中的最后一個有數據的單元格,對于行來說,如何選取某一行中最后一個有數據的單元格,與上面的方法相同,只是需要修改相關參數。