Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Как проверить существует ли лист книги в Exel? Добавлено: 02.08.06 11:24  

Автор вопроса:  NewB
Нужно сделать такую проверку
Если рабочий лист активной книги Worksheets(2) не существует его нужно добавить.

Пытался сделать так, но VBA ругается
If Worksheets(2) = False Then
ActiveWorkbook.Sheets.Add After:=Worksheets(1)
End If

Подскажите как ?

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #1
Добавлено: 02.08.06 11:33
____ В данном случае, наверное, проще If Worksheets.Count < 2 Then

Ответить

Номер ответа: 2
Автор ответа:
 NewB



Вопросов: 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
Автор ответа:
 _ICE_



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
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #4
Добавлено: 02.08.06 14:04
____ Я так понмаю, что индексы листов не могут быть с разрывами. Если второго листа нет, то их всего только один. В этом плане проверка на 3 и вставка после второго может дать ошибку (если лист только один). Потому, всё-таки, ещё короче:

  If WorkSheets.Count < index Then WorkSheets.Add


____ В результате появляется лист WorkSheets(index).
____ Можно, конечно, и в функцию оформить, только вот зачем?

Ответить

Номер ответа: 5
Автор ответа:
 _ICE_



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
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #6
Добавлено: 02.08.06 14:52
____ Тогда ещё добавить:
  Dim sh As Object
....
Set sh = ActiveWorkbook.Sheets.Add

____ Что бы было чего переименовывать. :)

Ответить

Номер ответа: 7
Автор ответа:
 _ICE_



ICQ: 354-671-214 

Вопросов: 18
Ответов: 103
 Профиль | | #7 Добавлено: 02.08.06 14:56
Согласен, но я же так, в общем. А вообще товарищ не совсем верно задачу поставил - он определяет наличие второго листа. Не знаю что у него за программа, но каждая Workbook по умолчанию уже имеет три листа, и его затея может провалиться, если он запутается с открытыми книгами, лучше все-таки проверять по имени листа, а не номеру.

Ответить

Номер ответа: 8
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #8
Добавлено: 02.08.06 16:02
____ Насчёт трёх листов, то я это уже давно настойчиво "задавливаю". В своём Excel — в настройках. А учитывая, что клиенты этого не делают, то на VBA всегда создаю отдельно книгу и устанавливаю в ней один лист.
Set xlApp = CreateObject("excel.application";)
  xlApp.SheetsInNewWorkbook = 1[/CODE]
____ Согласен, что имя — более объективно. Индексы не обязательно будут привязаны к конкретному листу. В результате удаления первых листов индексы "переназначаются". С листами удобнее работать, как с ассоциативным массивом.
____ Более того, имя листа (не надпись на ярлычке!) становится глобальным и к нему можно просто обращаться, как к именованному объекту:
Имя_листа.Activate

____ Причём, в отличие от способа sheets("Имя_листа";) при обращении по имени после точки появится подсказка с возможными свойствами и методами.

Ответить

Номер ответа: 9
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #9
Добавлено: 02.08.06 16:03
____ Насчёт трёх листов, то я это уже давно настойчиво "задавливаю". В своём Excel — в настройках. А учитывая, что клиенты этого не делают, то на VBA всегда создаю отдельно книгу и устанавливаю в ней один лист.
Set xlApp = CreateObject("excel.application";)
  xlApp.SheetsInNewWorkbook = 1[/CODE]
____ Согласен, что имя — более объективно. Индексы не обязательно будут привязаны к конкретному листу. В результате удаления первых листов индексы "переназначаются". С листами удобнее работать, как с ассоциативным массивом.
____ Более того, имя листа (не надпись на ярлычке!) становится глобальным и к нему можно просто обращаться, как к именованному объекту:
Имя_листа.Activate

____ Причём, в отличие от способа sheets("Имя_листа";) при обращении по имени после точки появится подсказка с возможными свойствами и методами.

Ответить

Номер ответа: 10
Автор ответа:
 _ICE_



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
Автор ответа:
 _ICE_



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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам