Страницы: 1 2 След.
RSS
Функция проверки наличия листа
 
Помогите пожалуйста скорретировать функцию проверки наличия листа в книге, чтобы она проверяла по кодовому имени листа (кот, присваивает Ексель)
 
вариант  
 
Sub io()  
On Error GoTo L1  
If Not Intersect(Sheets("Сводная"), Worksheets) Is Nothing Then  
   ' Действия, если есть  
End If  
L1: If Err = 9 Then MsgBox (1): Resume Next  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
В файле код приложен (в стандартном модуле)  
 
Определить наличие листа по пользовательскому имени ("Сводная") -- справляюсь,  
не справляюсь определить по кодовому имени (который эксель присваивает сама, и который изменить оочень проблематично ("Лист1, Лист2 и т.д.)  
В ВБА это имя перед скобками стоит.  
 
+ еще задача сходная: как узнать пользовательское имя листа, зная его кодовое имя?
 
Для ориентировки:  
MsgBox ActiveSheet.CodeName  
Sheets(2).Activate  
P.S. Без привязки к Вашему файлу.
 
a = Лист1.Name
 
попробуйте так  
Function Sh_Exist2(scodeName As String)  
Dim VBC As Object  
On Error Resume Next  
Set VBC = ThisWorkbook.VBProject.VBComponents(scodeName)  
Sh_Exist2 = Not VBC Is Nothing  
End Function
 
Юрий, лист не активен в момент начала работы макроса, активировать его не желательно, без этого можно?:  
...нужно подставить пользоват-е имя листа в переменную, но оно заранее не известно (может менятся), известно только кодовое имя  
ЗЫ: только кодовой имя для операции с листами использовать не хочу (в режиме отладки ф-я изм-я код. имени не хочет работать, т.е. либо весь макрос целиком отрабатывает, либо заканчивает выполнение, а лишаться отладки не хочется)
 
RAN,  
блин ф я дурак конструкции строю...  
спасибо, заработался  
 
пошел проверять код webley
 
{quote}{login=webley}{date=22.07.2011 01:02}{thema=}{post}попробуйте так  
{/post}{/quote}  
Попробовал.  
VBC всегда Nothing.((
 
Активный - это я только для примера. Вторая строка - обращение к листу, который стоит вторым слева. А вот такая строка:  
Лист1.Activate.  
Активирует лист именно с таким кодовым именем. Это как раз для тех случаев, когда пользователь может поменять название листа.
 
{quote}{login=RAN}{date=22.07.2011 01:15}{thema=Re: }{post}{quote}{login=webley}{date=22.07.2011 01:02}{thema=}{post}попробуйте так  
{/post}{/quote}  
Попробовал.  
VBC всегда Nothing.(({/post}{/quote}  
 
Да, не учел - работать будет только в том случае, если стоит галочка в настройках безопасности "Доверять доступ к объектной модели проектов VBA"
 
Функция webley РАБОТАЕТ!!!
 
или еще вариант - перебором  
 
Function Sh_Exist2(scodeName As String)  
   Dim sh As Worksheet  
   Sh_Exist2 = False  
   For Each sh In ThisWorkbook.Sheets  
       If sh.CodeName = scodeName Then Sh_Exist2 = True  
   Next sh  
End Function
 
Еще вопрос  
выделить лист по кодовому имени можно так: Лист1.Select  
 
а как можно выделить лист с использованием переменной в которой хранится его код. имя?  
 
cname = Sheets("Атата").Codename  
 
cname.Select не хочет работать(((
 
Dim x As Worksheet  
Set x = Лист22  
x.Activate
 
а без явного указания имени листа (через переменную?).    
Вот как-то так представляю  
 
Private Sub проверка()  
Dim wsSh As Worksheet, sName As String, scodeName As String, aSh As Worksheet  
 
scodeName = "Лист1"  
aSh = scodeName  
If Sh_Exist2(scodeName) Then aSh.Delete  
End Sub  
 
 
Function Sh_Exist2(scodeName As String)  
Dim VBC As Object  
On Error Resume Next  
Set VBC = ThisWorkbook.VBProject.VBComponents(scodeName)  
Sh_Exist2 = Not VBC Is Nothing  
End Function  
 
 
пока приходится назначать переменную имени листа и самого листа
 
{quote}{login=Юрий М}{date=22.07.2011 01:42}{thema=}{post}Dim x As Worksheet  
Set x = Лист22  
x.Activate{/post}{/quote}  
 
Юрий, не могу так сделать  
при выполнении ругается: говорит что не объявлена переменная и выделяет Лист22 (если его нет в книге)
 
... это в макросе проверки наличия листа, т.е.е его может и не быть
 
ThisWorkbook.VBProject.VBComponents(scodeName).activate
 
>> при выполнении ругается: говорит что не объявлена переменная и выделяет Лист22 (если его нет в книге  
Ну у меня ведь он есть - этот лист и активируется. У Вас будет другое кодовое имя - его и указывайте. Как он может активировать то, чего нет?
 
to Юрий -- логика такая: проверяем наличие листа, если есть -- активируем...  
 
to webley -- такое знаю но не желаетльнл его брать, у меня все коды с VBComponents выбивают режим отладки (а его лишаться не хочу)
 
Вы пытаетесь обратиться, используя переменную - текстовую строку, а кодовое имя листа - это объект, а не название.
 
webley  
виноват -- с активацией нормально отрабатывает, видимо особенность связана только с переименованием код. имени  
я так понимаю тут:  
ThisWorkbook.VBProject.VBComponents(scodeName).  
 
метод Delete не пременим? а как удалить? активация не прокатывает, лист м.б. скрытым)),
 
{quote}{login=Юрий М}{date=22.07.2011 02:44}{thema=}{post}Вы пытаетесь обратиться, используя переменную - текстовую строку, а кодовое имя листа - это объект, а не название.{/post}{/quote}  
 
Я это понимаю, но как правильно сделать нет?  
Задача: проверить есть лист или нет (проверка по кодовому имени), если есть удалить.  
делаю так:  
Private Sub проверка()  
Dim wsSh As Worksheet, sName As String, scodeName As String, aSh As Worksheet  
 
scodeName = "Лист1"  
aSh = scodeName  
If Sh_Exist2(scodeName) Then КАК ЕГО УДАЛИТЬ?  
End Sub  
 
 
Function Sh_Exist2(scodeName As String)  
Dim VBC As Object  
On Error Resume Next  
Set VBC = ThisWorkbook.VBProject.VBComponents(scodeName)  
Sh_Exist2 = Not VBC Is Nothing  
End Function
 
Можно перебрать циклом: если встретится лист с нужным кодовым именем - удалить его:  
Dim i As Integer, x As Worksheet  
Application.DisplayAlerts = False  
Set x = Лист22  
For i = 1 To Sheets.Count  
If Sheets(i).CodeName = x.CodeName Then x.Delete  
Next  
Application.DisplayAlerts = True
 
затыкается на строчке Set x = Лист22  
 
и ругается со словами объект реквайред (ош.424)
 
{quote}{login=ABZAC}{date=22.07.2011 03:10}{thema=Юрий}{post}затыкается на строчке Set x = Лист22{/post}{/quote}  
А у Вас ЕСТЬ лист с таким кодовым именем? Откуда мне знать - наличие какого листа Вы собираетесь проверить? У меня в книге был - удалился.
 
нет, конечно  
так и задача ведь не найти и удалить, а проверить наличие (т.е. его м.б. не быть) и если есть то удалить
 
а зачем вам тогда проверять его наличие? просто поставьте - удалить  
Sub shdel()  
   Dim shcodname As String  
   Dim sh As Worksheet  
   shcodname = "Лист1"  
   On Error Resume Next  
   Application.DisplayAlerts = False  
       For Each sh In ThisWorkbook.Sheets  
           If sh.CodeName = shcodname Then sh.Delete  
       Next  
   Application.DisplayAlerts = True  
   On Error GoTo 0  
End Sub
 
{quote}{login=ABZAC}{date=22.07.2011 03:13}{thema=}{post}задача ведь не найти и удалить, а проверить наличие (т.е. его м.б. не быть) и если есть то удалить{/post}{/quote}А это разве не одно и то же? Вы ведь какой-то конкретный лист хотите удалить.
Страницы: 1 2 След.
Читают тему
Наверх