Страницы: 1 2 След.
RSS
Автосоздание листа, раз в месяц.
 
Доброй ночи!  
После долгого раздумья решился таки попробовать использовать макрос в своем единственном рабочем файле, страшно конечно, но лень берет свое... Посему, прошу не отказывать в помощи.  
Суть:  
Есть книга состоящая из 12 листов, каждый имеет названия месяцев года, по порядку "Январь" "Февраль" и т.д.  
В начале каждого месяца я создаю новый лист, с названием наступившего месяца. Вернее сказать не создаю, а копирую предыдущий (именно предыдущий, потому что, постоянно на последние листы вносятся какие-либо нововведения и изменения) с формулами форматами и прочей требухой. Но перед этим кое-что делаю еще...  
Описание моих действий:  
Предположим мне нужно создать лист "Январь" (наступил Новый Год)  
1. Открываю второй лист, т.е. "Февраль" и заменяю формулы в диапазоне (выделен желтым) на значения.  
2. Удаляю первый лист "Январь"  
3. Копирую последний лист "Декабрь" через меню Лист-Скопировать/Переместить в конец списка.  
4. Переименовую вновь созданный лист в "Январь"  
5. Захожу в этот лист и очищаю от констант определенные диапазоны (выделены зеленым)  
6. В красную ячейку пишу дату - первое число текущего месяца.  
7. Наслаждаюсь результатом своих титанических трудов.  
Можно ли как-то это автоматизировать? Например, проснулся я 1 января, открыл файл, а Эксель уже за меня все сделал. Хотя... могут быть варианты: "А первое число было?". Ну ладно, проснулся второго числа, открыл файл, а тут такой сюрприз!  
Поможите пожалуйста, а!  
66,5 Кб
 
Вах! В примере красненькую ячейку не показал, пусть это будет B1.
 
{quote}{login=kim}{date=01.06.2010 01:33}{thema=Автосоздание листа, раз в месяц.}{post}"А первое число было?". Ну ладно, проснулся второго числа...{/post}{/quote}  
Наивный :)
 
Думаешь всеравно разбудят первого числа? :)
 
Нет, после 31.12 сразу 04.01 (оптимистично) :)
 
Ну тогда так: "Просыпаюсь я в январе, открываю первый раз файл..."  
 
Да, забыл сказать, форматы которые будут находиться на листах (условные и обычные) не затрагиваются очисткой, очищаются только константы.  
Число которое будет прописываться в ячейке B1 должно отображаться в формате "[$-419]ММММ ГГГГ;@" если это важно конечно...
 
Еще добавочка:  
Формулы в желтом диапазоне должны заменится на значения не только во втором листе, но и в третьем и в четвертом - на трех листах.
 
Добрый вечер!  
Дима, спасибо что откликнулся.  
Каюсь, виноват, создал некорректный пример и надеюсь на ответ. Сейчас накропаю нормальный с реальным расположением диапазонов.  
Теперь ответы на вопросы, по порядку:  
------------------------------------------------------------------  
<<"- в зеленых диапазонах именно только константы удалить надо? Просто там нет ни одной константы - только формулы...">>  
Там должны быть только константы (просто, создавая пример с помощью СЛУЧМЕЖДУ() - забыл формулы заменить на значения), и их нужно очистить не затрагивая условного и обычного форматирования - это касается только вновь созданного листа (остальные листы не трогаем).  
------------------------------------------------------------------  
<<"-Диапазоны заданы раз и навсегда? Т.е. в макросе можно жестко указать диапазоны для очистки и т.д. и не пытаться их вычислять?">>  
Да, диапазоны стационарные, по крайней мере надеюсь на это. Даже если и прийдется когда-нибудь их передвинуть, думаю найду чего в макросе поправить. Пример, с реальным расположением диапазонов сейчас будет...  
-------------------------------------------------------------------  
<<"Это как? Т.е. наступил новый месяц - заменяем во всех листах формулы в желтых ячейках на значения? Правильно или есть подвох?">>  
Нет, заменять нужно только во втором третьем и четвертом листе в порядке их расположения, тоесть допустим первоначальное расположение листов такое: Январь, Февраль, Март, Апрель, Май и т.д., так вот, заменить нужно Февраль Март и Апрель...  
Теперь post_128194.rar в ближайшем рассмотрении :)  
Прежде чем его открыть, передвинул системные часы в будущее - 01.01.2011, открыл файл. Видимо лист "Январь" создался, но почему-то поместился в начало, а нужно в конец списка. Тоесть после данных махинаций макросом, первым листом в списке должен стать Февраль, а последним вновь созданный Январь.  
Да, по поводу ячейки с датой: там должна быть дата-константа 01.01.2011, а не формула СЕГОДНЯ(), и остаться неизменной на этом листе навсегда.  
Вот пример с реальным расположением диапазонов:
 
Ув. kim, я сильно не вникал, но по поводу вставки новых листов с именем(месяц):  
Public Sub qwe()  
Dim NewSheet As Worksheet  
Set NewSheet = Sheets.Add  
   NewSheet.Move After:=Sheets(Sheets.Count)`Перемещается в конец  
NewSheet.Name = CStr(Format(Now, "MMMM"))  
End Sub
Я сам - дурнее всякого примера! ...
 
kim, у меня предложение: а может не нужно уж ТАКОЙ автоматизации? Ведь не трудно 12 раз в году нажать на кнопку :-). Т.е. макрос будет всё это делать только тогда, когда Вы об этом ему скажете.
 
KuklP, спасибо, но пока ругается:  
Run-time error '1004':  
Application-defined or object-defined error  
--------------------------------------------------------------  
Юра, дык и кнопка наверное пойдет, просто мысль тайную вынашиваю - в дальнейшем, код предложенный, препарировать под мелкоскопом, токма изучения для :)  
Пойду почитаю про фобии, интересно, есть такая: боязнь макросов?
 
Макрофобия?
 
Макрофобия - боязнь долго ждать. ;)
 
Вот так попробуйте:  
Public Sub qwe()  
Dim Ws As Worksheet  
Dim NewSheet As Worksheet  
Set NewSheet = Sheets.Add  
   NewSheet.Move After:=Sheets(Sheets.Count)  
Application.DisplayAlerts = False  
For Each Ws In ThisWorkbook.Sheets  
If Ws.Name = CStr(Format(Now, "MMMM")) Then Ws.Delete  
Next  
NewSheet.Name = CStr(Format(Now, "MMMM"))  
Application.DisplayAlerts = True  
End Sub
Я сам - дурнее всякого примера! ...
 
Тогда макрософобия. В теме "Вопросы по работе форума" AZAM боится макросов, так как ему могут подбросить макровирус. И он теперь в растерянности - открывать эти файлы или нет.
 
А насчет кнопки - я недавно для Serge 007 писал программку, к-рая 1-го числа(или просто, когда месяц поменялся) выполняла какие-то действия. Там еще дикий гемор был с объединенными ячейками. Поищите(мне лень:-)).
Я сам - дурнее всякого примера! ...
 
KuklP, вот теперь лист создался, правильно обозвался и поместился в нужное место, но создался новый и чистый, а мне нужна полная копия последнего по списку.  
 
Юра, кстати моя боязнь началась в результате моих неудачных экспериментов с макрорекордером. Просто в книге, которая по крохам создавалась больше года, и объемом около 5 Мб в xlsx! В одно мгновение были очищены все форматы - вещь не очень приятная, и нет чтоб создать копию...
 
Если создается Декабрь, и так как листов в книге всегда двенадцать, то по логике, перед созданием/копированием, список листов начинается с Декабря (прошлый год) и заканчивается Ноябрем, кошмарить нужно Январь Февраль и Март :) Ну вобщем листы каждый месяц смещаются влево, как в стеке.
 
Тут особо важна последовательность действий. Самым первым и обязательным действием должно быть преобразование формул в значения, а уж потом все остальное.
 
Тогда так:  
Public Sub qwe()  
Dim Ws As Worksheet  
Dim NewSheet As Worksheet  
Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)  
Application.DisplayAlerts = False  
For Each Ws In ThisWorkbook.Sheets  
If Ws.Name = CStr(Format(Now, "MMMM")) Then Ws.Delete  
Next  
Sheets(Sheets.Count).Name = CStr(Format(Now, "MMMM"))  
Application.DisplayAlerts = True  
End Sub  
А в Workbook_Open()  
If Month(CDate(Sheets(Sheets.Count).Range("Где у Вас там дата для сравнения"))) = Month(Now) Then Exit Sub  
call qwe  
End Sub
Я сам - дурнее всякого примера! ...
 
Не, ну вроде правильно написал: (сейчас найду, где у меня там правая рука :))  
Копирую крайний правый лист: Правый клик мыши на ярлыке листа - Переместить/скопировать - перед листом: (переместить в конец), ставлю галку "Создать копию"  
Созданный лист получается справа. А когда удаляю первый лист в списке, листы как-бы визуально смещаются влево, правильно?
 
Последняя версия с очисткой зелени и вставкой даты:  
Public Sub qwe()  
Dim Ws As Worksheet  
Dim a As Byte  
a = Sheets.Count  
Sheets(a).Copy After:=Sheets(a)  
Application.DisplayAlerts = False  
For Each Ws In ThisWorkbook.Sheets  
If Ws.Name = CStr(Format(Now, "MMMM")) Then Ws.Delete  
Next  
Sheets(Sheets.Count).Name = CStr(Format(Now, "MMMM"))  
[A2] = Now
Range("G4:AK49").ClearContents  
Application.DisplayAlerts = True  
End Sub  
Листы будут смещаться влево.
Я сам - дурнее всякого примера! ...
 
Направление мысли верное :)  
Правда между зелеными диапазонами находятся другие данные, которые трогать ни в коем случае низзя (тут наверное как-то нужно эти диапазоны по отдельности перечислять - кстати, интересно глянуть, как это в коде выглядит) и в ячейку ввода даты должно попадать первое число месяца, а не текущее число - от него многие формулы отталкиваются.
 
Две строки:  
[A2] = CDate("1." & Month(Now) & "." & Year(Now))
Range("G4:AK10,P20:U20,V20:AC24,G26:AK47,G49:AK49").ClearContents
Я сам - дурнее всякого примера! ...
 
Во, оно, то что надо - спасибо большое!  
С этим разобрались, осталось с заменой формул на значения разобраться.  
И это все на кнопку надо будет вешать, правильно?  
 
Долго не отвечал по причине безуспешной борьбы со своей железякой-компом. Не мог авторизоваться ни на одном из сайтов. Оказалось что это происходит потому что я находился как бы в будущем (тестируя макрос, переводил системную дату вперед). Так что гостям из будущего у нас не сладко :).  
Вот такой вот интересный факт!
 
{quote}{login=kim}{date=01.06.2010 11:28}{thema=}{post}и нет чтоб создать копию...{/post}{/quote}  
Плюс еще и копиефобия?! :)
 
Чтоб без кнопки, читайте мой пост от 01.06.2010, 23:49 про Workbook_Open().  
"осталось с заменой формул на значения разобраться." - Это нужно сделать на трех листах которые первые слева? Тогда так:  
Public Sub qwe()  
Dim Ws As Worksheet  
Dim a As Byte, m As Byte  
a = Sheets.Count  
Sheets(a).Copy After:=Sheets(a)  
Application.DisplayAlerts = False  
For Each Ws In ThisWorkbook.Sheets  
If Ws.Name = CStr(Format(Now, "MMMM")) Then Ws.Delete  
Next  
Sheets(Sheets.Count).Name = CStr(Format(Now, "MMMM"))  
[A2] = CDate("1." & Month(Now) & "." & Year(Now))
Range("G4:AK10,P20:U20,V20:AC24,G26:AK47,G49:AK49").ClearContents  
For a = 1 To 3  
m = Month(Now) + a  
If m > 12 Then m = 1  
For Each Ws In ThisWorkbook.Sheets  
If Month(Ws.Range("A2")) = m Then  
   Ws.Range("AS4:AS10").Value = Ws.Range("AS4:AS10").Value  
End If  
Next  
Next  
Application.DisplayAlerts = True  
End Sub
Я сам - дурнее всякого примера! ...
 
Вот же тормознул немного. Так правильней:  
Public Sub qwe()  
Dim Ws As Worksheet  
Dim a As Byte, m As Byte  
a = Sheets.Count  
Sheets(a).Copy After:=Sheets(a)  
Application.DisplayAlerts = False  
For Each Ws In ThisWorkbook.Sheets  
If Ws.Name = CStr(Format(Now, "MMMM")) Then Ws.Delete  
Next  
Sheets(Sheets.Count).Name = CStr(Format(Now, "MMMM"))  
[A2] = CDate("1." & Month(Now) & "." & Year(Now))
Range("G4:AK10,P20:U20,V20:AC24,G26:AK47,G49:AK49").ClearContents  
m = Month(Now)  
For a = 1 To 3  
m = m + a  
If m > 12 Then m = 1  
For Each Ws In ThisWorkbook.Sheets  
If Month(Ws.Range("A2")) = m Then  
   Ws.Range("AS4:AS10").Value = Ws.Range("AS4:AS10").Value  
End If  
Next  
Next  
Application.DisplayAlerts = True  
End Sub
Я сам - дурнее всякого примера! ...
 
И еще. Я так подозреваю, что менять формулы назначения нужно только в третьем листе. После удаления первого листа в двух следующих формул уже не будет.
Я сам - дурнее всякого примера! ...
 
Туплю с утра. Так правильней:  
Public Sub qwe()  
Dim Ws As Worksheet  
Dim a As Byte, m As Byte  
a = Sheets.Count  
Sheets(a).Copy After:=Sheets(a)  
Application.DisplayAlerts = False  
For Each Ws In ThisWorkbook.Sheets  
If Ws.Name = CStr(Format(Now, "MMMM")) Then Ws.Delete  
Next  
Sheets(Sheets.Count).Name = CStr(Format(Now, "MMMM"))  
[A2] = CDate("1." & Month(Now) & "." & Year(Now))
For a = 1 To 3  
m = Month(Now) + a  
If m > 12 Then m = m - 12  
For Each Ws In ThisWorkbook.Sheets  
If Month(Ws.Range("A2")) = m Then  
   Ws.Range("AS4:AS10").Value = Ws.Range("AS4:AS10").Value  
End If  
Next  
Next  
Range("G4:AK10,P20:U20,V20:AC24,G26:AK47,G49:AK49").ClearContents  
Application.DisplayAlerts = True  
End Sub
Я сам - дурнее всякого примера! ...
Страницы: 1 2 След.
Читают тему
Loading...