Для каждого в VBA — начиная с третьей таблицы стилей

#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 Я отредактировал свой ответ, чтобы вместить все нужные вам листы сразу.