Dim wkbkdestination As Workbook
Dim destsheet As Worksheet
For Each ThisWorkSheet In wkbkorigin.Worksheets
'this throws subscript out of range if there is not a sheet in the destination
'workbook that has the same name as the current sheet in the origin workbook.
Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name)
Next
В основном я просматриваю все листы в исходной книге, а затем устанавливаю destsheet
в целевой книге лист с тем же именем, что и повторяемый в настоящее время лист в исходной книге.
Как я могу проверить, существует ли этот лист? Что-то вроде:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Ответы:
Некоторым не нравится этот подход из-за «неуместного» использования обработки ошибок, но я думаю, что он считается приемлемым в VBA ... Альтернативный подход - зацикливать все листы, пока не найдете совпадение.
источник
ActiveWorkbook
вместоThisWorkbook
. Последнее относится к книге, содержащей код макроса, который может отличаться от книги, которую нужно тестировать. Думаю, этоActiveWorkbook
было бы полезно в большинстве случаев (хотя надуманные ситуации всегда доступны).sht Is Nothing
будет ,True
если нет листа с этим именем, но мы хотим , чтобы вернуться ,True
если есть лист с таким именем, следовательно, нет. Это немного проще (но не действует) , если переставить немного кSheetExists = sht Is Not Nothing
If wb Is Nothing Then Set wb = ThisWorkbook
наIf wb Is Nothing Then Set wb = ActiveWorkbook
Если вас особенно интересуют только рабочие листы, вы можете использовать простой вызов Evaluate:
источник
Для этого вам не нужна обработка ошибок. Все, что вам нужно сделать, это перебрать все рабочие листы и проверить, существует ли указанное имя:
источник
Поскольку проверка членов коллекции - это общая проблема, вот абстрактная версия ответа Тима:
Эта функция может быть использована с любой коллекцией как объект (
Shapes
,Range
,Names
,Workbooks
и т.д.).Чтобы проверить наличие листа, используйте
If Contains(Sheets, "SheetName") ...
источник
Set
ключевое слово вызывает ошибку . Я обнаружил, что вместо того, чтобы использоватьSet
, запросTypeName
члена коллекции работает для всех случаев, то естьTypeName objCollection(strName)
Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
Исправлено: Без обработки ошибок:
источник
В случае , если кто -то хочет , чтобы избежать VBA и тест , если таблица существует чисто в формуле ячейки, можно с помощью
ISREF
иINDIRECT
функции:=ISREF(INDIRECT("SheetName!A1"))
Это вернется,
TRUE
если книга содержит лист с именемSheetName
и вFALSE
противном случае.источник
Я написал это:
источник
sheetExist = ActiveWorkbook.Sheets(sSheet).Index
Мое решение очень похоже на Tims, но также работает в случае листов, отличных от рабочих листов - диаграмм
.
источник
Поместите тест в функцию, и вы сможете повторно использовать его, и у вас будет лучшая читаемость кода.
НЕ используйте команду «Возобновить после ошибки», поскольку она может конфликтовать с другой частью вашего кода.
источник
Спустя много лет, но мне просто нужно было это сделать, и мне не понравилось ни одно из опубликованных решений ... Так что я придумал одно, и все благодаря магии (жест радужной руки Губки Боба) "Evaluate ()"!
Возвращает ИСТИНА, если Лист НЕ существует; ЛОЖЬ, если лист ДЕЙСТВИТЕЛЬНО существует. Вы можете заменить любой диапазон на «1: 1», но я не советую использовать одну ячейку, потому что, если она содержит ошибку (например, # N / A), она вернет True.
источник
Компактная
wsExists
функция ( без обработки ошибок!)Вот короткая и простая функция, которая не полагается на обработку ошибок, чтобы определить, существует ли рабочий лист ( и правильно объявлено, что оно работает в любой ситуации!)
Пример использования:
В следующем примере добавляется новый рабочий лист с именем
myNewSheet
, если он еще не существует:Больше информации:
For Each
…Next
Заявление (VBA)Exit
Заявление (VBA)источник
Почему бы просто не использовать небольшой цикл, чтобы определить, существует ли указанный лист? Скажем, если вы искали Рабочий лист с именем «Лист1» в текущей открытой книге.
источник
Если вы поклонник
WorksheetFunction.
или работаете из неанглоязычной страны с неанглоязычным Excel, это хорошее решение, которое работает:Или в такой функции:
источник
источник
источник
Измените "Данные" на любое имя листа, которое вы тестируете ...
источник
Без всяких сомнений, что указанная выше функция может работать, я только что получил следующий код, который работает очень хорошо:
Примечание:
Sheets_Name
здесь я прошу пользователя ввести имя, поэтому это может быть не то же самое для вас.источник
Я сделал еще одну вещь: удалил лист только в том случае, если он существует - чтобы не получить ошибку, если его нет:
источник
Я придумал простой способ сделать это, но не создавал для него новую сабвуфер. Вместо этого я просто «проверил» подпрограмму, над которой работал. Предположим, что имя листа, которое мы ищем, - «Sheet_Exist», и мы просто хотим активировать его, если он найден:
Я также добавил всплывающее окно, когда лист не существует.
источник
Я знаю, что это старый пост, но вот еще одно простое и быстрое решение.
источник
Коротко и чисто:
источник
На самом деле у меня был простой способ проверить, существует ли лист, а затем выполнить некоторую инструкцию:
В моем случае я хотел удалить лист, а затем воссоздать тот же лист с тем же именем, но код был прерван, если программа не смогла удалить лист, поскольку он уже был удален
источник