在 Visual Basic 中,Range 對象既可表示單個單元格,也可表示單元格區域。下列主題說明了標識和處理 Range 對象最常用的方法。
用 A1 樣式記號引用單元格和單元格區域
可使用 Range 屬性來引用 A1 引用樣式中的單元格或單元格區域。下述子程序將單元格區域 A1:D5 的字體設置爲加粗。
Sub FormatRange()
Workbooks("Book1" ).Sheets("Sheet1" ).Range("A1:D5" ) _
.Font.Bold = True
End Sub
下表演示了使用 Range 屬性的一些 A1 樣式引用。
引用 含義
Range("A1" ) 單元格 A1
Range("A1:B5" ) 從單元格 A1 到單元格 B5 的區域
Range("C5:D9,G9:H16" ) 多塊選定區域
Range("A:A" ) A 列
Range("1:1" ) 第一行
Range("A:C" ) 從 A 列到 C 列的區域
Range("1:5" ) 從第一行到第五行的區域
Range("1:1,3:3,8:8" ) 第 1、3 和 8 行
Range("A:A,C:C,F:F" ) A 、C 和 F 列
用編號引用單元格
通過使用行列編號,可用 Cells 屬性來引用單個單元格。該屬性返回代表單個單元格的 Range 對象。下例中,Cells(6,1) 返回 Sheet1 上的單元格 A6,然後將 Value 屬性設置爲 10。
Sub EnterValue()
Worksheets("Sheet1" ).Cells(6, 1).Value = 10
End Sub
因爲可用變量替代編號,所以 Cells 屬性非常適合於在單元格區域中循環,如下例所示。
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1" ).Cells(counter, 3).Value = counter
Next counter
End Sub
注意 如果要同時更改某一單元格區域中所有單元格的屬性或對其應用方法,可使用 Range 屬性。有關詳細信息,請參閱用 A1 樣式記號引用單元格。
引用行和列
可用 Rows 屬性或 Columns 屬性來處理整行或整列。這兩個屬性返回代表單元格區域的 Range 對象。下例中,用 Rows(1) 返回 Sheet1 上的第一行,然後將單元格區域的 Font 對象的 Bold 屬性設置爲 True。
Sub RowBold()
Worksheets("Sheet1" ).Rows(1).Font.Bold = True
End Sub
下表舉例說明了使用 Rows 和 Columns 屬性的一些行和列的引用。
引用 含義
Rows(1) 第一行
Rows 工作表上所有的行
Columns(1) 第一列
Columns("A" ) 第一列
Columns 工作表上所有的列
若要同時處理若干行或列,請創建一個對象變量並使用 Union 方法,將對 Rows 屬性或 Columns 屬性的多個調用組合起來。下例將活動工作簿中第一張工作表上的第一行、第三行和第五行的字體設置爲加粗。
Sub SeveralRows()
Worksheets("Sheet1" ).Activate
Dim myUnion As Range
Set myUnion = Union(Rows(1), Rows(3), Rows(5))
myUnion.Font.Bold = True
End Sub
用快捷記號引用單元格
可用方括號將 A1 引用樣式或命名區域括起來,作爲 Range 屬性的快捷方式。這樣就不必鍵入單詞“Range”或使用引號,如下例所示。
Sub ClearRange()
Worksheets("Sheet1" ).[A1:B5].ClearContents
End Sub
Sub SetValue()
[myRange].Value = 30
End Sub
引用命名區域
用名稱比用 A1 樣式記號更容易標識單元格區域。若要命名選定的單元格區域,請單擊編輯欄左端的名稱框,鍵入名稱,再按 Enter。
引用命名區域
下例引用了名爲“MyBook.xls”的工作簿中的名爲“MyRange”的單元格區域。
Sub FormatRange()
Range("MyBook.xls!MyRange" ).Font.Italic = True
End Sub
下例引用名爲“Report.xls”的工作簿中的特定工作表單元格區域“Sheet1!Sales”。
Sub FormatSales()
Range("[Report.xls]Sheet1!Sales" ).BorderAround Weight:=xlthin
End Sub
若要選定命名區域,請用 GoTo 方法,該方法將激活工作簿和工作表,然後選定該區域。
Sub ClearRange()
Application.Goto Reference:="MyBook.xls!MyRange"
Selection.ClearContents
End Sub
下例顯示對於活動工作簿將如何編寫相同的過程?
Sub ClearRange()
Application.Goto Reference:="MyRange"
Selection.ClearContents
End Sub
在命名區域中的單元格上循環
下例用 For Each ...Next 循環語句在命名區域中的每一個單元格上循環。如果該區域中的任一單元格的值超過 limit 的值,就將該單元格的顏色更改爲黃色。
Sub ApplyColor()
Const Limit As Integer = 25
For Each c In Range("MyRange" )
If c.Value > Limit Then
c.Interior.ColorIndex = 27
End If
Next c
End Sub
相對於其他單元格來引用單元格
處理相對於另一個單元格的某一單元格的常用方法是使用 Offset 屬性。下例中,將位於活動工作表上活動單元格下一行和右邊三列的單元格的內容設置爲雙下劃線格式。
Sub Underline()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
注意 可錄製使用 Offset 屬性(而不是絕對引用)的宏。在“工具”菜單上,指向“宏”,再單擊“錄製新宏”,然後單擊“確定”,再單擊錄製宏工具欄上的“相對引用”按鈕。
若要在單元格區域中循環,請在循環中將變量與 Cells 屬性一起使用。下例以 5 爲步長,用 5 到 100 之間的值填充第三列的前 20 個單元格。變量 counter 用作 Cells 屬性的行號。
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1" ).Cells(counter, 3).Value = counter * 5
Next counter
End Sub
用 Range 對象引用單元格
如果將對象變量設置爲 Range 對象,即可用變量名方便地操作單元格區域。
下述過程創建了對象變量 myRange,然後將活動工作簿中 Sheet1 上的單元格區域 A1:D5 賦予該變量。隨後的語句用該變量代替該區域對象,以修改該區域的屬性。
Sub Random()
Dim myRange As Range
Set myRange = Worksheets("Sheet1" ).Range("A1:D5" )
myRange.Formula = "=RAND()"
myRange.Font.Bold = True
End Sub
引用工作表上的所有單元格
如果對工作表應用 Cells 屬性時不指定編號,該屬性將返回代表工作表上所有單元格的 Range 對象。下述 Sub 過程清除活動工作簿中 Sheet1 上的所有單元格的內容。
Sub ClearSheet()
Worksheets("Sheet1" ).Cells.ClearContents
End Sub
引用多個單元格區域
使用適當的方法可以很容易地同時引用多個單元格區域。可用 Range 和 Union 方法引用任意組合的單元格區域;用 Areas 屬性可引用工作表上選定的一組單元格區域。
使用 Range 屬性
通過在兩個或多個引用之間放置逗號,可使用 Range 屬性來引用多個單元格區域。下例清除了 Sheet1 上三個單元格區域的內容。
Sub ClearRanges()
Worksheets("Sheet1" ).Range("C5:D9,G9:H16,B14:D18" ). _
ClearContents
End Sub
命名區域使得用 Range 屬性處理多個單元格區域更爲容易。下例可在三個命名區域處於同一工作表時運行。
Sub ClearNamed()
Range("MyRange, YourRange, HisRange" ).ClearContents
End Sub
使用 Union 方法
用 Union 方法可將多個單元格區域組合到一個 Range 對象中。下例創建了名爲 myMultipleRange 的 Range 對象,並將其定義爲單元格區域 A1:B2 和 C3:D4 的組合,然後將該組合區域的字體設置爲加粗。
Sub MultipleRange()
Dim r1, r2, myMultipleRange As Range
Set r1 = Sheets("Sheet1" ).Range("A1:B2" )
Set r2 = Sheets("Sheet1" ).Range("C3:D4" )
Set myMultipleRange = Union(r1, r2)
myMultipleRange.Font.Bold = True
End Sub
使用 Areas 屬性
可用 Areas 屬性引用選定的單元格區域或多塊選定區域中的區域集合。下述過程計算選定區域中的塊數目,如果有多個塊,就顯示一則警告消息。
Sub FindMultiple()
If Selection.Areas.Count > 1 Then
MsgBox "Cannot do this to a multiple selection."
End If
End Sub
在單元格區域中循環
使用 Visual Basic 時,經常需要對某一單元格區域內的每個單元格運行同一段語句。爲達到這一目的,可組合循環語句和一個或多個方法來標識每個單元格,一次針對一個單元格,並執行該操作。
在單元格區域中循環的一種方法是將 For ...Next 循環語句與 Cells 屬性配合使用。使用 Cells 屬性時,可用循環計數器(或其他變量或表達式)來替代單元格索引編號。下例中,變量 counter 代替了行號。此過程將在單元格區域 C1:C20 中循環,將所有絕對值小於 0.01 的數字都設置爲 0(零)。
Sub RoundToZero1()
For counter = 1 To 20
Set curCell = Worksheets("Sheet1" ).Cells(counter, 3)
If Abs(curCell.Value) < 0.01 Then curCell.Value = 0
Next counter
End Sub
在單元格區域中循環的另一種簡便方法是使用 For Each ...Next 循環語句和由 Range 屬性指定的單元格集合。在每一次循環過程中,Visual Basic 都爲下一個單元格自動設置一個對象變量。下述過程在單元格區域 A1:D10 中循環,將所有絕對值小於 0.01 的數字都設置爲 0(零)。
Sub RoundToZero2()
For Each c In Worksheets("Sheet1" ).Range("A1:D10" ).Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
如果不知道要循環的單元格區域的邊界,可用 CurrentRegion 屬性返回活動單元格周圍的區域。例如,下述過程在工作表上運行時,將在活動單元格周圍的區域內循環,將所有絕對值小於 0.01 的數字都設置爲 0(零)。
Sub RoundToZero3()
For Each c In ActiveCell.CurrentRegion.Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
選定和激活單元格
使用 Microsoft Excel 時,通常要先選定單元格或單元格區域,然後執行某一操作,如設置單元格的格式或在單元格中輸入數值。但在 Visual Basic 中,通常在修改單元格之前不必先選定它們。
例如,如果要用 Visual Basic 在單元格 D6 中輸入公式,就不必先選定單元格 D6,而只需返回 Range 對象,然後將該對象的 Formula 屬性設置爲所需的公式,如下例所示。
Sub EnterFormula()
Worksheets("Sheet1" ).Range("D6" ).Formula = "=SUM(D2:D5)"
End Sub
有關使用其他方法在不選定單元格的情況下對其進行控制的示例,請參閱如何引用單元格和區域。
使用 Select 方法和 Selection 屬性
Select 方法激活工作表和工作表上的對象;而 Selection 屬性返回代表活動工作簿中活動工作表上的當前選定區域的對象。在成功使用 Selection 屬性之前,必須先激活工作簿,並激活或選定工作表,然後用 Select 方法選定單元格區域(或其他對象)。
宏錄製器經常創建使用 Select 方法和 Selection 屬性的宏。下述 Sub 過程是用宏錄製器創建的,該過程演示了 Select 方法和 Selection 屬性在一起使用的方法。
Sub Macro1()
Sheets("Sheet1" ).Select
Range("A1" ).Select
ActiveCell.FormulaR1C1 = "Name"
Range("B1" ).Select
ActiveCell.FormulaR1C1 = "Address"
Range("A1:B1" ).Select
Selection.Font.Bold = True
End Sub
下例完成同樣的任務,但不激活或選定工作表或單元格。
Sub Labels()
With Worksheets("Sheet1" )
.Range("A1" ) = "Name"
.Range("B1" ) = "Address"
.Range("A1:B1" ).Font.Bold = True
End With
End Sub
選定活動工作表上的單元格
如果用 Select 方法選定單元格,應注意 Select 方法僅用於活動工作表。如果從模塊中運行 Sub 過程,必須先在該過程中激活工作表,然後才能用 Select 方法選定單元格區域,否則該方法將失敗。例如,下述過程在活動工作簿中將 Sheet1 中的一行復制到 Sheet2 上。
Sub CopyRow()
Worksheets("Sheet1" ).Rows(1).Copy
Worksheets("Sheet2" ).Select
Worksheets("Sheet2" ).Rows(1).Select
Worksheets("Sheet2" ).Paste
End Sub
激活選定區域內的單元格
可用 Activate 方法激活選定區域內的單元格。即使選定了單元格區域,也只能有一個活動單元格。下述過程選定了一個單元格區域,然後激活該區域內的一個單元格,但並不改變選定區域。
Sub MakeActive()
Worksheets("Sheet1" ).Activate
Range("A1:D4" ).Select
Range("B2" ).Activate
End Sub
如果要處理若干工作表上相同位置的單元格區域,可用 Array 函數選定兩張或多張工作表。下例設置三維單元格區域的邊框格式。
Sub FormatSheets()
Sheets(Array ("Sheet2" , "Sheet3" , "Sheet5" )).Select
Range("A1:H1" ).Select
Selection.Borders(xlBottom).LineStyle = xlDouble
End Sub
下例應用 FillAcrossSheets 方法,在活動工作簿中,將 Sheet2 上的單元格區域的格式和任何數據複製到該工作簿中所有工作表上的相應區域中。
Sub FillAll()
Worksheets("Sheet2" ).Range("A1:H1" ) _
.Borders(xlBottom).LineStyle = xlDouble
Worksheets.FillAcrossSheets (Worksheets("Sheet2" ) _
.Range("A1:H1" ))
End Sub
處理活動單元格
ActiveCell 屬性返回代表活動單元格的 Range 對象。可對活動單元格應用 Range 對象的任何屬性和方法,如下例所示。
Sub SetValue()
Worksheets("Sheet1" ).Activate
ActiveCell.Value = 35
End Sub
注意 只有活動單元格所在的工作表處於活動狀態時,才能處理該活動單元格。
移動活動單元格
可用 Activate 方法指定活動單元格。例如,下述過程使單元格 B5 成爲活動單元格,然後將其字體設置爲加粗。
Sub SetActive()
Worksheets("Sheet1" ).Activate
Worksheets("Sheet1" ).Range("B5" ).Activate
ActiveCell.Font.Bold = True
End Sub
注意 若要選定單元格區域,請用 Select 方法。若要使單個單元格成爲活動單元格,請使用 Activate 方法。
可用 Offset 屬性來移動活動單元格。下述過程在選定區域內的活動單元格中插入文本,然後將活動單元格右移一格,但並不更改選定區域。
Sub MoveActive()
Worksheets("Sheet1" ).Activate
Range("A1:D10" ).Select
ActiveCell.Value = "Monthly Totals"
ActiveCell.Offset(0, 1).Activate
End Sub
選擇活動單元格周圍的單元格
CurrentRegion 屬性返回由空白行和空白列所包圍的單元格區域。下例中,選定區域擴充到與活動單元格相鄰的包含數據的單元格中,然後用“貨幣”樣式設置該區域的格式。
Sub Region()
Worksheets("Sheet1" ).Activate
ActiveCell.CurrentRegion.Select
Selection.Style = "Currency"
End Sub
Tags: VB EXCEL