Добрый день. Не получается правильно написать макрос. Если нужен пример то выложу.
Нужно копировать лист "123" присвоить ему имя "текущая дата" (если такое имя уже есть то "12.11.18 (1)" .. "12.01.18 (2)" и тд.), затем поставить защиту на лист (с паролем "123") на изменение и скрыть. Макрос должен запускаться при сохранении.
Попробовал собрать ответы из разных тем не получается. Спасибо всем кто откликнется.
Добрый день. Не получается правильно написать макрос. Если нужен пример то выложу.
Нужно копировать лист "123" присвоить ему имя "текущая дата" (если такое имя уже есть то "12.11.18 (1)" .. "12.01.18 (2)" и тд.), затем поставить защиту на лист (с паролем "123") на изменение и скрыть. Макрос должен запускаться при сохранении.
Попробовал собрать ответы из разных тем не получается. Спасибо всем кто откликнется.Dasdasgret
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim sh As Worksheet, i, shName$ Sheets("123").Copy Before:=Sheets(1) On Error Resume Next Set sh = Sheets(CStr(Date)) If sh Is Nothing Then shName = Date Else Do While (Not sh Is Nothing) i = i + 1 Set sh = Nothing Set sh = Sheets(Date & " (" & i & ")") Loop shName = Date & " (" & i & ")" End If On Error GoTo 0 With ActiveSheet .Name = shName .Protect Password:="123" .Visible = xlSheetVeryHidden ' или просто xlSheetHidden End With End Sub
[/vba]
Dasdasgret, попробуйте так: [vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim sh As Worksheet, i, shName$ Sheets("123").Copy Before:=Sheets(1) On Error Resume Next Set sh = Sheets(CStr(Date)) If sh Is Nothing Then shName = Date Else Do While (Not sh Is Nothing) i = i + 1 Set sh = Nothing Set sh = Sheets(Date & " (" & i & ")") Loop shName = Date & " (" & i & ")" End If On Error GoTo 0 With ActiveSheet .Name = shName .Protect Password:="123" .Visible = xlSheetVeryHidden ' или просто xlSheetHidden End With End Sub
мое такое было, 2 листа сохранял, потом ошибка была. может напоследок скажете почему там только до 2х доходит?
[vba]
Код
Private Sub Workbook_AfterSave(ByVal Success As Boolean) Application.ScreenUpdating = 0 Dim i As Integer i = 0 Sheets("123").Copy After:=Sheets(1) ActiveSheet.Name = "RRTRR" Sheets("RRTRR").Protect Password:=ThisWorkbook.Sheets("PW").Range("A1") Sheets("RRTRR").Visible = False
ssff: i = i + 1 On Error GoTo ssff Sheets("RRTRR").Name = Date & "(" & (i) & ")"
Application.ScreenUpdating = 1
End Sub
[/vba]
Manyasha, Спасибо! все работает
мое такое было, 2 листа сохранял, потом ошибка была. может напоследок скажете почему там только до 2х доходит?
[vba]
Код
Private Sub Workbook_AfterSave(ByVal Success As Boolean) Application.ScreenUpdating = 0 Dim i As Integer i = 0 Sheets("123").Copy After:=Sheets(1) ActiveSheet.Name = "RRTRR" Sheets("RRTRR").Protect Password:=ThisWorkbook.Sheets("PW").Range("A1") Sheets("RRTRR").Visible = False
ssff: i = i + 1 On Error GoTo ssff Sheets("RRTRR").Name = Date & "(" & (i) & ")"
Слушайте, не пойму, в чем практический смысл в данном случае использовать событие _AfterSave? Ведь получается, что макрос после сохранения вносит изменения в книгу, что приводит параметр книги Saved в положение False, т.е. после сохранения, книга все равно будет не сохранена, а попытка закрыть книгу приведет к диалоговому окну "сохранить перед выходом?"... пользователь может нажать нет и лист, который только что сделался после сохранения в итоге не сохранится, а если нажмет да, это снова вызовет событие _AfterSave. Понимаете мысль?
Слушайте, не пойму, в чем практический смысл в данном случае использовать событие _AfterSave? Ведь получается, что макрос после сохранения вносит изменения в книгу, что приводит параметр книги Saved в положение False, т.е. после сохранения, книга все равно будет не сохранена, а попытка закрыть книгу приведет к диалоговому окну "сохранить перед выходом?"... пользователь может нажать нет и лист, который только что сделался после сохранения в итоге не сохранится, а если нажмет да, это снова вызовет событие _AfterSave. Понимаете мысль?Mikael
Сообщение отредактировал Mikael - Пятница, 12.01.2018, 14:55
Mikael, я не знал разницу между AfterSave и BeforeSave, что первое увидел то и поставил. Сейчас знаю, нужно BeforeSave, а так я не очень понял что Вы написали. AfterSave выполняется когда сохранишь только через ctrl+S BeforeSave при ctrl+S и закрытии файла.
Mikael, я не знал разницу между AfterSave и BeforeSave, что первое увидел то и поставил. Сейчас знаю, нужно BeforeSave, а так я не очень понял что Вы написали. AfterSave выполняется когда сохранишь только через ctrl+S BeforeSave при ctrl+S и закрытии файла.Dasdasgret
Dasdasgret, обработчики событий очень классная и мощная штука, но их нужно правильно использовать. Все зависит от Ваших конкретных целей, вот я и задался вопросом "в чем смысл".
Представим, что у Вас новая книга, чистая и еще совсем свежая Вы (или не Вы) там что-то делаете, когда все сделали - сохраняетесь (в это время макрос после сохранения создает скрытый лист), и жмете "крестик" чтобы выйти. Т.к. скрытый лист создавался после сохранения, Excel у Вас спросит "сохранить изменения перед выходом?". Если Вы нажмете "нет" (Вы же только что сохранились перед выходом, зачем еще раз сохраняться, логично?), книга закроется, а когда Вы ее откроете - там не будет этого скрытого листа.
Заранее прошу прощения, если загрузил, это я с добрыми намерениями и из чистых побуждений.
Dasdasgret, обработчики событий очень классная и мощная штука, но их нужно правильно использовать. Все зависит от Ваших конкретных целей, вот я и задался вопросом "в чем смысл".
Представим, что у Вас новая книга, чистая и еще совсем свежая Вы (или не Вы) там что-то делаете, когда все сделали - сохраняетесь (в это время макрос после сохранения создает скрытый лист), и жмете "крестик" чтобы выйти. Т.к. скрытый лист создавался после сохранения, Excel у Вас спросит "сохранить изменения перед выходом?". Если Вы нажмете "нет" (Вы же только что сохранились перед выходом, зачем еще раз сохраняться, логично?), книга закроется, а когда Вы ее откроете - там не будет этого скрытого листа.
Заранее прошу прощения, если загрузил, это я с добрыми намерениями и из чистых побуждений. Mikael
Повторюсь... Может кто подскажет, где ошибка? Почему только 2 листа делает.. i только до 2х доходит..
[vba]
Код
Private Sub Workbook_AfterSave(ByVal Success As Boolean) Application.ScreenUpdating = 0 Dim i As Integer i = 0 Sheets("123").Copy After:=Sheets(1) ActiveSheet.Name = "RRTRR" Sheets("RRTRR").Protect Password:=ThisWorkbook.Sheets("PW").Range("A1") Sheets("RRTRR").Visible = False
ssff: i = i + 1 On Error GoTo ssff Sheets("RRTRR").Name = Date & "(" & (i) & ")"
Application.ScreenUpdating = 1
End Sub
[/vba]
Повторюсь... Может кто подскажет, где ошибка? Почему только 2 листа делает.. i только до 2х доходит..
[vba]
Код
Private Sub Workbook_AfterSave(ByVal Success As Boolean) Application.ScreenUpdating = 0 Dim i As Integer i = 0 Sheets("123").Copy After:=Sheets(1) ActiveSheet.Name = "RRTRR" Sheets("RRTRR").Protect Password:=ThisWorkbook.Sheets("PW").Range("A1") Sheets("RRTRR").Visible = False
ssff: i = i + 1 On Error GoTo ssff Sheets("RRTRR").Name = Date & "(" & (i) & ")"