Страницы: 1 2 След.
RSS
запуск макроса
 
Здравствуйте, подскажите как сделать чтобы этот макрос    
Private Sub Worksheet_Activate()  
addShets  
End Sub  
срабатывал только при создании нового листа?, а не как сейчас при активации листа.  
искал здесь http://www.firststeps.ru/vba/excel/r.php?51 но не подобрал себе варианта.
 
В модуле Книги есть подходящее событие  
Private Sub Workbook_NewSheet(ByVal Sh As Object)  
Попробуйте с ним.
 
приношу извинения немного не правильно вопрос задал. не при создании нового листа, а при копировании листа (выполняется с помощью модуля).    
в модуле addShets есть такая строка With ActiveSheet.ListObjects("Таблица1"), как переделать ее чтобы было не ActiveSheet а на листе с именем Отчет
 
With Sheets("Отчет").ListObjects("Таблица1")
Редко но метко ...
 
With Sheet("Отчет").ListObjects("Таблица1")
 
Конечно SheetS, а не Sheet ...
 
{quote}{login=webley}{date=10.08.2011 10:35}{thema=}{post}With Sheet("Отчет").ListObjects("Таблица1"){/post}{/quote}  
 
А где буквица s ? ))) sheetS
Редко но метко ...
 
{quote}{login=GIG_ant}{date=10.08.2011 10:36}{thema=Re: }{post}{quote}{login=webley}{date=10.08.2011 10:35}{thema=}{post}With Sheet("Отчет").ListObjects("Таблица1"){/post}{/quote}  
 
А где буквица s ? ))) sheetS{/post}{/quote}  
 
Постом выше :)  
Автозавершение слов в редакторе VBA расслабляет...
 
синхронно. Спасибо. а есть разница между Worksheets("Отчет") и просто Sheets("Отчет").
 
Есть Worksheets - коллекция только рабочих листов.  
Sheets - коллекция всех листов (рабочих, листов диаграмм...)
Редко но метко ...
 
{quote}{login=AKSENOV048}{date=10.08.2011 10:40}{thema=}{post}синхронно. Спасибо. а есть разница между Worksheets("Отчет") и просто Sheets("Отчет").{/post}{/quote}  
 
Думаю, в данном случае нет. Из справочника:  
Sheets - возвращает семейство всех листов книги  
Worksheets - возвращает семейство всех рабочих листов книги  
 
В чем отличие - не знаю
 
теперь это понятно.    но все же не пойму как сделать чтобы этот макрос (вносит в Таблицу 1 список всех листов рабочей книги)  
Sub addShets()  
Dim i&, ii&  
Application.ScreenUpdating = False  
Application.Calculation = xlCalculationManual  
On Error Resume Next  
With Sheets("Отчет").ListObjects("Таблица 1")  
For i = 1 To .ListRows.Count  
.ListRows(1).Delete  
Next  
 
ii = 1  
For i = 1 To Sheets.Count  
If IsDate(Sheets(i).Name) Then ii = ii + 1: .Range(ii, 1) = Sheets(i).Name  
Next  
End With  
Application.Calculation = xlCalculationAutomatic  
Application.ScreenUpdating = True  
End Sub  
выполнялся при создании - копии листа (с помощью модуля), и при удалении листов. В данный момент макрос срабатывает каждый раз как перехожу на лист Отчет
 
ТО Webley:  
 
Отличие заключается в том что:  
Если в книге есть кроме обычных листов еще и листы диаграмм например, то оператор Worksheets.Count даст кол-во именно рабочих листов, а Sheets.Count - кол-во всех листов данной книги. Или если вы обратитесь вот так Worksheets(shName) - где shName - это имя листа диаграммы то выйдет ошибка.
Редко но метко ...
 
webley, на листах диаграмм нет cells...  
Тут недавно тему удалили (из-за названия кажется), где чел жаловался, что макрос одного известного макрописца ошибку выдаёт на его куче файлов. Я глянул - там в цикле обрабатывались все Sheets выбранных файлов. Думаю, оно и есть...
 
GIG_ant, Hugo спасибо за объяснения - теперь понятно.  
Как-то так получилось, что с листами диаграмм я кажется вообще никогда не работал - поэтому в эти нюансы и не вникал...
 
извиняюсь за надоедание, но вопрос остался открытым, так все же, есть ли такие условия запуска данного макроса? (или не стоит продолжать поиски решений)
 
>>но все же не пойму как сделать чтобы макрос выполнялся при создании - копии листа (с помощью модуля)  
 
Прописать в модуле запуск макроса.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
пропишу, будет работать при создании нового листа. а если лист удалить?
 
Если напишете в модуле листа - естественно.
 
так все же как сделать?
 
{quote}{login=AKSENOV048}{date=10.08.2011 10:32}{thema=}{post}приношу извинения немного не правильно вопрос задал. не при создании нового листа, а при копировании листа (выполняется с помощью модуля).{/post}{/quote}Никак не пойму, что Вам требуется. Что такое - "выполняется с помощью модуля"?
 
Правильно ли я понимаю: нужно запускать некий макрос при создании нового листа методом копирования существующего? Если так, то:  
1. Создаём переменную.  
2. На событие открытия книги считаем к-во листов в ней и присваиваем это значение переменной.  
3. На событие активации листа (в модуле книги) пишем проверку - если к-во листов больше переменной - запускаем макрос.  
4. Увеличиваем на единичку значение переменной.  
Таким образом "простая" активация любого листа не будет вызывать Ваш макрос.
 
уважаемый Юрий М, вы все правильно поняли.    
"Если так, то:  
1. Создаём переменную.  
2. На событие открытия книги считаем к-во листов в ней и присваиваем это значение переменной.  
3. На событие активации листа (в модуле книги) пишем проверку - если к-во листов больше переменной - запускаем макрос.  
4. Увеличиваем на единичку значение переменной.  
Таким образом "простая" активация любого листа не будет вызывать Ваш макрос."  
 
так все просто?!
 
Наверное, можно и проще, но так сработает :-)
 
{quote}{login=Юрий М}{date=14.08.2011 11:20}{thema=}{post}Наверное, можно и проще, но так сработает :-){/post}{/quote}  
 
а можно помощь зала?
 
Попробуйте.
 
всем спасибо за ответы. все таки подумал и решил добавить исполнение этого макроса в другой макрос(создающий копии листов). по поводу работы макроса после удаления листов, думаю действительно не стоит заморачиваться, т.к удаляются они крайне редко, на этот случай можно просто поставить кнопку с этим макросом на лист Отчет.  
 
у меня теперь вопрос, можно что-нибудь сделать с этим макросом, чтобы при его исполнении экран не мерцал, или работал побыстрее:  
Sub addShets()  
Dim i&, ii&  
Application.ScreenUpdating = True  
Application.Calculation = xlCalculationManual  
On Error Resume Next  
With Sheets("Отчет").ListObjects("Таблица1")  
For i = 1 To .ListRows.Count  
.ListRows(1).Delete  
Next  
 
ii = 1  
For i = 1 To Sheets.Count  
If IsDate(Sheets(i).Name) Then ii = ii + 1: .Range(ii, 1) = Sheets(i).Name  
Next  
End With  
Application.Calculation = xlCalculationAutomatic  
Application.ScreenUpdating = True  
End Sub
 
Для начала поменяйте первую строку:  
Application.ScreenUpdating = True  
вот так:  
Application.ScreenUpdating = False'Отключить обновление экрана
 
Юрий М спасибо, но все равно мерцает.
 
Вы по F8 код пробовали прогнать?
Страницы: 1 2 След.
Читают тему
Наверх