(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可以是integerfloatdouble等类型的值,而textstring类型的值。

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

注意:

  1. 如果索引出现小数,则按照“四舍六入五单双”来进行取舍;
  2. 索引可以是正数、负数或者零,但是使用负数时候不能超出引用区域;
  3. 要取多个区域的并集只需要用逗号隔开,取交集用空格隔开。

单元格引用

[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属性可以知道合并单元格中合并的数量。

(0)

相关推荐