Условное `if ()` не работает в вложенном цикле
Я зацикливаю рабочие листы в двух книгах. Если в обеих книгах имеется соответствующий лист, я переношу определенный диапазон от одной книги к другой. (Это прокомментировано ниже).
Я также отслеживаю, какой рабочий лист присутствует в одной книге, а не другой (что не приводит к передаче), в котором я столкнулся с проблемой. Меня интересуют только те листы, которые содержат «-», и поместили мою коллекцию в условное, но листы, которые не содержат «-», все еще добавляются.
Я думаю, что проблема заключается в внешнем цикле? Он не добавляется во время внутреннего, но когда внешний снова появляется, он вызывает .add
? Поэтому, возможно, лучший вопрос: какова логика цикла для проверки соответствия рабочих листов?
- Автопопуляция путем поиска нескольких столбцов
- VSTO Excel: как создать настраиваемое сопоставление столбцов с помощью ListObject?
- EXCEL: таблица поиска на основе входов и обеспечение соответствующего выходного значения на основе BEST FIT
- Статические формулы в Excel
- VBA: открывать файлы, вычислять, вставлять значения, повторять
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
- Как указать прокси-сервер Excel по умолчанию при потоковой передаче Excel через VCS
- Как я могу автоматически заполнять данные с одного листа на другой?
- Отчет OfficeWriter Excel - bc30277 Тип символа '!' не совпадает
- Зацикливание макроса в excel
- Прокрутите список, чтобы скопировать партии одинаковых значений
- Цикл между двумя целыми числами
- Диапазон источников данных в сводной таблице изменен непреднамеренно
- Не допускайте изменений - Worksheet_Change
Ваш вложенный цикл может быть запутанным, и я думаю, что это источник вашей проблемы, как объясняется в комментариях к 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