Определение количества видимых столбцов (Microsoft Excel)
Дэйву нужен способ в макросе определить, сколько столбцов видно в текущем окне или панели.
На самом деле это довольно легко сделать. Хитрость заключается в том, чтобы помнить, что вам нужно работать с объектом 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.