回覆列表
  • 1 # 望月兄

    使用VBA來整理表格,甚至批次自動匯出報表,其實就是模擬了人的行為。在整理表格的時候,我們常常需要選定某個區域,做複製、剪下或者貼上的操作。

    因此,如何使用VBA來模擬這樣的行為呢,這就涉及到range的用法了。另外為了更好的選擇我們需要的單元格,本篇還會涉及到Cells、offset、resize、CurrentRegion、UsedRange等等的用法小記。這邊我們將會根據一個個需求來學習VBA。

    需求1:選擇B2單元格

    Sub main() Range("B2")

    .Select

    End Sub

    B2單元格是第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 Sub

    range的接受的引數是一個字串,因此只要用連線符 & 配置成正確的字串格式,就不會報錯了。

    如果使用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 Sub

    Columns.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 Sub

    UsedRange需要加上是在哪個Sheet中,無法預設是ActiveSheet。因此我們加上sheet名稱。

  • 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行,最後一個非空白單元格

    希望回答對你有幫助

  • 中秋節和大豐收的關聯?
  • 白血病等於死亡?