Làm việc với Range (2)

Lặp qua một vùng một cách hiệu quả

Nhiều Macro thực hiện thao tác trên mỗi ô của vùng, hoặc chúng có thể thực hiện những tác động chọn lọc dựa trên nội dung của mỗi ô. Những Macro này luôn luôn bao gồm vòng lặp For-Next xử lý trên mỗi ô của vùng.

Ví dụ dưới đây giải thích việc lặp qua một vùng ô như thế nào. Trong trường hợp này, vùng là vùng chọn hiện hành. Một biến số được đặt tên là Cell tham chiếu đến ô đang được xử lý. Vòng lặp For-Next sẽ duyệt qua các ô trong vùng đang chọn và sẽ thay đổi màu nền của ô nếu ô chứa giá trị dương.


1
2
3
4
5
6
Sub ProcessCells()
         Dim Cell As Range
         For Each Cell In Selection
                 If Cell.Value >0 Then Cell.Interior.ColorIndex = 6
         Next Cell
End Sub


Ví dụ trên làm việc đúng như mong đợi, nhưng cái gì sẽ xảy ra nếu vùng chọn là toàn bộ cột hay hàng? Trong trường hợp như thế, macro dường như thực hiện mãi mãi bởi vì nó lặp qua mỗi ô của vùng chọn – ngay cả những ô trống. Để macro hiệu quả hơn, bạn cần thêm điều kiện cho quá trình lặp và chỉ thực hiện việc thay màu ô cho những ô không trống.

Thủ tục dưới đây sử dụng phương thức SpecialCells. Thủ tục này sử dụng từ khoá Set để tạo 2 đối tượng mới: một tập con của vùng đang chọn bao gồm các ô chứa hằng số, và một tập con của vùng chọn bao gồm các ô chứa công thức. Thủ tục xử lý trong mỗi tập con này sẽ hiệu quả hơn vì bỏ qua những ô trống. Một sự khéo léo thú vị, phải không bạn?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub SkipBlanks()
    Dim ConstantCells As Range
    Dim FormulaCells As Range
    Dim cell As Range
     
    'Ignore errors
    On Error Resume Next
     
    Cells.ClearFormats
     
    'Process the constants
    Set ConstantCells = Selection.SpecialCells(xlConstants)
    For Each cell In ConstantCells
        If cell.Value > 10 Then
            cell.Interior.ColorIndex = 15
            cell.Font.Color = vbRed
        End If
    Next cell
 
 
    'Process the formulas
    Set FormulaCells = Selection.SpecialCells(xlFormulas)
    For Each cell In FormulaCells
        If cell.Value > 20 Then
            cell.Interior.ColorIndex = 16
            cell.Font.Color = vbBlue
        End If
    Next cell
End Sub


Thủ tục SkipBlanks sẽ chạy nhanh hơn thủ tục trước bất chấp bạn chọn cái gì. Ví dụ, bạn có thể chọn một vùng hoặc tất cả các cột trong một vùng, hoặc tất cả các hàng trong một vùng, hoặc ngay cả toàn bộ bảng tính. Đây là một sự cải thiện rất lớn so với thủ tục ProcessCells được trình bày ở phần trước. Hãy chú ý rằng tôi sử dụng dòng lệnh dưới đây trong code này:

1
On Error Resume Next


Dòng lệnh này để Excel bỏ qua bất kỳ các lỗi xảy ra ở dòng lệnh nào và nhảy sang dòng lệnh kế tiếp. Dòng lệnh này cần thiết vì phương thức SpecialCells tạo ra lỗi nếu không có những ô đủ điều kiện.

Sử dụng phương thức SpecialCells tương đương với việc chọn lệnh Home | Find & Select | GoTo (Ctrl+G), nhấn nút Special và chọn tuỳ chọn Constants hay Formulas. Để hiểu hơn, bạn hãy ghi macro lại các hành động này với những sự lựa chọn khác nhau.


Xác định kiểu của vùng đang chọn

Nếu bạn thiết kế Macro của bạn để làm việc với vùng chọn, macro phải có thể xác định được một vùng thực sự được chọn hay không. Nếu đang chọn là một đối tượng khác vùng (như một đồ thị hay một hình vẽ), macro sẽ bị lỗi. Thủ tục dưới đây sử dụng hàm VBA TypeName để nhận ra kiểu đối tượng đang được chọn.

1
2
3
4
Sub SelectionType()
         MsgBox TypeName(Selection)
End Sub


Nếu bạn muốn macro của bạn chỉ làm việc với vùng, bạn có thể thêm câu lệnh If để kiểm tra đối tượng đang chọn có phải là vùng hay không. Ví dụ sau minh họa cách thức kiểm tra đối tượng chọn, nếu không là vùng sẽ thoát thủ tục nếu đúng là vùng thì sẽ thực hiện các lệnh tiếp theo.

1
2
3
4
5
6
7
8
9
10
Sub CheckSelection()
         If TypeName(Selection) <> “Range” Then
                  MsgBox “Select a Range”
                  Exit Sub
         End If
         ...
         Những dòng lệnh khác ở đây
         ...
End Sub



Nhận biết nhiều vùng đang chọn

Như bạn biết, Excel cho phép chọn nhiều vùng bằng cách nhấn phím Ctrl và chọn các đối tượng hoặc các vùng. Việc này gây ra nhiều vấn đề với một vài Macro. Ví dụ, bạn không thể sao chép nhiều vùng gồm mhững vùng không kề cận nhau.

Macro dưới đây minh họa cách xác định người dùng có chọn nhiều vùng hay không để từ đó có phương án xử lý thích hợp.

1
2
3
4
5
6
7
8
9
10
Sub MultipleSelection()
         If Selection.Areas.Count > 1 Then
                 MsgBox “Ban dang chon nhieu vung!”
                 Exit Sub
         End If
         ...
         Những dòng lệnh khác ở đây
         ...
End Sub


Ví dụ này sử dụng phương thức Areas, phương thức này sẽ cho kết quả là một tập hợp các đối tượng trong vùng chọn. Thuộc tính Count cho kết quả là số lượng các đối tượng trong tập hợp.
Share on Google Plus