(1条消息) Excel中VBA编程学习笔记(四)
18、CurrentRegion属性
CurrentRegion返回活动单元格所在的周围由空行和空列组成的单元格区域(即通常所说的当前区域),如图1所示。
当前区域即活动单元格所在的矩形区域,该矩形区域的每一行和每一列中至少包含有一个数据,其周围是空行和空列,图1中列举了其中的4种情形(见蓝色阴影区域)。在当前区域范围内,不管活动单元格是哪一个单元格,其所在的当前区域均为同一区域,如上例中的B5:D7区域,活动单元格B5的当前区域为B5:D7,当活动单元格为C6时,其当前区域仍为B5:D7。
Sub testCurrentRegion()
Dim rng As Range, ws As Worksheet
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("G:G").EntireColumn.AutoFit
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属性可以知道合并单元格中合并的数量。