EXCEL在VB中的編程概念全解

使用 Visual Basic 的普通任務是指定單元格或單元格區域,然後對該單元格或單元格區域進行一些操作,如輸入公式或更改格式。通常用一條語句就能完成操作,該語句可標識單元格,還可更改某個屬性或應用某個方法。

在 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章