Страница: 1 |
Вопрос: Как проверить существует ли лист книги в Exel? | Добавлено: 02.08.06 11:24 |
Автор вопроса: ![]() |
Нужно сделать такую проверку
Если рабочий лист активной книги Worksheets(2) не существует его нужно добавить. Пытался сделать так, но VBA ругается If Worksheets(2) = False Then ActiveWorkbook.Sheets.Add After:=Worksheets(1) End If Подскажите как ? |
Ответы | Всего ответов: 12 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 276 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 02.08.06 11:33 |
____ В данном случае, наверное, проще If Worksheets.Count < 2 Then |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 4 |
Профиль | Цитата | #2 | Добавлено: 02.08.06 12:32 |
Сам навоял, может кому и пригодится:
Function SheetExiste(intIndexSheet As Integer) As Boolean Dim objWh As Excel.Worksheet Dim intIndexLst As Integer For Each objWh In ActiveWorkbook.Worksheets intIndexLst = objWh.Index If intInexLst = intIndexSheet Then SheetExiste = True Exit Function End If Next objWh SheetExiste = False ActiveWorkbook.Sheets.Add After:=Worksheets(intIndexSheet - 1) End Function |
Номер ответа: 3 Автор ответа: ![]() ![]() ICQ: 354-671-214 Вопросов: 18 Ответов: 103 |
Профиль | Цитата | #3 | Добавлено: 02.08.06 13:53 |
Можно проще...
Err=0 on error resume next WhorkSheets(2).Activate If Err>0 Then ActiveWorkbook.Sheets.Add After:=Worksheets(1) End If |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 276 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 02.08.06 14:04 |
____ Я так понмаю, что индексы листов не могут быть с разрывами. Если второго листа нет, то их всего только один. В этом плане проверка на 3 и вставка после второго может дать ошибку (если лист только один). Потому, всё-таки, ещё короче:
If WorkSheets.Count < index Then WorkSheets.Add
____ В результате появляется лист WorkSheets(index). ____ Можно, конечно, и в функцию оформить, только вот зачем? |
Номер ответа: 5 Автор ответа: ![]() ![]() ICQ: 354-671-214 Вопросов: 18 Ответов: 103 |
Профиль | Цитата | #5 | Добавлено: 02.08.06 14:12 |
Логично, но только в том случае, если нужно определить листы по индексам, а если нужно найти конкретный лист по имени то можно написать так:
Err=0 on error resume next application.activeworkbook.sheets(SheetName).Activate If Err>0 Then ActiveWorkbook.Sheets.Add End If Это более общий метод. Затем добавленный лист можно переименовать. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 276 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 02.08.06 14:52 |
____ Тогда ещё добавить:
Dim sh As Object
.... Set sh = ActiveWorkbook.Sheets.Add ____ Что бы было чего переименовывать. ![]() |
Номер ответа: 7 Автор ответа: ![]() ![]() ICQ: 354-671-214 Вопросов: 18 Ответов: 103 |
Профиль | Цитата | #7 | Добавлено: 02.08.06 14:56 |
Согласен, но я же так, в общем. А вообще товарищ не совсем верно задачу поставил - он определяет наличие второго листа. Не знаю что у него за программа, но каждая Workbook по умолчанию уже имеет три листа, и его затея может провалиться, если он запутается с открытыми книгами, лучше все-таки проверять по имени листа, а не номеру. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 276 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 02.08.06 16:02 |
____ Насчёт трёх листов, то я это уже давно настойчиво "задавливаю". В своём Excel — в настройках. А учитывая, что клиенты этого не делают, то на VBA всегда создаю отдельно книгу и устанавливаю в ней один лист.
Set xlApp = CreateObject("excel.application" ![]() xlApp.SheetsInNewWorkbook = 1[/CODE] ____ Согласен, что имя — более объективно. Индексы не обязательно будут привязаны к конкретному листу. В результате удаления первых листов индексы "переназначаются". С листами удобнее работать, как с ассоциативным массивом. ____ Более того, имя листа (не надпись на ярлычке!) становится глобальным и к нему можно просто обращаться, как к именованному объекту: Имя_листа.Activate
____ Причём, в отличие от способа sheets("Имя_листа" ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 276 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 02.08.06 16:03 |
____ Насчёт трёх листов, то я это уже давно настойчиво "задавливаю". В своём Excel — в настройках. А учитывая, что клиенты этого не делают, то на VBA всегда создаю отдельно книгу и устанавливаю в ней один лист.
Set xlApp = CreateObject("excel.application" ![]() xlApp.SheetsInNewWorkbook = 1[/CODE] ____ Согласен, что имя — более объективно. Индексы не обязательно будут привязаны к конкретному листу. В результате удаления первых листов индексы "переназначаются". С листами удобнее работать, как с ассоциативным массивом. ____ Более того, имя листа (не надпись на ярлычке!) становится глобальным и к нему можно просто обращаться, как к именованному объекту: Имя_листа.Activate
____ Причём, в отличие от способа sheets("Имя_листа" ![]() |
Номер ответа: 10 Автор ответа: ![]() ![]() ICQ: 354-671-214 Вопросов: 18 Ответов: 103 |
Профиль | Цитата | #10 | Добавлено: 02.08.06 16:08 |
Еще удобнее делать так:
On Error Resume Next Set xlApp = GetObject(, "Excel.Application" ![]() If Err > 0 Then Set xlApp = CreateObject("Excel.Application" ![]() End If Так ты не будешь при каждом нажатии F5 попадать в новый экземпляр Excel. |
Номер ответа: 11 Автор ответа: ![]() ![]() ICQ: 354-671-214 Вопросов: 18 Ответов: 103 |
Профиль | Цитата | #11 | Добавлено: 02.08.06 16:10 |
Да, желательно перед всем этим:
Err = 0 Береженного Бог бережет ![]() |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 7 Ответов: 188 |
Профиль | Цитата | #12 | Добавлено: 02.08.06 20:16 |
Ребята, круто! Вот вас зацепило!!! Задача действительно фигово сформулирована. Задача проверять лист с индексом 2 - немножко чушь! А так круто! (Без обид!!!) |
Страница: 1 |
|