Прежде всего, ваше требование не подходит для заполнения глобальной переменной. Это определенно задача для функции.
Во-вторых, ваша строка lc = Rows(1).SpecialCells(xlCellTypeConstants, 23).Cells.Count
выдаст ошибку, если нет соответствующих SpecialCells. Поэтому для этого потребуется обработчик ошибок, чтобы он мог возвращать -1 вместо сбоя.
В-третьих, вместо того, чтобы заставить вашу идею подсчета SpecialCells работать, рассмотрите альтернативу, которая заключается в том, чтобы найти конец первой строки глядя справа (вместо того, чтобы считать слева). Приведенные выше рассуждения приводят меня к этой функции.
Function ColumnsCount(Optional Ws As Worksheet) As Long
If Ws Is Nothing Then Set Ws = ActiveSheet
With Ws
ColumnsCount = .Cells(1, .Columns.Count).End(xlToLeft).Column - 1
End With
End Function
Реализация этой функции в вашем коде приводит к этим двум строкам кода в вашей Test
процедуре.
Set Sh = .Sheets(Sheets.Count)
If Not last_is_visible Then .Sheets(Sh.Index - ColumnsCount(Sh)).Visible = False
Функция ColumnCount
вернет счет из рабочего листа, заданного ему в качестве параметра. В приведенном выше коде это лист Sh
. В коде вашего вопроса это, кажется, ActiveSheet
(возможно, Sh
- это активный лист. Просто убедитесь, что вы пропустили лист, на который хотите сосчитать, и функция вернет правильный число.
В качестве двух принципиальных вопросов: во-первых, избегайте максимально возможного использования ActiveSheet
. Присвойте свои листы переменным с осмысленным именем и обращайтесь к ним по именам, которые вы дали себе. Это потому, что ActiveSheet
может зависеть от действий пользователя, выходящих за рамки вашего кода, и 9 раз из 10 это не значимое имя.
Во-вторых, избегайте того, что rubberduck называет «snake_names». LastIsVisible - это значимое имя, last_is_visible - это боль в глазу. Я бы использовал LastVis, потому что он короче. Я также рекомендую использовать прописные и строчные буквы в именах, и это моя причина.
- Когда вы объявляете имена, в операторах Dim , используйте заглавные и маленькие буквы.
- При написании кода используйте только строчные буквы.
- VBA исправит заглавные буквы вы печатаете, чтобы соответствовать объявлению.
- Итак, когда VBA не меняет введенные вами имена, вы знаете, что существует опечатка. - Мгновенное оповещение без каких-либо усилий. И ваш код становится легче читать в сделке.