Попробуйте что-то вроде этого
Dim bDeleteSheet As Boolean
For Each c In wbmacro.Sheets("Link Sheet").Range("D2:D10").Cells
' The default behaviour is to delete the sheet
bDeleteSheet = True
For Each rc In wbmacro.Sheets("Link Sheet").Range("C2:C10").Cells
If c.Value = rc.Value Then
' If you find the sheet name then it is used
' Do NOT delete it
bDeleteSheet = False
Exit For
End If
Next
If bDeleteSheet Then wbtarget.Sheets(c).Delete
Next
Изменить: я добавил .Cells
в две строки: По моему опыту, пропуск этого вызывал у меня некоторые проблемы в прошлом.
У меня также есть упомянуть, что это далеко не самый эффективный или динамичный код c, но он следует вашему logi c и является хорошей отправной точкой.
На самом деле в таком небольшом коде, любая оптимизация мало повлияет на время выполнения кода. Однако по мере того, как ваш код растет и / или у вас l oop через большее количество ячеек, есть способы оптимизировать ваш код.
Чтобы сделать ваш код более эффективным, общее практическое правило состоит в том, чтобы свести к минимуму любое взаимодействие с приложением Excel и добиться того, чтобы вы гуглили такие темы, как «как читать мой диапазон в памяти в vba»
Чтобы сделать ваш код более динамичным c google такие темы, как «как более динамично ссылаться на диапазоны в excel vba». В качестве примера, вместо жесткого кодирования номера строки 10
в вашем диапазоне, вы можете решить это следующим образом:
Dim lLastRow as Long
lLastRow = wbmacro.Sheets("Link Sheet").Range("C" & Columns.Count).End(xlUp).Row
Это то же самое, что и полностью до последней ячейки в столбце C и нажав Ctrl + Up, вы перейдете к последней использованной ячейке в этих столбцах, а затем прочитаете номер строки.
Теперь вы можете ссылаться на диапазон следующим образом:
wbmacro.Sheets("Link Sheet").Range("C2:C" & lLastRow)
Обратите внимание, что (из изображения выше) lLastRow
теперь имеет значение 3, что означает, что ваш код не будет oop 7 раз без надобности.