Sử dụng phương thức union trong VBA để giảm thiểu thao tác bằng tay

  • Thread starter thanhphong
  • Ngày gửi
T

thanhphong

Guest
Range là gì? Union khác với Range như thế nào?
Chào các bạn. Tôi là Thanh Phong đến từ diễn đàn THVBA. Ở topic này tôi sẽ giới thiệu phương thức union.
Đây là một phương thức tiện lợi mà tôi muốn giới thiệu cho các bạn.

Union có thể hợp thể nhiều Range thành một khối thống nhất, từ đó ta tác động vào khối này, giảm thiểu tối đa các thao tác.
Range là tập hợp nhiều ô trên bảng tính. Có thể là cả một dòng hay nhiều dòng trên bảng tính.
Hay một cột, hoặc nhiều cột trên bảng tính.
Bạn cần đăng nhập để thấy đính kèm

Khi chúng ta muốn thao tác với nhiều vùng Range rời rạc trên bảng tính, khi đó ta nghĩ tới Union.
Bạn cần đăng nhập để thấy đính kèm


Ví dụ:
Mã:
Sub union_test()

Union(Range("B2:D6"), Range("F10"), Range("B10:C13")).Interior.ColorIndex = 4

End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Như vậy thay vì phải đi xử lý từng Range, thông qua Union, chúng ta áp đặt lệnh tô màu chỉ một lần.

Union vẫn có khác biệt so với Range.
Mặc dù Union cũng là để chỉ định một phạm vi nào đó trên bảng tính.
Ta đi vào thực nghiệm sau:
Mã:
Sub range_test()

Range("N2:P5,Q9:Q11,O13:P17,I19:K21,H18,G17,F21,D23,C21,B20,A21,A23,B23,A14,G9,F9,F13,G12,E7,A1,B2,C3,C4,A6:C10,E12,G6,F3,E2,D5,J5,J11,I14,G15,H10,I4,H2,M4,M9,L9,K3,K1,L4,L6,J8,H7,I9,B12:E18,G20,K13:L17,N12,N2:P5,Q9:Q11,O13:P17,I19:K21,H18,G17,F21,D23,C21,B20,A21,A23,B23").Interior.ColorIndex = 4

End Sub
Có báo lỗi xảy ra:
Bạn cần đăng nhập để thấy đính kèm

Khi chỉ định Range, thì số lượng ký tự trong dấu đóng mở ngoặc nếu vượt quá 255 ký tự, sẽ xảy ra lỗi.
Do đó khi chúng ta muốn làm việc với nhiều cells, thì Range rất khó sử dụng.
Union cũng có giới hạn nhưng ta có thể chỉ định tới 30 vùng Range trong Union.
Như vậy bên trong Range có thể chỉ định địa chỉ tới 255 ký tự * 30 vùng Range, thì số lượng xử lý của Union được nâng lên đáng kể.

Nếu chúng ta sử dụng khéo léo Range và Union kết hợp với nhau, ta có thể tránh được lỗi.

Khi nào chúng ta nghĩ tới Union?
  • Khi thực hiện copy và delete.
  • Khi tạo Graph.
  • Thay đổi màu của cells, chữ,...
Như ở topic này, tôi đã dùng union và xóa một loạt dòng khi thỏa mãn điều kiện, các bạn tham khảo thêm ở đây:
Tham khảo từ :
 

tuhocvba

Administrator
Thành viên BQT
BQT THVBA đánh giá cao những nỗ lực của Thanh Phong trong thời gian qua. Cố lên!!!

Cách sử dụng cơ bản
1. Select vùng Range

Đoạn code này chỉ có ý nghĩa giúp các bạn ghi nhớ cấu trúc lệnh:
Mã:
    Sub union_test()
    
    Union(Range("B2:D6"), Range("F10"), Range("B10:C13")).Select
    
    End Sub
Bạn cần đăng nhập để thấy đính kèm


2. Chỉ chọn những ô thỏa mãn điều kiện:
Trên cột A tôi có danh sách.
Bạn cần đăng nhập để thấy đính kèm

Trên ô C1 tôi ghi tên người cần tìm kiếm.
Trên cột A những nơi nào có tên trùng với tên ghi ở ô C1 thì select.
Mã:
    Sub union_test()
    
    'Nhung cells thoa man dieu kien thi duoc cat vao bien nay
    Dim target_cell As Range
    Dim s   As String
    s = ThisWorkbook.Sheets(1).Cells(1, 3)
    'Chay vong lap
    For i = 2 To 12
        'Kiem tra dieu kien
        If Cells(i, 1).Value = s Then
            If target_cell Is Nothing Then
                Set target_cell = Cells(i, 1)
            Else
                Set target_cell = Union(target_cell, Cells(i, 1))
            End If
        End If
    Next
    
    If Not target_cell Is Nothing Then
        'Select
        target_cell.Select
    End If
    
    End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


(Còn nữa)
Các bạn không comment trong topic này cho tới khi có thông báo kết thúc.
 
T

thanhphong

Guest
Ở code trên, thay vì select, ta hãy thử với các thao tác khác:
Tô màu:
Mã:
target_cell.Interior.ColorIndex = 3
Mã:
target_cell.Interior.Color = RGB(120, 30, 200)
Copy & Paste:
Mã:
'Copy
target_cell.Copy
 
'Paste vao o B2
Range("B2").PasteSpecial (xlPasteAll)
Xóa cells:
Mã:
'delete cells
target_cell.Delete
(Còn nữa)
 
B

bvtvba

Guest
Vẽ đồ thị:
Bạn cần đăng nhập để thấy đính kèm

Mã:
Sub union_test()
 
'Tim cac cells thoa man va nap vao target_cell
Dim target_cell As Range
 
'Chay toi A6
For i = 1 To 6
    
    'Cells nao co chu Anh thi nap vao union
    If InStr(Cells(i, 1).Value, "Anh") > 0 Then
        If target_cell Is Nothing Then
            Set target_cell = Cells(i, 2)
        Else
            Set target_cell = Union(target_cell, Cells(i, 2))
        End If
    End If
 
Next
 
If Not target_cell Is Nothing Then
 
    'Ve do thi
    target_cell.Select
    ActiveSheet.Shapes.AddChart.Chart.ChartType = xlColumnClustered
 
End If
 
End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

(còn nữa)
 
Top