Dave necesita una forma, en una macro, de determinar cuántas columnas están visibles en la ventana o panel actual.

En realidad, esto es bastante fácil de lograr. El truco consiste en recordar que debe trabajar con el objeto VisibleRange, que pertenece al objeto ActiveSheet. Puede usar la colección .Columns para el objeto VisibleRange y luego utilizar el método .Count para esa colección. Lo que terminas es el número de columnas, de esta manera:

Sub VisibleColCount()

Dim sTemp As String

sTemp = "There are "

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

MsgBox sTemp End Sub

Parece simple, ¿verdad? El problema es que el método .Count devuelve el número de columnas de la colección, ya sea que estén ocultas o no. Por ejemplo, digamos que mira la pantalla y ve que muestra las columnas C a H. Eso significa que se muestran 6 columnas, y eso es lo que devuelve el método .Count en la macro anterior. Si luego oculta la columna F, ahora se muestran las columnas C a I. En lugar de que .Count siga devolviendo 6 (que representan las columnas C, D, E, G, H e I), ahora devuelve 7, que incluye la columna oculta, aunque no es visible.

La solución a esta situación es verificar la propiedad .Hidden de cada columna de la colección .Columns. Solo si la propiedad .Hidden es False, la columna debe contarse como visible, de esta manera:

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

Hay otro problema con este enfoque: en lo que respecta a VBA, una columna se cuenta como visible siempre que se muestre solo una parte de esa columna. Además, si prevé usar paneles en su pantalla de Excel, puede considerar agregar el objeto ActivePane a la mezcla. Básicamente, se necesita un simple cambio en las macros anteriores:

En cualquier lugar donde vea el objeto ActiveWindow, sígalo con ActivePane, similar a esto:

For Each c In ActiveWindow.ActivePane.VisibleRange.Columns

Esto asegura que su macro esté mirando solo el panel actual en la ventana cuando realiza su recuento.

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (617) se aplica a Microsoft Excel 2007, 2010, 2013 y 2016.