Проверить или проверить, существует ли лист
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
затем устанавливаю destsheet
в рабочей destsheet
назначения на лист с тем же именем, что и destsheet
в destsheet
.
Как я могу проверить, существует ли этот лист? Что-то вроде:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
- Уникальные случайные числа с использованием VBA
- 2 способа для «ClearContents» на VBA Excel, но 1 работает нормально. Зачем?
- Использование VBA в Excel в Google Search в IE и возврат гиперссылки первого результата
- Как восстановить случай по умолчанию переменной в VBA (Excel 2010)?
- Функция Excel VBA работает в Visual Basic, но не работает в рабочем листе
- VBA: Различия в двух способах объявления нового объекта? (Попытка понять, почему мое решение работает)
- Попытка открыть книгу в отдельном экземпляре
- GET изображения с URL-адреса, а затем переименуйте изображение
- Есть ли какое-либо событие, которое срабатывает при нажатии клавиш при редактировании ячейки?
- VBA - ошибка времени выполнения 1004 «Определенная заявка или ошибка с определением объекта»
- Правильное обращение с ошибками в VBA (Excel)
- Код VBA не запускается, когда ячейка изменяется по формуле
- Как анализировать XML с помощью vba
Некоторым людям не нравится этот подход из-за «неуместного» использования обработки ошибок, но я думаю, что это считается приемлемым в VBA … Альтернативным подходом является цикл, хотя все листы, пока вы не найдете совпадение.
Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean Dim sht As Worksheet If wb Is Nothing Then Set wb = ThisWorkbook On Error Resume Next Set sht = wb.Sheets(shtName) On Error GoTo 0 SheetExists = Not sht Is Nothing End Function
Если вас интересуют только рабочие листы, вы можете использовать простой вызов Evaluate:
Function WorksheetExists(sName As String) As Boolean WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)") End Function
Для этого вам не нужна обработка ошибок. Все, что вам нужно сделать, это перебрать все листы и проверить, существует ли указанное имя:
For i = 1 To Worksheets.Count If Worksheets(i).Name = "MySheet" Then exists = True End If Next i If Not exists Then Worksheets.Add.Name = "MySheet" End If
Поскольку проверка членов коллекции является общей проблемой, вот абстрагированная версия ответа Тима:
Функция содержит (objCollection As Object, strName as String) как логическое Dim o as Object Вкл. set o = objCollection (strName) Содержит = (Err.Number = 0) Err.Clear Конечная функция
Эта функция может использоваться с любыми объектами коллекции ( Shapes
, Range
, Names
, Workbooks
и т. Д.).
Чтобы проверить наличие листа, используйте « If Contains(Sheets, "SheetName") ...
Исправлено: без обработки ошибок:
Function CheckIfSheetExists(SheetName As String) As Boolean CheckIfSheetExists = False For Each WS In Worksheets If SheetName = WS.name Then CheckIfSheetExists = True Exit Function End If Next WS End Function
В случае, если кто-то хочет избежать VBA и проверить, существует ли рабочая таблица исключительно внутри формулы ячейки, возможно использование ISREF
и ISREF
:
=ISREF(INDIRECT("SheetName!A1"))
Это вернет TRUE
если книга содержит лист с именем SheetName
и FALSE
противном случае.
Мое решение очень похоже на Tims, но также работает в случае листов без листка – диаграмм
Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate Dim obj As Object On Error GoTo HandleError Set obj = wbWorkbook.Sheets(strSheetName) SheetExists = True Exit Function HandleError: SheetExists = False End Function
,
Поместите тест в функцию, и вы сможете его повторно использовать, и у вас будет более удобная читаемость кода.
НЕ используйте «On Error Resume Next», так как он может конфликтовать с другой частью вашего кода.
Sub DoesTheSheetExists() If SheetExist("SheetName") Then Debug.Print "The Sheet Exists" Else Debug.Print "The Sheet Does NOT Exists" End If End Sub Function SheetExist(strSheetName As String) As Boolean Dim i As Integer For i = 1 To Worksheets.Count If Worksheets(i).Name = strSheetName Then SheetExist = True Exit Function End If Next i End Function
Если вы являетесь поклонником WorksheetFunction.
или вы работаете из неанглийской страны с неанглийским Excel, это хорошее решение, которое работает:
WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))
Или в такой функции:
Function WorksheetExists(sName As String) As Boolean WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1")) End Function
Public Function WorkSheetExists(ByVal strName As String) As Boolean On Error Resume Next WorkSheetExists = Not Worksheets(strName) Is Nothing End Function sub test_sheet() If Not WorkSheetExists("SheetName") Then MsgBox "Not available" Else MsgBox "Available" End If End Sub
Почему бы просто не использовать небольшой цикл, чтобы определить, существует ли именованный лист? Скажем, если бы вы искали Рабочий лист под названием «Sheet1» в текущей открытой книге.
Dim wb as Workbook Dim ws as Worksheet Set wb = ActiveWorkbook For Each ws in wb.Worksheets if ws.Name = "Sheet1" then 'Do something here End if Next
Я сделал еще одно: удалите лист только в том случае, если он существует – не получить ошибку, если это не так:
Excel.DisplayAlerts = False Dim WS For Each WS In Excel.Worksheets If WS.name = "Sheet2" Then Excel.sheets("Sheet2").Delete Exit For End If Next Excel.DisplayAlerts = True
Много лет спустя, но мне просто нужно было это сделать, и мне не понравилось, что какие-либо решения были отправлены … Так что я сделал это, все благодаря волшебству (жестом радуги SpongeBob) «Evaluate ()»!
Evaluate("IsError(" & vSheetName & "!1:1)")
Возвращает TRUE, если лист НЕ существует; FALSE, если лист существует. Вы можете заменить любой диапазон, который вам нравится, на «1: 1», но я советую не использовать одну ячейку, потому что если она содержит ошибку (например, # N / A), она вернет True.
For Each Sheet In Worksheets If UCase(Sheet.Name) = "TEMP" Then 'Your Code when the match is True Application.DisplayAlerts = False Sheet.Delete Application.DisplayAlerts = True '----------------------------------- End If Next Sheet
Измените «данные» на любое имя листа, которое вы тестируете для …
On Error Resume Next Set DataSheet = Sheets("Data") If DataSheet Is Nothing Then Sheets.Add(after:=ActiveSheet).Name = "Data" ''or whatever alternate code you want to execute'' End If On Error GoTo 0
Без всякого сомнения, что вышеприведенная функция может работать, я просто закончил со следующим кодом, который работает очень хорошо:
Sub Sheet_exist () On Error Resume Next If Sheets("" & Range("Sheet_Name") & "") Is Nothing Then MsgBox "doesnt exist" Else MsgBox "exist" End if End sub
Примечание. Sheets_Name
– это то место, где я прошу пользователя ввести имя, так что это может быть не для вас.
Я написал это:
Function sheetExist(sSheet As String) As Boolean On Error Resume Next sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0) End Function
Я придумал простой способ сделать это, но я не создал для него новый модуль. Вместо этого я просто «проверил чек» в суб, над которым я работал. Предполагая, что имя листа, которое мы ищем, является «Sheet_Exist», и мы просто хотим его активировать, если он найден:
Dim SheetCounter As Integer SheetCounter = 1 Do Until Sheets(SheetCounter).Name = "Sheet_Exist" Or SheetCounter = Sheets.Count + 1 SheetCounter = SheetCounter +1 Loop If SheetCounter < Sheets.Count + 1 Then Sheets("Sheet_Exist").Activate Else MsgBox("Worksheet ""Sheet_Exist"" was NOT found") End If
Я также добавил всплывающее окно, когда лист не существует.
Функция Compact wsExists
( без учета обработки ошибок!)
Вот короткая & простая функция, которая не полагается на обработку ошибок, чтобы определить, существует ли рабочий лист ( и он должным образом объявлен для работы в любой ситуации!)
Function wsExists(wsName As String) As Boolean Dim ws: For Each ws In Sheets wsExists = (wsName = ws.Name): If wsExists Then Exit Function Next ws End Function
Пример использования:
В следующем примере добавляется новый лист с именем myNewSheet
, если он еще не существует:
If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"
Больше информации:
- MSDN:
For Each
…Next
заявление (VBA) - MSDN: заявление о
Exit
(VBA) - MSDN: Операторы сравнения (VBA)
На самом деле у меня был простой способ проверить, существует ли лист, а затем выполнить некоторую инструкцию:
В моем случае я хотел удалить лист, а затем воссоздал один и тот же лист с тем же именем, но код был прерван, если программа не смогла удалить лист, поскольку он уже был удален
Sub Foo () Application.DisplayAlerts = False On Error GoTo instructions Sheets("NAME OF THE SHEET").Delete instructions: Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "NAME OF THE SHEET" End Sub