-
1 # 望月兄
-
2 # vbaOpen
一、強烈建議初學者理清Excel物件模型,在學寫vba程式碼時,按層級來書寫
本問題相關的物件層級為workbook - worksheet - range
二、關於引用單元格
Dim oBook As Workbook
Dim oSheet As Worksheet
Dim oRange As Range
Set oBook = Application.Workbooks("目標工作簿") "這裡的Application指當前VBA程式碼所屬的工作簿所在的Excel程式程序例項
Set oSheet = oBook.Worksheets("目標工作表")
"以下開始引用單元格
"1.引用單個單元格
Set oRange = oSheet.Range("A1") "常規方式
Set oRange = oSheet.Range("A" & 1) "動態列號
Set oRange = oSheet.Cells(1, 1) "行號+列號,可動態
Set oRange = oSheet.Cells(1, "A") "行號+列號
Set oRange = oSheet.[A1] "不建議使用
"Cells方法的缺點是無成員提醒
"2.引用連續單元格區域
Set oRange = oSheet.Range("A1:B2") "常規方式
Set oRange = oSheet.Range(oSheet.Cells(1, 1), oSheet.Cells(2, 2)) "長是長一點,某些時候還挺實用
Set oRange = oSheet.Range("A1", "B2") "使用率低
Set oRange = oSheet.Range("A1").Resize(2, 2) "極其靈活,配合Offset方法使用會更靈活
"3.引用不連續單元格區域
Set oRange = oSheet.Range("A1, B2:C3, D4")
Set oRange = Application.Union(oSheet.Range("A1"), oSheet.Range("B2:C3"), oSheet.Range("D4"))
"4.當前選定的單元格
Set oRange = Selection.Range
"5.行和列
Set oRange = oSheet.Rows(1)
Set oRange = oSheet.Columns(1)
"6.常用應用
Set oRange = oSheet.UsedRange "已使用的矩形單元格區域
Set oRange = oSheet.Range("A" & oSheet.Rows.Count).End(xlUp) "第A列,最後一個非空白單元格
Set oRange = oSheet.Cells(1, oSheet.Columns.Count).End(xlToLeft) "第1行,最後一個非空白單元格
希望回答對你有幫助
回覆列表
使用VBA來整理表格,甚至批次自動匯出報表,其實就是模擬了人的行為。在整理表格的時候,我們常常需要選定某個區域,做複製、剪下或者貼上的操作。
因此,如何使用VBA來模擬這樣的行為呢,這就涉及到range的用法了。另外為了更好的選擇我們需要的單元格,本篇還會涉及到Cells、offset、resize、CurrentRegion、UsedRange等等的用法小記。這邊我們將會根據一個個需求來學習VBA。
需求1:選擇B2單元格
Sub main() Range("B2").Select
End SubB2單元格是第2行,第2列,因此我們也可以使用Cells來改寫
Sub main() Cells(2, 2).Select End Sub需求2:選擇B2單元格,要求使用變數
我們寫VBA的時候,為了面對比較多變的情況,單元格的位置肯定有的時候是不固定的,需要使用到變數。因此這邊我們可以這樣改寫。
Sub main() Dim num As Integer Let num = 2 Range("B" & num).Select
End Subrange的接受的引數是一個字串,因此只要用連線符 & 配置成正確的字串格式,就不會報錯了。
如果使用Cells,Cells中含變數是更加方便的,一般我們迴圈的時候都是用Cells來迴圈的。
Sub main() Dim num As Integer Let num = 2 Cells(num, num).Select End Sub需求3:選擇A1:B5單元格區域
Sub main() Range("A1:B5").Select End Sub這邊也是這樣,只要給range一個正確的字串格式的引數就可以了。
還可以使用Range和Cells搭配使用。
Sub main() Range(Cells(1, 1), Cells(5, 2)).Select End Sub注意Cells的引數是這樣的:Cells(行的數字,列的數字)
或者Range和Range之間也是可以混合使用的。
Sub main() Range(Range("A1"), Range("B5")).Select End Sub需求4:選擇選擇A1:B5單元格區域,要求使用變數
Sub main() Dim n1 As Integer Dim n2 As Integer Let n1 = 1 Let n2 = 5 Range("A" & n1 & ":B" & n2).Select End Sub需求5:選擇第一列最後一個非空的單元格
Sub main() Range("A65536").End(xlUp).Select End Sub需求6:選擇第二行最後一個非空的單元格
這個必須得使用Cells定位。我們可以這麼做
Sub main() Cells(2, Columns.Count).End(xlToLeft).Select End SubColumns.Count程式碼最後一列,同理Rows.Count代表最後一行,因此需求5也可以用Cells改寫,這裡就不贅述了。
需求7:選擇A列最後一個空單元格
Sub main() Range("A65536").End(xlUp).Offset(1,0).Select End Sub這個比較有用,因為我們每次彙總的時候,都要複製貼上,為了保持表格的連續性。都需要定位到最後一個空單元格。
需求8:選擇第1行最後一個空單元格
Sub main() Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1).Select End Sub這邊就涉及到offset的用法了,offset的用法如下例:
offset(|A| , |B|) : 以選擇單元格為起點,向下挪移A個單元格,向右挪移B個單元格。
offset(-|A| , -|B|) : 以選擇單元格為起點,向上挪移A個單元格,想左挪移B個單元格。
需求:9:不使用CurrentRegion、UsedRange,選擇整個區域
這個需求我們以後常常會用,複製所有區域的資料到另一個sheet或者其他工作簿中。如果不使用CurrentRegion或UsedRange,我的思路是,先定位一個起始單元格比如A1,如果不需要表頭可以定位A2,然後找到A2單元格所處的行的最後一個非空單元格,然後在順勢往下找到該列所處的最後一個非空單元格,選中。就是我們要的整個區域了。
Sub main() Range(Range("A1"), Cells(1, Columns.Count). _ End(xlToLeft). _ End(xlDown)).Select End Sub這邊為了美觀,進行了適當的折行,折行需要新增一個下劃線_作為佔位符,然後就可以換行了。切記下劃線與前面的內容中間需要有空格。
需求10:使用CurrentRegion、UsedRange
Sub main() Range("A1").CurrentRegion.Select End Sub使用CurrentRegion可以輕鬆選擇所有區域。但是如果是不連續的區域,這邊的選擇會顯得有些錯誤。如下圖
因此我們可以使用UsedRange選擇所有被使用的單元格
Sub main() ActiveSheet.UsedRange.Select End SubUsedRange需要加上是在哪個Sheet中,無法預設是ActiveSheet。因此我們加上sheet名稱。