If Not ws Is Sheet1 Then ws.Delete
Булево выражение {object1} Is {object2}
оценивает равенство ссылок : это будет True
, если {object1}
равно {object2}
.
Здесьws
- это рабочий лист в ActiveWorkbook
, а Sheet1
- это (предположительно) глобальный идентификатор, относящийся к CodeName
листа, существующего в ThisWorkbook
- который может быть или не быть текущей активной рабочей книгой.
Если ThisWorkbook
не является ActiveWorkbook
, равенство ссылок не будет выполнено для каждого отдельного листа, и этот цикл попытается удалить их все, поэтому вы получаете эту ошибку.
Если вы не хотите удалять листы в ThisWorkbook
, вы не можете использовать равенство ссылок для этой проверки.
Вы можете перейти на Index
или по имени - вВ любом случае рекомендуется убедиться, что в рабочей книге больше, чем один лист:
For Each ws In ActiveWorkbook.Worksheets
Debug.Assert ActiveWorkbook.Worksheets.Count > 1
If Not ws.Name = "Sheet1" Then ws.Delete
Next
Убедитесь, что лист, который вы хотите удалить, имеет ожидаемый индекс (1
) и/ или ожидаемое имя;для этого используйте Project Explorer (Ctrl + R) и окна свойств (F4).Имейте в виду, что свойство (Name)
является идентификатором CodeName
листа, который вы можете использовать / использовать только в проекте VBA ThisWorkbook
;вам нужно проверить его Name
свойство - это изменяемое пользователем "имя вкладки" на рабочем листе.