Bài viết: Làm việc với Range (2)

Liên hệ QC

kyo

Nguyễn Khắc Duy
Thành viên danh dự
Tham gia
4/6/06
Bài viết
901
Được thích
2,714
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.

Range_02.JPG


Mã:
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?

Mã:
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:

Mã:
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.

Mã:
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.

Mã:
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.

Mã:
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.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể giới thiệu thêm vòng lặp chọn các vùng nằm trong cặp comment mà mình có sẵn không.
ví dụ mình có cặp comment là Home - End không
 
Ngoài ra chúng ta còn có thể chuyển kiểu tham chiếu từ dạng A1 sang dạng R1C1, kiểu tham chiếu R1C1 rất hữu ích cho việc tính toán vị trí dòng và cột trong VBA. Đối với kiểu R1C1, Excel ký hiệu “R” để chỉ dòng theo sau là số thứ tự dòng và ký hiệu "C" để chỉ cột theo sau là số thứ tự cột.


___________


eman
 
Web KT
Back
Top Bottom