Здравствуйте, подскажите как сделать чтобы этот макрос Private Sub Worksheet_Activate() addShets End Sub срабатывал только при создании нового листа?, а не как сейчас при активации листа. искал здесь http://www.firststeps.ru/vba/excel/r.php?51 но не подобрал себе варианта.
приношу извинения немного не правильно вопрос задал. не при создании нового листа, а при копировании листа (выполняется с помощью модуля). в модуле addShets есть такая строка With ActiveSheet.ListObjects("Таблица1"), как переделать ее чтобы было не ActiveSheet а на листе с именем Отчет
{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 выполнялся при создании - копии листа (с помощью модуля), и при удалении листов. В данный момент макрос срабатывает каждый раз как перехожу на лист Отчет
Отличие заключается в том что: Если в книге есть кроме обычных листов еще и листы диаграмм например, то оператор Worksheets.Count даст кол-во именно рабочих листов, а Sheets.Count - кол-во всех листов данной книги. Или если вы обратитесь вот так Worksheets(shName) - где shName - это имя листа диаграммы то выйдет ошибка.
webley, на листах диаграмм нет cells... Тут недавно тему удалили (из-за названия кажется), где чел жаловался, что макрос одного известного макрописца ошибку выдаёт на его куче файлов. Я глянул - там в цикле обрабатывались все Sheets выбранных файлов. Думаю, оно и есть...
GIG_ant, Hugo спасибо за объяснения - теперь понятно. Как-то так получилось, что с листами диаграмм я кажется вообще никогда не работал - поэтому в эти нюансы и не вникал...
извиняюсь за надоедание, но вопрос остался открытым, так все же, есть ли такие условия запуска данного макроса? (или не стоит продолжать поиски решений)
{quote}{login=AKSENOV048}{date=10.08.2011 10:32}{thema=}{post}приношу извинения немного не правильно вопрос задал. не при создании нового листа, а при копировании листа (выполняется с помощью модуля).{/post}{/quote}Никак не пойму, что Вам требуется. Что такое - "выполняется с помощью модуля"?
Правильно ли я понимаю: нужно запускать некий макрос при создании нового листа методом копирования существующего? Если так, то: 1. Создаём переменную. 2. На событие открытия книги считаем к-во листов в ней и присваиваем это значение переменной. 3. На событие активации листа (в модуле книги) пишем проверку - если к-во листов больше переменной - запускаем макрос. 4. Увеличиваем на единичку значение переменной. Таким образом "простая" активация любого листа не будет вызывать Ваш макрос.
уважаемый Юрий М, вы все правильно поняли. "Если так, то: 1. Создаём переменную. 2. На событие открытия книги считаем к-во листов в ней и присваиваем это значение переменной. 3. На событие активации листа (в модуле книги) пишем проверку - если к-во листов больше переменной - запускаем макрос. 4. Увеличиваем на единичку значение переменной. Таким образом "простая" активация любого листа не будет вызывать Ваш макрос."
всем спасибо за ответы. все таки подумал и решил добавить исполнение этого макроса в другой макрос(создающий копии листов). по поводу работы макроса после удаления листов, думаю действительно не стоит заморачиваться, т.к удаляются они крайне редко, на этот случай можно просто поставить кнопку с этим макросом на лист Отчет.
у меня теперь вопрос, можно что-нибудь сделать с этим макросом, чтобы при его исполнении экран не мерцал, или работал побыстрее: 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