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

猜你喜欢

转载自blog.csdn.net/huzhizhewudi/article/details/84497221
今日推荐