Dave cần một cách, trong macro, để xác định có bao nhiêu cột được hiển thị trong cửa sổ hoặc ngăn hiện tại.

Điều này thực sự khá dễ dàng để thực hiện. Bí quyết là hãy nhớ rằng bạn cần làm việc với đối tượng VisibleRange, thuộc đối tượng ActiveSheet. Bạn có thể sử dụng tập hợp .Columns cho đối tượng VisibleRange, sau đó sử dụng phương thức .Count cho tập hợp đó. Kết quả của bạn là số lượng cột, theo cách này:

Sub VisibleColCount()

Dim sTemp As String

sTemp = "There are "

sTemp = sTemp & ActiveWindow.VisibleRange.Columns.Count     sTemp = sTemp & " columns visible."

MsgBox sTemp End Sub

Có vẻ đơn giản, phải không? Vấn đề là phương thức .Count trả về số cột trong bộ sưu tập cho dù chúng bị ẩn hay không. Ví dụ, giả sử bạn nhìn vào màn hình và bạn thấy nó hiển thị các cột từ C đến H. Điều đó có nghĩa là 6 cột được hiển thị và đó là những gì phương thức .Count trả về trong macro trên. Nếu sau đó bạn ẩn cột F, bây giờ các cột từ C đến I được hiển thị. Thay vì .Count vẫn trả về 6 (đại diện cho các cột C, D, E, G, H và I), giờ nó trả về 7, bao gồm cột ẩn, mặc dù nó không hiển thị.

Giải pháp cho tình huống này là kiểm tra thuộc tính .Hidden của mỗi cột trong bộ sưu tập .Columns. Chỉ khi thuộc tính .Hidden là False thì cột mới được tính là hiển thị, theo cách này:

Sub VisibleColCount()

Dim c As Range     Dim iCount As Integer     Dim sTemp As String

iCount = 0     For Each c In ActiveWindow.VisibleRange.Columns         If Not c.Hidden Then iCount = iCount + 1     Next c

sTemp = "The active window includes "

sTemp = sTemp & ActiveWindow.VisibleRange.Columns.Count     sTemp = sTemp & " columns. Of those columns, "

If iCount = ActiveWindow.VisibleRange.Columns.Count Then         sTemp = sTemp & "all "

Else         sTemp = sTemp & "only "

End If     sTemp = sTemp & iCount & " are visible."

MsgBox sTemp End Sub

Có một vấn đề khác với cách tiếp cận này: Theo như VBA có liên quan, một cột được tính là có thể nhìn thấy miễn là chỉ một phần nhỏ của cột đó được hiển thị. Ngoài ra, nếu bạn dự đoán sử dụng các ngăn trong màn hình Excel của mình, bạn có thể muốn xem xét thêm đối tượng ActivePane vào hỗn hợp. Về cơ bản, cần một thay đổi đơn giản trong các macro trên:

Bất kỳ nơi nào bạn nhìn thấy đối tượng ActiveWindow, hãy theo dõi nó với ActivePane, tương tự như sau:

For Each c In ActiveWindow.ActivePane.VisibleRange.Columns

Điều này đảm bảo rằng macro của bạn chỉ nhìn vào ngăn hiện tại trong cửa sổ khi thực hiện đếm.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (617) áp dụng cho Microsoft Excel 2007, 2010, 2013 và 2016.