Дэйву нужен способ в макросе определить, сколько столбцов видно в текущем окне или панели.

На самом деле это довольно легко сделать. Хитрость заключается в том, чтобы помнить, что вам нужно работать с объектом VisibleRange, который принадлежит объекту ActiveSheet. Вы можете использовать коллекцию .Columns для объекта VisibleRange, а затем использовать метод .Count для этой коллекции. В итоге вы получите количество столбцов, например:

Sub VisibleColCount()

Dim sTemp As String

sTemp = "There are "

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

MsgBox sTemp End Sub

Кажется просто, правда? Проблема в том, что метод .Count возвращает количество столбцов в коллекции независимо от того, скрыты они или нет. Например, предположим, что вы смотрите на экран и видите, что он показывает столбцы от C до H. Это означает, что отображается 6 столбцов, и именно это возвращает метод .Count в приведенном выше макросе. Если затем скрыть столбец F, теперь отображаются столбцы с C по I. Вместо .Count по-прежнему возвращает 6 (представляющих столбцы C, D, E, G, H и I), теперь он возвращает 7, который включает скрытый столбец, даже если он не отображается.

Решением этой ситуации является проверка свойства .Hidden каждого столбца в коллекции .Columns. Только если для свойства .Hidden установлено значение False, столбец следует считать видимым следующим образом:

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

Есть еще одна проблема с этим подходом: что касается VBA, столбец считается видимым, пока отображается только его полоса. Кроме того, если вы планируете использовать панели на дисплее Excel, вы можете рассмотреть возможность добавления в смесь объекта ActivePane. По сути, требуется простое изменение вышеуказанных макросов:

В любом месте, где вы видите объект ActiveWindow, используйте ActivePane, как показано ниже:

For Each c In ActiveWindow.ActivePane.VisibleRange.Columns

Это гарантирует, что ваш макрос смотрит только на текущую панель в окне при подсчете.

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (617) применим к Microsoft Excel 2007, 2010, 2013 и 2016.