#excel #vba
#excel #vba
Вопрос:
У меня есть много таблиц стилей в Workbook в Excel, и мне нужно внести некоторые изменения почти в каждую таблицу стилей. Первые два из них и несколько последних следует пропустить.
Я использую для каждого цикла и действительно не представляю, как пропустить 2 первых элемента. С последними это не проблема, потому что я проверяю имя таблицы стилей, и если оно соответствует моему условию, я прерываю цикл и выхожу.
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Activate
If ws.Name = "03.2016PTF" Then Exit For
'here's my code
Next
Если я выйду из цикла при запуске, я не буду вносить изменения в остальные документы.
Комментарии:
1. Вы имеете в виду пропуск листов?
if not ws.Name = "03.2016PTF" and not ws.Name = "03.2017PTF" then
2. Или потеряйте
Exit For
и измените его так, чтобы if-оператор стал an,if-not "condition" then
который заключает в себе'here's my code
раздел3. Не нужно ни активировать, ни выбирать (хотя вы и не делаете последнего)
4. @TimStack, если только OP позже не использует
ActiveSheet
вместоws
…..5. @Mistella, Что я бы тоже не рекомендовал им делать
Ответ №1:
Попробуйте:
With ThisWorkbook
maxsht = .Sheets.Count
For i = 3 To maxsht
If .Sheets(i).Name = "03.2016PTF" Then Exit For
'here's my code
Next i
End With
Он перебирает все листы, используя Index
, поэтому эффективно вы можете начать с n-го листа, в данном случае третьего.
Код повторяется до последнего листа в wb
, пока он не встретит вышеупомянутый лист с именем 03.2016PTF
, на котором цикл завершается.
Комментарии:
1. Хотя вы предполагаете, что листы, которые нужно пропустить, находятся на 2 первых индексах, вы все еще используете оператор if для выхода из for в случае, если один из следующих листов после третьего является этим. Он спросил, как пропустить 2 листа, вы заканчиваете цикл, если вы его найдете.
2. @Damian Я не вижу проблемы. OP хочет выполнить итерацию всех листов, за исключением первых n листов, и завершить цикл, когда он встретит определенный именованный лист. Это то, что делает мой код. В качестве альтернативы он мог бы установить последний индекс для цикла, но это не слишком сильно изменится.
3. OP хочет пропустить 2 листа, вы завершаете процедуру, если на итерации появляется один (а не два, которые он запрашивает) из избегаемых листов. Итак, если
Sheets(3).Name = "03.2016PTF"
этот макрос ничего не делает.4. Читаю сообщение OP снова и снова, но не вижу, чтобы он упоминал, что хочет завершить цикл, если встречается одно из имен листов, только одно. «Первые два из них и несколько последних следует пропустить». Имя второго листа не упоминается. Если третий лист назван
03.2016PTF
и цикл заканчивается, это именно то, что запросил OP.5. Вот еще одна проблема, я уже использовал другой цикл For внутри этого для каждого, теперь, когда я пытаюсь использовать ваше решение, я получил ошибку
For control variable already in use
Ответ №2:
Использование And
инструкции if для проверки наличия дополнительных критериев.
Or
любой из них может вызвать if.And
все они должны быть true, чтобы сработал if.
Таким образом, вы можете заполнить столько листов, сколько вам нужно, и не будете беспокоиться об их порядке.
Dim ws As Worksheet, arrWs As Variant, Skiped As Boolean
arrWs = Array("Sheet1ToAvoid", "Sheet2ToAvoid", "...") 'fill this with as much sheets you need
For Each ws In ThisWorkbook.Worksheets
Skiped = Application.Match(ws.Name, arrWs, 0)
If Not Skiped Then
'here's my code
End If
Next
Комментарии:
1. Но в конце нужно пропустить около 30 ~ таблиц стилей, поэтому условия будут огромными
2. Вы уверены, что конечный пользователь никогда не переместит листы? В противном случае вы могли бы просто ввести все имена в массив и проверить только 1 условие.
3. Поскольку вы видите название «03.2016PTF» в марте 2016 года, мне нужно сначала пропустить 2, потому что это сводки, а затем начиная с текущего месяца, поэтому «02.2019» (в каждом месяце есть 2 таблицы стилей), мне нужно менять данные в каждом месяце до мая 2016 года, и в конце есть еще 30-40 месяцев, которые мне нужно пропустить.
4. @paprykarz Я отредактировал свой ответ, чтобы вместить все нужные вам листы сразу.