Условное `if ()` не работает в вложенном цикле

Я зацикливаю рабочие листы в двух книгах. Если в обеих книгах имеется соответствующий лист, я переношу определенный диапазон от одной книги к другой. (Это прокомментировано ниже).

Я также отслеживаю, какой рабочий лист присутствует в одной книге, а не другой (что не приводит к передаче), в котором я столкнулся с проблемой. Меня интересуют только те листы, которые содержат «-», и поместили мою коллекцию в условное, но листы, которые не содержат «-», все еще добавляются.

Я думаю, что проблема заключается в внешнем цикле? Он не добавляется во время внутреннего, но когда внешний снова появляется, он вызывает .add ? Поэтому, возможно, лучший вопрос: какова логика цикла для проверки соответствия рабочих листов?

 For Each ws In lastWB.Worksheets Set lastWS = ws lastName = lastWS.Name For Each s In ThisWorkbook.Worksheets If InStr(1, s.Name, "-") Then If s.Name = lastName And s.Range("C3").Value <> "5860" Then Debug.Print lastName 's.Range("C14:O48").Value = lastWS.Range("C14:O48").Value Else skippedAct.Add lastName 'still adding sheets that do not contain "-" End If End If Next Next 

Ваш вложенный цикл может быть запутанным, и я думаю, что это источник вашей проблемы, как объясняется в комментариях к OP: вы добавляете lastName в коллекцию всякий раз, когда Instr возвращает False , а потому, что вы проверяете каждый лист в lastWB против каждого лист в этой ThisWorkbook , вы получаете неожиданные результаты.

Это было бы хорошим местом для использования пользовательской функции:

 Function SheetExists(sName as String, wb as Workbook) 'Function which will check the presence of a sheet in a given workbook Dim ret On Error Resume Next Set ret = wb.Worksheets(sName) SheetExists = (Err.Number = 0) End Function 

Избавьтесь от вложенного цикла и просто выполните For each s in ThisWOrkbook.Worksheets , например:

  For Each s In ThisWorkbook.Worksheets If InStr(1, s.Name, "-") Then If SheetExists(s.Name, lastWB) And s.Range("C3").Value <> "5860" Then s.Range("C14:O48").Value = lastWB.Worksheets(s.Name).Range("C14:O48").Value Else skippedAct.Add s.Name 'still adding sheets that do not contain "-" End If End If Next 

Обратите внимание, что функция Instr не возвращает Boolean (True / False). Вместо этого он возвращает Integer с размещением найденного значения. Итак, попробуйте использовать что-то вроде:

If InStr(1, s.Name, "-") > 0 Then

 For Each ws In lastWB.Worksheets Set lastWS = ws lastName = lastWS.Name 'if lastWG has "-", skip it. If InStr(1, lastName, "-") Then For Each s In ThisWorkbook.Worksheets 'If the names match, move forward (any with a "-" will have already been skipped) If s.Name = lastName And s.Range("C3").Value <> "5860" Then Debug.Print lastName 's.Range("C14:O48").Value = lastWS.Range("C14:O48").Value Else 'If lastName does not have "-" and does not match the current sheet, log it skippedAct.Add lastName End If Next End If Next 

Это будет записывать lastName для каждого листа в этой рабочей книге, которая не соответствует. Я собираюсь догадаться, что вы хотите зарегистрировать его, если он вообще не найден … поэтому я бы сделал это:

 Dim logLast as Boolean For Each ws In lastWB.Worksheets Set lastWS = ws lastName = lastWS.Name 'if lastName has "-", skip it. If InStr(1, lastName, "-") Then LogLast = True For Each s In ThisWorkbook.Worksheets 'If the names match, move forward (any with a "-" will have already been skipped) If s.Name = lastName And s.Range("C3").Value <> "5860" Then logLast = False Debug.Print lastName 's.Range("C14:O48").Value = lastWS.Range("C14:O48").Value End If Next If logLast then skippedAct.Add lastName End If Next 
  • Введите имя рабочей книги в целевой лист в цикле
  • Excel Macro: Итерация по строкам и комбинированный цикл
  • Пытается создать цикл, который создает новый лист excel и копирует данные на листе
  • Скрытие определенных столбцов таблицы Excel
  • Вставка combobox через код
  • Экспорт и настройка отчета о кристалле в Excel
  • Пропуск цикла с конечной строкой, определяемый значением ячейки, который также петли
  • vba do while loop wont exit loop
  • Excel - нужно знать, как это зацикливать
  • Добавление в макрос, который создает граф из нескольких листов в excel
  • Использование для if, если в Excel VBA подсчитывать значения ячеек до последней строки, но в то же время хотят сделать это менее 30
  • Давайте будем гением компьютера.