2011年8月15日 星期一

Excel VBA 範例參考

[範例01] 傳值給某單元格


[範例01-01]
Sub test1()
Worksheets("Sheet1").Range("A5").Value = 22
MsgBox "工作表Sheet1內單元格A5中的值為" _
& Worksheets("Sheet1").Range("A5").Value
End Sub


[範例01-02]
Sub test2()
Worksheets("Sheet1").Range("A1").Value = _
Worksheets("Sheet1").Range("A5").Value
MsgBox "現在A1單元格中的值也為" & _
Worksheets("Sheet1").Range("A5").Value
End Sub


[範例01-03]
Sub test3()
MsgBox "用公式填滿單元格,本例為隨機數公式"
Range("A1:H8").Formula = "=Rand()"
End Sub


[範例01-04]
Sub test4()
Worksheets(1).Cells(1, 1).Value = 24
MsgBox "現在單元格A1的值為24"
End Sub


[範例01-05]
Sub test5()
MsgBox "給單元格設置公式,求B2至B5單元格區域之和"
ActiveSheet.Cells(2, 1).Formula = "=Sum(B1:B5)"
End Sub


[範例01-06]
Sub test6()
MsgBox "設置單元格C5中的公式."
Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=Rand()"
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例02] 引用單元格
Sub Random()
Dim myRange As Range
'設置對單元格區域的引用
Set myRange = Worksheets("Sheet1").Range("A1:D5")
'對Range對象進行操作
myRange.Formula = "=RAND()"
myRange.Font.Bold = True
End Sub
範例說明:可以設置Range對象變量來引用單元格區域,然後對該變量所代表的單元格區域進行操作。


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[範例03] 清除單元格


[範例03-01]清除單元格中的內容(ClearContents方法)
Sub testClearContents()
MsgBox "清除指定單元格區域中的內容"
Worksheets(1).Range("A1:H8").ClearContents
End Sub


[範例03-02]清除單元格中的格式(ClearFormats方法)
Sub testClearFormats()
MsgBox "清除指定單元格區域中的格式"
Worksheets(1).Range("A1:H8").ClearFormats
End Sub


[範例03-03]清除單元格中的批註(ClearComments方法)
Sub testClearComments()
MsgBox "清除指定單元格區域中的批註"
Worksheets(1).Range("A1:H8").ClearComments
End Sub


[範例03-04]清除單元格中的全部,包括內容、格式和批註(Clear方法)
Sub testClear()
MsgBox "徹底清除指定單元格區域"
Worksheets(1).Range("A1:H8").Clear
End Sub


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[範例04] Range和Cells
Sub test()
'設置單元格區域A1:J10的邊框線條樣式
With Worksheets(1)
.Range(.Cells(1, 1), _
.Cells(10, 10)).Borders.LineStyle = xlThick
End With
End Sub
範例說明:可用 Range(cell1, cell2) 返回一個 Range 對象,其中cell1和cell2為指定起始和終止位置的Range對象。


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[範例05] 選取單元格區域(Select方法)
Sub testSelect()
'選取單元格區域A1:D5
Worksheets("Sheet1").Range("A1:D5").Select
End Sub


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[範例06] 基於所選區域偏離至另一區域(Offset屬性)


[範例06-01]
Sub testOffset()
Worksheets("Sheet1").Activate
Selection.Offset(3, 1).Select
End Sub
範例說明:可用Offset(row, column)(其中row和column為行偏移量和列偏移量)返回相對於另一區域在指定偏移量處的區域。如上例選定位於當前選定區域左上角單元格的向下三行且向右一列處單元格區域。


[範例06-02] 選取距當前單元格指定行數和列數的單元格
Sub ActiveCellOffice()
MsgBox "顯示距當前單元格第3列、第2行的單元格中的值"
MsgBox ActiveCell.Offset(3, 2).Value
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例07] 調整區域的大小(Resize屬性)
Sub ResizeRange()
Dim numRows As Integer, numcolumns As Integer
Worksheets("Sheet1").Activate
numRows = Selection.Rows.Count
numcolumns = Selection.Columns.Count
Selection.Resize(numRows + 1, numcolumns + 1).Select
End Sub
範例說明:本範例調整所選區域的大小,使之增加一行一列。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例08] 選取多個區域(Union方法)
Sub testUnion()
Dim rng1 As Range, rng2 As Range, myMultiAreaRange As Range
Worksheets("sheet1").Activate
Set rng1 = Range("A1:B2")
Set rng2 = Range("C3:D4")
Set myMultiAreaRange = Union(rng1, rng2)
myMultiAreaRange.Select
End Sub
範例說明:可用 Union(range1, range2, ...) 返回多塊區域,即該區域由兩個或多個連續的單元格區域所組成。如上例創建由單元格區域A1:B2和C3:D4組合定義的對象,然後選定該定義區域。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例09] 啟動已選區域中的單元格
Sub ActivateRange()
MsgBox "選取單元格區域B2:D6並將C4選中"
ActiveSheet.Range("B3:D6").Select
Range("C5").Activate
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例10] 選取指定條件的單元格(SpecialCells方法)
Sub SelectSpecialCells()
MsgBox "選擇當前工作表中所有公式單元格"
ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).Select
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例11] 選取矩形區域(CurrentRegion屬性)
'選取包含當前單元格的矩形區域
'該區域周邊為空白行和空白列
Sub SelectCurrentRegion()
MsgBox "選取包含當前單元格的矩形區域"
ActiveCell.CurrentRegion.Select
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例12] 選取當前工作表中已用單元格(UsedRange屬性)
'選取當前工作表中已使用的單元格區域
Sub SelectUsedRange()
MsgBox "選取當前工作表中已使用的單元格區域" _
& vbCrLf & "並顯示其地址"
ActiveSheet.UsedRange.Select
MsgBox ActiveSheet.UsedRange.Address
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例13] 選取最邊緣單元格(End屬性)
'選取最下方的單元格
Sub SelectEndCell()
MsgBox "選取當前單元格區域內最下方的單元格"
ActiveCell.End(xlDown).Select
End Sub
範例說明:可以改變參數xlDown以選取最左邊、最右邊、最上方的單元格。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例14]設置當前單元格的前一個單元格和後一個單元格的值
Sub SetCellValue()
MsgBox "將當前單元格中前面的單元格值設為""我前面的單元格""" & vbCrLf _
& "後面的單元格值設為""我後面的單元格"""
ActiveCell.Previous.Value = "我前面的單元格"
ActiveCell.Next.Value = "我後面的單元格"
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例15]確認所選單元格區域中是否有公式(HasFormula屬性)
Sub IfHasFormula()
If Selection.HasFormula = True Then
MsgBox "所選單元格中都有公式"
Else
MsgBox "所選單元格中,部分單元格沒有公式"
End If
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例16] 公式單元格操作
[範例16-01]獲取與運算結果單元格有直接關係的單元格
Sub CalRelationCell()
MsgBox "選取與當前單元格的計算結果相關的單元格"
ActiveCell.DirectPrecedents.Select
End Sub


[範例16-02]追蹤公式單元格
Sub Cal1()
MsgBox "選取計算結果單元格相關的所有單元格"
ActiveCell.Precedents.Select
End Sub
Sub TrackCell()
MsgBox "追蹤運算結果單元格"
ActiveCell.ShowPrecedents
End Sub
Sub DelTrack()
MsgBox "刪除追蹤線"
ActiveCell.ShowPrecedents Remove:=True
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

[範例17] 複製單元格(Copy方法)
Sub CopyRange()
MsgBox "在單元格B7中寫入公式後,將B7的內容複製到C7:D7內"
Range("B7").Formula = "=Sum(B3:B6)"
Range("B7").Copy Destination:=Range("C7:D7")
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例18]獲取單元格行列值(Row屬性和Column屬性)
Sub RangePosition()
MsgBox "顯示所選單元格區域的行列值"
MsgBox "第 " & Selection.Row & "行 " & Selection.Column & "列"
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例19]獲取單元格區域的單元格數及行列數(Rows屬性、Columns屬性和Count屬性)
Sub GetRowColumnNum()
MsgBox "顯示所選取單元格區域的單元格數、行數和列數"
MsgBox "單元格區域中的單元格數為:" & Selection.Count
MsgBox "單元格區域中的行數為:" & Selection.Rows.Count
MsgBox "單元格區域中的列數為:" & Selection.Columns.Count
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

[範例20]設置單元格中的文本格式


[範例20-01] 對齊文本
Sub HorizontalAlign()
MsgBox "將所選單元格區域中的文本左右對齊方式設為居中"
Selection.HorizontalAlignment = xlHAlignCenter
End Sub
Sub VerticalAlign()
MsgBox "將所選單元格區域中的文本上下對齊方式設為居中"
Selection.RowHeight = 36
Selection.VerticalAlignment = xlVAlignCenter
End Sub


[範例20-02] 縮排文本(InsertIndent方法)
Sub Indent()
MsgBox "將所選單元格區域中的文本縮排值加1"
Selection.InsertIndent 1
MsgBox "將縮排值恢復"
Selection.InsertIndent -1
End Sub


[範例20-03] 設置文本方向(Orientation屬性)
Sub ChangeOrientation()
MsgBox "將所選單元格中的文本順時針旋轉45度"
Selection.Orientation = 45
MsgBox "將文本由橫向改為縱向"
Selection.Orientation = xlVertical
MsgBox "將文本方向恢復原值"
Selection.Orientation = xlHorizontal
End Sub


[範例20-04]自動換行(WrapText屬性)
Sub ChangeRow()
Dim i
MsgBox "將所選單元格設置為自動換行"
i = Selection.WrapText
Selection.WrapText = True
MsgBox "恢復原狀"
Selection.WrapText = i
End Sub


[範例20-05]將比單元格列寬長的文本縮小到能容納列寬大小(ShrinkToFit屬性)
Sub AutoFit()
Dim i
MsgBox "將長於列寬的文本縮到與列寬相同"
i = Selection.ShrinkToFit
Selection.ShrinkToFit = True
MsgBox "恢復原狀"
Selection.ShrinkToFit = i
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

[範例21]設置條件格式(FormatConditions屬性)
Sub FormatConditions()
MsgBox "在所選單元格區域中將單元格值小於10的單元格中的文本變為紅色"
Selection.FormatConditions.Add Type:=xlCellValue, _
Operator:=xlLessEqual, Formula1:="10"
Selection.FormatConditions(1).Font.ColorIndex = 3
MsgBox "恢復原狀"
Selection.FormatConditions(1).Font.ColorIndex = xlAutomatic
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例22]插入批註(AddComment方法)
Sub EnterComment()
MsgBox "在當前單元格中輸入批註"
ActiveCell.AddComment ("Hello")
ActiveCell.Comment.Visible = True
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例23]隱藏/顯示單元格批註
Sub CellComment()
MsgBox "切換當前單元格批註的顯示和隱藏狀態"
ActiveCell.Comment.Visible = Not (ActiveCell.Comment.Visible)
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例24]改變所選單元格的顏色
Sub ChangeColor()
Dim iro As Integer
MsgBox "將所選單元格的顏色改為紅色"
iro = Selection.Interior.ColorIndex
Selection.Interior.ColorIndex = 3
MsgBox "將所選單元格的顏色改為藍色"
Selection.Interior.Color = RGB(0, 0, 255)
MsgBox "恢復原狀"
Selection.Interior.ColorIndex = iro
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例25]改變單元格的圖案
Sub ChangePattern()
Dim p, pc, i
MsgBox "依Pattern常數值的順序改變所選單元格的圖案"
p = Selection.Interior.Pattern
pc = Selection.Interior.PatternColorIndex
For i = 9 To 16
With Selection.Interior
.Pattern = i
.PatternColor = RGB(255, 0, 0)
End With
MsgBox "常數值 " & i
Next i
MsgBox "恢復原狀"
Selection.Interior.Pattern = p
Selection.Interior.PatternColorIndex = pc
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例26]合併單元格
Sub MergeCells()
MsgBox "合併單元格A2:C2,並將文本設為居中對齊"
Range("A2:C2").Select
With Selection
.MergeCells = True
.HorizontalAlignment = xlCenter
End With
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例27]限制單元格移動的範圍
Sub ScrollArea1()
MsgBox "將單元格的移動範圍限制在單元格區域B2:D6中"
ActiveSheet.ScrollArea = "B2:D6"
End Sub
Sub ScrollArea2()
MsgBox "解除移動範圍限制"
ActiveSheet.ScrollArea = ""
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[範例28]獲取單元格的位置(Address屬性)
Sub GetAddress()
MsgBox "顯示所選單元格區域的地址"
MsgBox "絕對地址:" & Selection.Address
MsgBox "行的絕對地址:" & Selection.Address(RowAbsolute:=False)
MsgBox "列的絕對地址:" & Selection.Address(ColumnAbsolute:=False)
MsgBox "以R1C1形式顯示:" & Selection.Address(ReferenceStyle:=xlR1C1)
MsgBox "相對地址:" & Selection.Address(False, False)
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

[範例29]刪除單元格區域(Delete方法)
Sub DeleteRange()
MsgBox "刪除單元格區域C2:D6後,右側的單元格向左移動"
ActiveSheet.Range("C2:D6").Delete (xlShiftToLeft)
End Sub
小結
下面對Range對象的一些常用屬性和方法進行簡單的小結。
1、Activate與Select
試驗下面的過程:
Sub SelectAndActivate()
Range("B3:E10").Select
Range("C5").Activate
End Sub
其結果如下圖所示:

圖05-01:Select與Activate
Selection指單元格區域B3:E10,而ActiveCell則是單元格C5;ActiveCell代表單個的單元格,而Selection則可以代表單個單元格,也可以代表單元格區域。

2、Range屬性
可以使用Application對象的Range屬性引用Range對象,如
Application.Range(「B2」) 『代表當前工作表中的單元格B2
若引用當前工作表中的單元格,也可以忽略前面的Application對象。
Range(「A1:D10」) 『代表當前工作表中的單元格區域A1:D10
Range(「A1:A10,C1:C10,E1:E10」) 『代表當前工作表中非連續的三個區域組成的單元格區域
Range屬性也接受指向單元格區域對角的兩個參數,如:
Range(「A1」,」D10」) 『代表單元格區域A1:D10
當然,Range屬性也接受單元格區域名稱,如:
Range(「Data」) 『代表名為Data的數據區域
Range屬性的參數可以是對象也可以是字符串,如:
Range(「A1」,Range(「LastCell」))


3、單元格引用的快捷方式
可以在引用區域兩側加上方括號來快速引用單元格區域,如:
[B2]
[A1:D10]
[A1:A10,C1:C10,E1:E10]
[Data]
但其引用的是絕對區域。


4、Cells屬性
可以使用Cells屬性來引用Range對象。如:
ActiveSheet.Cells
Application.Cells 『引用當前工作表中的所有單元格
Cell(2,2)
Cell(2,」B」) 『引用單元格B2
Range(Cells(1,1),Cells(10,5)) 『引用單元格區域A1:E10
若想在一個單元格區域中循環時,使用Cells屬性是很方便的。
也可以使用Cells屬性進行相對引用,如:
Range(「D10:G20」).Cells(2,3) 『表示引用單元格區域D10:G20中第2行第3列的單元格,即單元格F11
也可使用語句:Range(「D10」).Cells(2,3)達到同樣的引用效果。


5、Offset屬性
Offset屬性基於當前單元格按所給參數進行偏移,與Cells屬性不同的是,它基於0即基準單元格為0,如:
Range(「A10」).Cells(1,1)和Range(「A10」).Offset(0,0)都表示單元格A10
當想引用於基準單元格區域同樣大小的單元格區域時,則Offset屬性是有用的。

6、Resize屬性
可使用Resize屬性獲取相對於原單元格區域左上角單元格指定大小的區域。


7、SpecialCells方法
SpecialCells方法對應於「定位條件」對話框,如圖05-02所示:
圖05-02:「定位條件」對話框


8、CurrentRegion屬性
使用CurrentRegion屬性可以選取當前單元格所在區域,即周圍是空行和空列所圍成的矩形區域,等價於「Ctrl+Shift+*」快捷鍵。

9、End屬性
End屬性所代表的操作等價於「Ctrl+方向箭」的操作,使用常量xlUp、xlDown、xlToLeft和xlToRight分別代表上、下、左、右箭。


10、Columns屬性和Rows屬性
Columns屬性和Rows屬性分別返回單元格區域中的所有列和所有行。


11、Areas集合
在多個非連續的單元格區域中使用Columns屬性和Rows屬性時,只是返回第一個區域的行或列,如:
Range(「A1:B5,C6:D10,E11:F15」).Rows.Count
將返回5。
此時應使用Areas集合來返回區域中每個塊的地址,如:
For Each Rng In Range(「A1:B5,C6:D10,E11:F15」).Areas
MsgBox Rng.Address
Next Rng


12、Union方法和Intersect方法
當想從兩個或多個單元格區域中生成一個單元格區域時,使用Union方法;當找到兩個或多個單元格區域共同擁有的單元格區域時,使用Intersect方法。

張貼留言

LinkWithin

Related Posts Plugin for WordPress, Blogger...

熱門文章