Excel中VBA程式設計學習筆記(四)
18、CurrentRegion屬性
CurrentRegion返回活動單元格所在的周圍由空行和空列組成的單元格區域(即通常所說的當前區域),如圖1所示。
當前區域即活動單元格所在的矩形區域,該矩形區域的每一行和每一列中至少包含有一個數據,其周圍是空行和空列,圖1中列舉了其中的4種情形(見藍色陰影區域)。在當前區域範圍內,不管活動單元格是哪一個單元格,其所在的當前區域均為同一區域,如上例中的B5:D7區域,活動單元格B5的當前區域為B5:D7,當活動單元格為C6時,其當前區域仍為B5:D7。
Sub testCurrentRegion()
Dim
Set ws = ActiveWorkbook.Worksheets("sheet1")
Set rng = ws.Range("A1").CurrentRegion
ws.Range("G2") = "當前區域標題行數"
ws.Range("H2").Value = rng.ListHeaderRows
ws.Range("G3"
ws.Range("H3").Value = rng.Rows.Count
ws.Range("G4") = "當前區域的列數"
ws.Range("H4").Value = rng.Columns.Count
ws.Range("G5").Value = "當前區域的單元格數"
ws.Range("H5").Value = rng.Cells.Count
ws.Columns(
MsgBox "選取當前區域中除標題行以外的區域"
rng.Resize(rng.Rows.Count - rng.ListHeaderRows, rng.Columns.Count).Offset(1, 0).Select
End Sub
19、value與text屬性的區別
在excel中,range型別有value及text屬性,下面看看這兩個屬性的區別:
A1單元格實際值 |
當把A1單元格列寬調小時顯示內容 |
此時如果執行下面的程式碼:
Sub test()
Debug.Print [a1].Value '輸出2012/12/22
Debug.Print [a1].text '輸出########
End Sub
Sub test()
a = [a1].value 'double
b = [a1].text 'string
c = [a1] '等價於c=[a1].value
End Sub
因此可以看出,value 得到是你輸入的值而text 是得到顯示的值。value可以是integer、float、double等型別的值,而text是string型別的值。
20、VBA中設定單元格的公式
Sub test()
Dim index%
For index = 1 To [A65536].End(xlUp).row
ActiveSheet.Range("C" & index) = "=SUM(A" & index & ":B" & index & ")"
Next
ActiveSheet.Range("D1") = "=COUNTIF(A1:A10,"">60"")"
End Sub
注意:如果公式中本來含有雙引號,則需要使用兩個雙引號。
21、range引用與單元格引用
Sub test()
Range("A1", "B10").Select '等價於range("A1:B10")
Range(Range("A1"), Range("B6")).Select '等價於Range("A1:B6")
Range("B3:D6").Range("A1").Select '相對引用的寫法,等價於Range("B3")
Range("C5:H8")(2).Select '等價於Range("C5:H8").Range("A2"),也等價於Range("D5")
Range("A1:F10")(2, 3).Select '等價於Range("C2")
Range("C1:D3")(2.4).Select '等價於Range("D1")
Range("C1:D3")(2.6).Select '等價於Range("C2")
Range("C1:D3")(2.5).Select '等價於Range("D1")
Range("C1:D3")(3.5).Select '等價於Range("D2")
Range("A1:B3,D2:H6").Select '兩個區域的並
Range("A1:D5 B3:H6").Select '兩個區域的交集
Range("A1:B3").Item(2).Select '等價於Range("A1:B3")(2)
End Sub
注意:
- 如果索引出現小數,則按照“四捨六入五單雙”來進行取捨;
- 索引可以是正數、負數或者零,但是使用負數時候不能超出引用區域;
- 要取多個區域的並集只需要用逗號隔開,取交集用空格隔開。
單元格引用
[a1].Select '等價於Range("A1")
[A1:B3].Select '等價於Range(A1:B3)
[A1:B3,D3:H8].Select '等價於Range("A1:B3,D3:H8")
[A1:B3].Item(2).Select '[B1]
[B2:D9].Cells(2).Select '[C2]
[B2:D9].Cells(2, 2).Select '[C3]
[A:A].Select '整列
[1:1].Select '整行
Sub test()
Set Rng = [a1:d7]
a = Rng.Address(1, 1) '預設情況,$A$1:$D$7
b = Rng.Address(1, 0) '$A1:$D$7
c = Rng.Address(0, 1) '$A$1:$D7
d = Rng.Address(0, 0) '$A1:$D7
Debug.Print a, b
Debug.Print c, d
End Sub
拷貝與剪下操作
Sub test()
Range("A1:C12").Cut Range("f1")
Range("A1:C2").Copy Range("F1")
End Sub
22、OFFSET
OFFSET函式為引用,下例中rng1.Offset(1)則得到A2的引用。rng1.offset(1,1)得到B2的引用。rng1.offset(,1)得到B1的引用。
Sub test()
Worksheets("sheet2").Activate
Set rng1 = Range("A1")
Set rng2 = Range("B1")
Set rng3 = Range("C1")
For index = 0 To ActiveSheet.[a65535].End(xlUp).row - 1
rng3.Offset(index).Value = Val(rng1.Offset(index)) + Val(rng2.Offset(index))
Next
End Sub
也可改寫成
Sub test()
Worksheets("sheet2").Activate
Set rng1 = Range("A1")
For index = 0 To ActiveSheet.[a65535].End(xlUp).row - 1
rng1.Offset(index, 2).Value = Val(rng1.Offset(index)) + Val(rng1.Offset(index, 1))
Next
End Sub
注:給物件型別賦值時必須使用set
23、resize屬性
Sub test()
[A1].Resize(2, 3).Select '選中Range("A1:C2")
[A1].Resize(2).Select '選中Range("A1:A2")
[A1].Resize(, 3).Select '選中Range("A1:C1")
rowCount = [G4].CurrentRegion.Rows.Count
colCount = [G4].CurrentRegion.Columns.Count
[G4].Resize(rowCount, colCount).Select
[G4].Resize(rowCount, colCount).Copy Range("G1").Offset(, 6)
End Sub
24、specialcells屬性
Sub test()
Dim count1%, count2%
count1 = Application.WorksheetFunction.Count(Sheets("sheet1").UsedRange.SpecialCells(xlCellTypeComments)) '統計有批註的單元格個數
count2 = Application.WorksheetFunction.Count(Sheets("sheet1").UsedRange.SpecialCells(xlCellTypeFormulas)) '統計有公式的單元格個數
Debug.Print count1, count2
Sheets("sheet1").UsedRange.SpecialCells(xlCellTypeBlanks).EntireRow.Select '選中含有空格的單元格的行
End Sub
關於sepcialcells引數可以參考幫助文件。
25、end屬性
Sub test()
Dim p(1 To 4, 1 To 2) As Integer
Dim myValues(1 To 4)
myValues(1) = xlUp
myValues(2) = xlDown
myValues(3) = xlToLeft
myValues(4) = xlToRight
For i = 1 To UBound(myValues)
p(i, 1) = Sheet2.UsedRange.End(myValues(i)).row
p(i, 2) = Sheet2.UsedRange.End(myValues(i)).Column
Debug.Print "行號" & p(i, 1) & ",列號" & p(i, 2)
Next
End Sub
結果:
行號1,列號1
行號13,列號1
行號1,列號1
行號1,列號3
26、union方法與interset方法
【例1】
Sub test()
Range("A1:B3,C6:F12").Select
Union([A1:B3], [C6:F12]).Select
End Sub
上面兩種方式選擇的區域相同,但是使用Range方式表達的要求不超過256個字元。
【例2】獲取分數大於80的學生的姓名
Sub test()
Sheet2.Activate
Dim rng As Range
Set rng = Range("A1")
For index = 2 To Cells(Rows.Count, "A").End(xlUp).row
If Range("C" & index) > 80 Then
Set rng = Union(rng, Range("A" & index))
End If
Next
Dim counter%
counter = 1
For Each ra In rng
Range("E" & counter) = ra
counter = counter + 1
Next
End Sub
結果:
【例3】實現隔行插入
Sub test()
For i = 0 To Cells(Rows.Count, 1).End(xlUp).row * 2 Step 2
Intersect([a1:c2].Offset(i), [a2:c3].Offset(i)).EntireRow.Insert
Next
End Sub
執行前後結果如下:
27、merge方法及unmerge方法
merge方法合併單元格,unmerge方法拆分合並的單元格。
【示例】合併單元格
Sub test()
Application.DisplayAlerts = False
For i = Cells(Rows.Count, 1).End(xlUp).row To 2 Step -1
If Range("A" & i).Offset(-1) = Range("A" & i) Then
Range("A" & i).Offset(-1).Resize(2).Merge
End If
Next
Application.DisplayAlerts = True
End Sub
合併前 |
合併後 |
【例2】拆分合並的單元格
Sub test()
For Each rng In [a1:a12]
Count = rng.MergeArea.Count
rng.UnMerge
rng.Resize(Count) = rng
Next
End Sub
拆分前 |
拆分後 |
注:使用MergeArea.Count屬性可以知道合併單元格中合併的數量。