Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Копировать лист и присвоить имя - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копировать лист и присвоить имя (Макросы/Sub)
Копировать лист и присвоить имя
Dasdasgret Дата: Пятница, 12.01.2018, 09:52 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Добрый день.
Не получается правильно написать макрос.
Если нужен пример то выложу.

Нужно копировать лист "123" присвоить ему имя "текущая дата" (если такое имя уже есть то "12.11.18 (1)" .. "12.01.18 (2)" и тд.), затем поставить защиту на лист (с паролем "123") на изменение и скрыть.
Макрос должен запускаться при сохранении.

Попробовал собрать ответы из разных тем не получается.
Спасибо всем кто откликнется.
 
Ответить
СообщениеДобрый день.
Не получается правильно написать макрос.
Если нужен пример то выложу.

Нужно копировать лист "123" присвоить ему имя "текущая дата" (если такое имя уже есть то "12.11.18 (1)" .. "12.01.18 (2)" и тд.), затем поставить защиту на лист (с паролем "123") на изменение и скрыть.
Макрос должен запускаться при сохранении.

Попробовал собрать ответы из разных тем не получается.
Спасибо всем кто откликнется.

Автор - Dasdasgret
Дата добавления - 12.01.2018 в 09:52
Manyasha Дата: Пятница, 12.01.2018, 10:14 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2132
Репутация: 867 ±
Замечаний: 0% ±

Excel 2010, 2016
Dasdasgret, здравствуйте.
Покажите свои попытки.


marinamorozova_box@mail.ru
ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеDasdasgret, здравствуйте.
Покажите свои попытки.

Автор - Manyasha
Дата добавления - 12.01.2018 в 10:14
Manyasha Дата: Пятница, 12.01.2018, 11:04 | Сообщение № 3
Группа: Модераторы
Ранг: Старожил
Сообщений: 2132
Репутация: 867 ±
Замечаний: 0% ±

Excel 2010, 2016
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
[/vba]


marinamorozova_box@mail.ru
ЯД: 410013299366744 WM: R193491431804


Сообщение отредактировал Manyasha - Пятница, 12.01.2018, 17:37
 
Ответить
Сообщение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
[/vba]

Автор - Manyasha
Дата добавления - 12.01.2018 в 11:04
Mikael Дата: Пятница, 12.01.2018, 11:40 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 24 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте!
Manyasha, прям почти один в один :) specool
Мой вариант:
[vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    Application.ScreenUpdating = 0
    
    Dim wsSh As Worksheet
    
    On Error Resume Next: Set wsSh = Sheets(CStr(Date)): On Error GoTo 0
    
    'Копирование листа
    Sheets("123").Copy After:=Sheets(Sheets.Count)
    
    With ActiveSheet
        
        'Если есть лист с текущей датой
        If Not wsSh Is Nothing Then
            
            Dim iCntr As Integer
            
            On Error Resume Next
            
            Do
                iCntr = iCntr + 1
                
                Set wsSh = Nothing
                Set wsSh = Sheets(CStr(Date) & " (" & iCntr & ")")
                
            Loop While Not wsSh Is Nothing
            
            On Error GoTo 0
            
            .Name = Date & " (" & iCntr & ")"
            
        Else    ' если нет
            
            .Name = Date
            
        End If  'Not wsSh Is Nothing
        
        'Невидимый
        .Visible = xlSheetHidden
        'Защищен с паролем
        .Protect Password:="123"
        
    End With    'ActiveSheet
    
    Application.ScreenUpdating = 1
    
End Sub
[/vba]


Сообщение отредактировал Mikael - Пятница, 12.01.2018, 11:42
 
Ответить
СообщениеЗдравствуйте!
Manyasha, прям почти один в один :) specool
Мой вариант:
[vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    Application.ScreenUpdating = 0
    
    Dim wsSh As Worksheet
    
    On Error Resume Next: Set wsSh = Sheets(CStr(Date)): On Error GoTo 0
    
    'Копирование листа
    Sheets("123").Copy After:=Sheets(Sheets.Count)
    
    With ActiveSheet
        
        'Если есть лист с текущей датой
        If Not wsSh Is Nothing Then
            
            Dim iCntr As Integer
            
            On Error Resume Next
            
            Do
                iCntr = iCntr + 1
                
                Set wsSh = Nothing
                Set wsSh = Sheets(CStr(Date) & " (" & iCntr & ")")
                
            Loop While Not wsSh Is Nothing
            
            On Error GoTo 0
            
            .Name = Date & " (" & iCntr & ")"
            
        Else    ' если нет
            
            .Name = Date
            
        End If  'Not wsSh Is Nothing
        
        'Невидимый
        .Visible = xlSheetHidden
        'Защищен с паролем
        .Protect Password:="123"
        
    End With    'ActiveSheet
    
    Application.ScreenUpdating = 1
    
End Sub
[/vba]

Автор - Mikael
Дата добавления - 12.01.2018 в 11:40
Dasdasgret Дата: Пятница, 12.01.2018, 13:53 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
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) & ")"

Application.ScreenUpdating = 1

End Sub
[/vba]


Сообщение отредактировал Dasdasgret - Пятница, 12.01.2018, 14:24
 
Ответить
Сообщение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) & ")"

Application.ScreenUpdating = 1

End Sub
[/vba]

Автор - Dasdasgret
Дата добавления - 12.01.2018 в 13:53
Dasdasgret Дата: Пятница, 12.01.2018, 14:15 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Еще кто знает можно ли поставить пароль что бы нельзя было изменить xlSheetVeryHidden?


Сообщение отредактировал Dasdasgret - Пятница, 12.01.2018, 14:20
 
Ответить
СообщениеЕще кто знает можно ли поставить пароль что бы нельзя было изменить xlSheetVeryHidden?

Автор - Dasdasgret
Дата добавления - 12.01.2018 в 14:15
Pelena Дата: Пятница, 12.01.2018, 14:17 | Сообщение № 7
Группа: Модераторы
Ранг: Местный житель
Сообщений: 12603
Репутация: 2774 ±
Замечаний: 0% ±

Excel 2010, 2016 & Mac Excel
Dasdasgret, оформите код тегами с помощью кнопки # в режиме правки поста


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеDasdasgret, оформите код тегами с помощью кнопки # в режиме правки поста

Автор - Pelena
Дата добавления - 12.01.2018 в 14:17
Mikael Дата: Пятница, 12.01.2018, 14:32 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 24 ±
Замечаний: 0% ±

Excel 2010
Еще кто знает можно ли поставить пароль что бы нельзя было изменить xlSheetVeryHidden?

Можно поставить пароль на проект. В редакторе VB ПКМ по проекту (VBAProject(...)) -> Properties -> закладка Protection
 
Ответить
Сообщение
Еще кто знает можно ли поставить пароль что бы нельзя было изменить xlSheetVeryHidden?

Можно поставить пароль на проект. В редакторе VB ПКМ по проекту (VBAProject(...)) -> Properties -> закладка Protection

Автор - Mikael
Дата добавления - 12.01.2018 в 14:32
Mikael Дата: Пятница, 12.01.2018, 14:52 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 24 ±
Замечаний: 0% ±

Excel 2010
Слушайте, не пойму, в чем практический смысл в данном случае использовать событие _AfterSave?
Ведь получается, что макрос после сохранения вносит изменения в книгу, что приводит параметр книги Saved в положение False, т.е. после сохранения, книга все равно будет не сохранена, а попытка закрыть книгу приведет к диалоговому окну "сохранить перед выходом?"... пользователь может нажать нет и лист, который только что сделался после сохранения в итоге не сохранится, а если нажмет да, это снова вызовет событие _AfterSave. Понимаете мысль?


Сообщение отредактировал Mikael - Пятница, 12.01.2018, 14:55
 
Ответить
СообщениеСлушайте, не пойму, в чем практический смысл в данном случае использовать событие _AfterSave?
Ведь получается, что макрос после сохранения вносит изменения в книгу, что приводит параметр книги Saved в положение False, т.е. после сохранения, книга все равно будет не сохранена, а попытка закрыть книгу приведет к диалоговому окну "сохранить перед выходом?"... пользователь может нажать нет и лист, который только что сделался после сохранения в итоге не сохранится, а если нажмет да, это снова вызовет событие _AfterSave. Понимаете мысль?

Автор - Mikael
Дата добавления - 12.01.2018 в 14:52
Dasdasgret Дата: Пятница, 12.01.2018, 15:26 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Mikael, я не знал разницу между AfterSave и BeforeSave, что первое увидел то и поставил.
Сейчас знаю, нужно BeforeSave, а так я не очень понял что Вы написали.
AfterSave выполняется когда сохранишь только через ctrl+S
BeforeSave при ctrl+S и закрытии файла.
 
Ответить
СообщениеMikael, я не знал разницу между AfterSave и BeforeSave, что первое увидел то и поставил.
Сейчас знаю, нужно BeforeSave, а так я не очень понял что Вы написали.
AfterSave выполняется когда сохранишь только через ctrl+S
BeforeSave при ctrl+S и закрытии файла.

Автор - Dasdasgret
Дата добавления - 12.01.2018 в 15:26
Mikael Дата: Пятница, 12.01.2018, 15:54 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 24 ±
Замечаний: 0% ±

Excel 2010
Dasdasgret, обработчики событий очень классная и мощная штука, но их нужно правильно использовать. Все зависит от Ваших конкретных целей, вот я и задался вопросом "в чем смысл". :)
AfterSave выполняется когда сохранишь только через ctrl+S

Это легко проверить через пошаговый отладчик, при закрытии с сохранением событие тоже срабатывает, но этот новый лист не сохранится в книге.
а так я не очень понял что Вы написали.

Представим, что у Вас новая книга, чистая и еще совсем свежая :) Вы (или не Вы) там что-то делаете, когда все сделали - сохраняетесь (в это время макрос после сохранения создает скрытый лист), и жмете "крестик" чтобы выйти. Т.к. скрытый лист создавался после сохранения, Excel у Вас спросит "сохранить изменения перед выходом?". Если Вы нажмете "нет" (Вы же только что сохранились перед выходом, зачем еще раз сохраняться, логично?), книга закроется, а когда Вы ее откроете - там не будет этого скрытого листа.

Заранее прошу прощения, если загрузил, это я с добрыми намерениями и из чистых побуждений. victory
 
Ответить
СообщениеDasdasgret, обработчики событий очень классная и мощная штука, но их нужно правильно использовать. Все зависит от Ваших конкретных целей, вот я и задался вопросом "в чем смысл". :)
AfterSave выполняется когда сохранишь только через ctrl+S

Это легко проверить через пошаговый отладчик, при закрытии с сохранением событие тоже срабатывает, но этот новый лист не сохранится в книге.
а так я не очень понял что Вы написали.

Представим, что у Вас новая книга, чистая и еще совсем свежая :) Вы (или не Вы) там что-то делаете, когда все сделали - сохраняетесь (в это время макрос после сохранения создает скрытый лист), и жмете "крестик" чтобы выйти. Т.к. скрытый лист создавался после сохранения, Excel у Вас спросит "сохранить изменения перед выходом?". Если Вы нажмете "нет" (Вы же только что сохранились перед выходом, зачем еще раз сохраняться, логично?), книга закроется, а когда Вы ее откроете - там не будет этого скрытого листа.

Заранее прошу прощения, если загрузил, это я с добрыми намерениями и из чистых побуждений. victory

Автор - Mikael
Дата добавления - 12.01.2018 в 15:54
Dasdasgret Дата: Пятница, 12.01.2018, 16:15 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Mikael, смысл был в том что мне не важен лист, если тот кто правил файл не захотел в итоге все сохранить.
 
Ответить
СообщениеMikael, смысл был в том что мне не важен лист, если тот кто правил файл не захотел в итоге все сохранить.

Автор - Dasdasgret
Дата добавления - 12.01.2018 в 16:15
Dasdasgret Дата: Пятница, 12.01.2018, 16:24 | Сообщение № 13
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Повторюсь... Может кто подскажет, где ошибка? Почему только 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) & ")"

Application.ScreenUpdating = 1

End Sub
[/vba]

Автор - Dasdasgret
Дата добавления - 12.01.2018 в 16:24
Manyasha Дата: Пятница, 12.01.2018, 17:36 | Сообщение № 14
Группа: Модераторы
Ранг: Старожил
Сообщений: 2132
Репутация: 867 ±
Замечаний: 0% ±

Excel 2010, 2016
в чем практический смысл в данном случае использовать событие _AfterSave?

А я книгу не закрывала во время тестирования, вот и не додумалась))
Конечно лучше на Workbook_BeforeSave исправить (в своем посте исправила).
Может кто подскажет, где ошибка?

Вот в этой теме есть хорошее объяснение.
Вот так работает:
[vba]
Код
ssff:
i = i + 1
On Error GoTo ssff
Resume lab
lab:
Sheets("RRTRR").Name = Date & "(" & (i) & ")"
[/vba]

А вообще, On Error GoTo лучше не злоупотреблять.


marinamorozova_box@mail.ru
ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщение
в чем практический смысл в данном случае использовать событие _AfterSave?

А я книгу не закрывала во время тестирования, вот и не додумалась))
Конечно лучше на Workbook_BeforeSave исправить (в своем посте исправила).
Может кто подскажет, где ошибка?

Вот в этой теме есть хорошее объяснение.
Вот так работает:
[vba]
Код
ssff:
i = i + 1
On Error GoTo ssff
Resume lab
lab:
Sheets("RRTRR").Name = Date & "(" & (i) & ")"
[/vba]

А вообще, On Error GoTo лучше не злоупотреблять.

Автор - Manyasha
Дата добавления - 12.01.2018 в 17:36
Dasdasgret Дата: Суббота, 13.01.2018, 01:35 | Сообщение № 15
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Тема закрыта. Всем спасибо!
 
Ответить
СообщениеТема закрыта. Всем спасибо!

Автор - Dasdasgret
Дата добавления - 13.01.2018 в 01:35
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копировать лист и присвоить имя (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2018 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!