1. 程式人生 > >Excel中VBA程式設計學習筆記(四)

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屬性可以知道合併單元格中合併的數量。