Chọn các cột trong VBA khi các ô được hợp nhất (Microsoft Excel)
Giả sử bạn có một trang tính trống và phạm vi A1: F1 có định dạng “hợp nhất và căn giữa” được áp dụng cho trang tính đó. Nếu bạn chọn cột B bằng cách nhấp vào tiêu đề cột, Excel sẽ chọn cột B một cách cẩn thận và đặt ô B2 là ô hoạt động. Hành vi này đã được sửa đổi trong Excel 2000 hoặc Excel 2002; trong các phiên bản Excel trước, bạn nhận được ô đã hợp nhất (A1: F1)
đưa vào lựa chọn.
Rõ ràng, VBA đi sau phần nào hành vi của giao diện người dùng, vì chọn toàn bộ cột B cũng kết thúc chọn tất cả các cột, từ A đến F:
Sub TestMacro1() Range("B3").EntireColumn.Select End Sub
Dường như không có cách nào xung quanh hành vi này. Ngay cả khi bạn loại bỏ phương thức EntireColumn và chỉ cần chọn cột B, bạn vẫn nhận được tất cả các cột, từ A đến F:
Sub TestMacro2() Range("B:B").Select End Sub
Có thể là một cách tiếp cận lập trình tốt hơn để không chọn cột chuẩn bị để thực hiện một số hành động trên cột đó, mà thực hiện hành động trực tiếp. Ví dụ, giả sử rằng bạn muốn tô đậm tất cả các ô trong cột B. Bạn có thể làm như vậy theo cách này:
Sub TestMacro3() Range("B3").EntireColumn.Font.Bold = True End Sub
Điều này chỉ ảnh hưởng đến các ô trong cột B và không ảnh hưởng gì trong A hoặc C đến F. Tương tự, bạn có thể sử dụng phương pháp lặp lại để xử lý các ô trong cột mong muốn:
Sub TestMacro4() Dim rCell As Range Dim X As Long X = 1 For Each rCell In Range("B:B") rCell.Value = X X = X + 1 Next End Sub
Thao tác này sẽ nhồi một giá trị vào mỗi ô trong cột B và thuận tiện bỏ qua bất kỳ hợp nhất nào bao gồm một ô trong cột B.
Nếu bắt buộc bạn có thể chọn toàn bộ một cột mà không có bất kỳ cột nào được thêm vào do các ô đã hợp nhất, thì bạn có thể muốn sử dụng thuộc tính MergeCells để kiểm tra các ô đã hợp nhất. Theo trợ giúp trực tuyến của VBA, phần sau sẽ phát hiện các ô đã hợp nhất trong vùng chọn và sau đó loại bỏ macro:
Sub TestMacro5() Range("B3").EntireColumn.Select If Selection.MergeCells Then Exit Sub End If ' ' Perform rest of macro ' End Sub
Thật không may, thử nghiệm cho thấy rằng mã này sẽ không hoạt động. Thuộc tính MergeCells rõ ràng chỉ trả về True nếu toàn bộ vùng chọn được tạo thành từ các ô đã hợp nhất, chứ không phải nếu vùng chọn chỉ chứa một vài ô được hợp nhất. Điều đó có nghĩa là bạn phải làm một số cách khác để xác định xem các ô được hợp nhất có sửa đổi lựa chọn dự kiến hay không, chẳng hạn như sau:
Sub TestMacro6() Range("B3").EntireColumn.Select If Selection.Columns.Count > 1 Then Exit Sub End If ' ' Perform rest of macro ' End Sub
Cách tiếp cận này kiểm tra số lượng cột trong vùng chọn, sau đó loại bỏ nếu Excel báo cáo rằng có nhiều hơn một cột.
_Lưu ý: _
Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.
ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.
Mẹo này (3093) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: