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

Вход

Регистрация

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

 

= Мир MS Excel/защитить ячейки чтобы макрос работал - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
защитить ячейки чтобы макрос работал
ttv Дата: Среда, 13.12.2017, 11:59 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Здравствуйте, форумчане!
Подскажите - как защитить ячейки от изменения или удаления так, чтобы макрос работал?
Один макрос - вставляет строку в нужном диапазоне и копирует туда формулы со строки выше. Пользователь может заполнять ячейки залитые серым (B14:D37, N14:N37 и еще немножко в шапке листа).
Второй макрос - удаляет последнюю заполненную строку.
Если делать через стандартную защиту ячеек листа - макросы перестают работать. Если делать через проверку данных - пользователь не может изменить формулы, но может их удалить.
Как защитить формулы от юзеров чтобы и макросы остались рабочими?
Или как разрешить макросу копировать защищенные ячейки?
К сообщению приложен файл: 2752666.xlsm (27.3 Kb)
 
Ответить
СообщениеЗдравствуйте, форумчане!
Подскажите - как защитить ячейки от изменения или удаления так, чтобы макрос работал?
Один макрос - вставляет строку в нужном диапазоне и копирует туда формулы со строки выше. Пользователь может заполнять ячейки залитые серым (B14:D37, N14:N37 и еще немножко в шапке листа).
Второй макрос - удаляет последнюю заполненную строку.
Если делать через стандартную защиту ячеек листа - макросы перестают работать. Если делать через проверку данных - пользователь не может изменить формулы, но может их удалить.
Как защитить формулы от юзеров чтобы и макросы остались рабочими?
Или как разрешить макросу копировать защищенные ячейки?

Автор - ttv
Дата добавления - 13.12.2017 в 11:59
китин Дата: Среда, 13.12.2017, 12:30 | Сообщение № 2
Группа: Модераторы
Ранг: Экселист
Сообщений: 7025
Репутация: 1076 ±
Замечаний: 0% ±

Excel 2007;2010;2016
почитайте ТУТ


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852
 
Ответить
Сообщениепочитайте ТУТ

Автор - китин
Дата добавления - 13.12.2017 в 12:30
ttv Дата: Среда, 10.01.2018, 11:59 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
почитайте ТУТ


Почитала и сделала так:
[vba]
Код
Sub Protect_for_User_Non_for_VBA()
    ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True
End Sub
[/vba]

Теперь вылезла такая проблема:
пользователю разрешено вставлять данные в определенные ячейки, все остальные заблокированы, пользователь даже не может их выделить. Но если пользователь вставляет свои данные способом "копировать-вставить" - то те ячейки, которые он только что заполнил сразу же становятся заблокированными. А если пользователь ошибся - он не сможет изменить то, что вставил только что. Заблокированы листы с применением пароля и пароль пользователь знать не будет.
Как сделать так чтобы при любых способах вставки данных пользователя:
1) разрешенные к редактированию пользователем ячейки не блокировались;
2) сохранялось форматирование (в т.ч. УФ) в моем файле, а не то что пользователь откуда-то скопировал.
 
Ответить
Сообщение
почитайте ТУТ


Почитала и сделала так:
[vba]
Код
Sub Protect_for_User_Non_for_VBA()
    ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True
End Sub
[/vba]

Теперь вылезла такая проблема:
пользователю разрешено вставлять данные в определенные ячейки, все остальные заблокированы, пользователь даже не может их выделить. Но если пользователь вставляет свои данные способом "копировать-вставить" - то те ячейки, которые он только что заполнил сразу же становятся заблокированными. А если пользователь ошибся - он не сможет изменить то, что вставил только что. Заблокированы листы с применением пароля и пароль пользователь знать не будет.
Как сделать так чтобы при любых способах вставки данных пользователя:
1) разрешенные к редактированию пользователем ячейки не блокировались;
2) сохранялось форматирование (в т.ч. УФ) в моем файле, а не то что пользователь откуда-то скопировал.

Автор - ttv
Дата добавления - 10.01.2018 в 11:59
Mikael Дата: Среда, 10.01.2018, 15:13 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 80
Репутация: 31 ±
Замечаний: 0% ±

Excel 2010
ttv, попробуйте так:
Это обработчик события изменения ячейки, код выполняется только когда включен режим копирования или вырезания.
Код нужно добавить в модуль листа.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    
    With Application
        If .CutCopyMode = 0 Then Exit Sub
        .EnableEvents = 0
        .Undo
        Target.PasteSpecial Paste:=xlPasteValues
        .EnableEvents = 1
    End With    'Application
    
End Sub
[/vba]
 
Ответить
Сообщениеttv, попробуйте так:
Это обработчик события изменения ячейки, код выполняется только когда включен режим копирования или вырезания.
Код нужно добавить в модуль листа.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    
    With Application
        If .CutCopyMode = 0 Then Exit Sub
        .EnableEvents = 0
        .Undo
        Target.PasteSpecial Paste:=xlPasteValues
        .EnableEvents = 1
    End With    'Application
    
End Sub
[/vba]

Автор - Mikael
Дата добавления - 10.01.2018 в 15:13
ttv Дата: Четверг, 11.01.2018, 08:13 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
ttv, попробуйте так


Получается, но только если защита на лист стоит без пароля. А когда защита с паролем - не работает. Что нужно добавить в макрос чтобы заработал и на запароленой защите листа?
На другие макросы я пишу самой первой строчкой кода вот такое
[vba]
Код
ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True
[/vba]
С этим макросом так пробовала - не работает все равно.
 
Ответить
Сообщение
ttv, попробуйте так


Получается, но только если защита на лист стоит без пароля. А когда защита с паролем - не работает. Что нужно добавить в макрос чтобы заработал и на запароленой защите листа?
На другие макросы я пишу самой первой строчкой кода вот такое
[vba]
Код
ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True
[/vba]
С этим макросом так пробовала - не работает все равно.

Автор - ttv
Дата добавления - 11.01.2018 в 08:13
Mikael Дата: Четверг, 11.01.2018, 12:04 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 80
Репутация: 31 ±
Замечаний: 0% ±

Excel 2010
ttv, сложно так сказать, где проблема. Пришлите текущий файл.
У меня все работает и под защитой с паролем, Вы сделали серые ячейки не защищаемыми? ПКМ -> формат ячеек -> защита -> снять галку "защищаемая ячейка"

На другие макросы я пишу самой первой строчкой кода вот такое

Этот код нужно поместить в событие Workbook_Open в модуль книги:
[vba]
Код
Private Sub Workbook_Open()
    Sheets("Данные").Protect Password:="1111", UserInterfaceOnly:=True
End Sub
[/vba]
Из остальных макросов удалить.
 
Ответить
Сообщениеttv, сложно так сказать, где проблема. Пришлите текущий файл.
У меня все работает и под защитой с паролем, Вы сделали серые ячейки не защищаемыми? ПКМ -> формат ячеек -> защита -> снять галку "защищаемая ячейка"

На другие макросы я пишу самой первой строчкой кода вот такое

Этот код нужно поместить в событие Workbook_Open в модуль книги:
[vba]
Код
Private Sub Workbook_Open()
    Sheets("Данные").Protect Password:="1111", UserInterfaceOnly:=True
End Sub
[/vba]
Из остальных макросов удалить.

Автор - Mikael
Дата добавления - 11.01.2018 в 12:04
ttv Дата: Пятница, 12.01.2018, 10:07 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Вы сделали серые ячейки не защищаемыми?

серые ячейки не защищены и должны такими остаться. В эти ячейки пользователь вводит свои данные.
Проблема в том, что данные берутся из разных файлов, и как правило в эксель по умолчанию все ячейки в файле защищенные. Соответсвенно если пользователь копирует данные откуда-то, то и вставляет их в мою таблицу с этим же свойством защищенной ячейки. А мне надо чтобы макрос автоматически делал вставку только значений.
В общем - если копировать данные и вставлять через "щелчок ПКМ в самой таблице - вставить" - то все нормально. А если у пользователя много разных данных - копируют кусками сразу несколько, потом открывают мой файл и открывают окно буфера обмена и вот там щелкают на скопированное чтобы вставить в таблицу - то тогда только что вставленные ячейки получаются заблокированы.

Этот код нужно поместить в событие Workbook_Open в модуль книги:
,
Из остальных макросов удалить
-- - исправила, спасибо!

сложно так сказать, где проблема. Пришлите текущий файл

файл прикладываю.
К сообщению приложен файл: 5326071.xlsm (28.2 Kb)
 
Ответить
Сообщение
Вы сделали серые ячейки не защищаемыми?

серые ячейки не защищены и должны такими остаться. В эти ячейки пользователь вводит свои данные.
Проблема в том, что данные берутся из разных файлов, и как правило в эксель по умолчанию все ячейки в файле защищенные. Соответсвенно если пользователь копирует данные откуда-то, то и вставляет их в мою таблицу с этим же свойством защищенной ячейки. А мне надо чтобы макрос автоматически делал вставку только значений.
В общем - если копировать данные и вставлять через "щелчок ПКМ в самой таблице - вставить" - то все нормально. А если у пользователя много разных данных - копируют кусками сразу несколько, потом открывают мой файл и открывают окно буфера обмена и вот там щелкают на скопированное чтобы вставить в таблицу - то тогда только что вставленные ячейки получаются заблокированы.

Этот код нужно поместить в событие Workbook_Open в модуль книги:
,
Из остальных макросов удалить
-- - исправила, спасибо!

сложно так сказать, где проблема. Пришлите текущий файл

файл прикладываю.

Автор - ttv
Дата добавления - 12.01.2018 в 10:07
Mikael Дата: Пятница, 12.01.2018, 10:35 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 80
Репутация: 31 ±
Замечаний: 0% ±

Excel 2010
ttv, попробуйте сейчас. Я перенес обработчик события в модуль листа1 (Данные)
см. 4 пост
Код нужно добавить в модуль листа.
К сообщению приложен файл: 9028992.xlsm (29.9 Kb)
 
Ответить
Сообщениеttv, попробуйте сейчас. Я перенес обработчик события в модуль листа1 (Данные)
см. 4 пост
Код нужно добавить в модуль листа.

Автор - Mikael
Дата добавления - 12.01.2018 в 10:35
ttv Дата: Понедельник, 15.01.2018, 08:41 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
ttv, попробуйте сейчас


попробовала, у меня также - если вставлять тыкая мышью в окно буфера обмена - то вставляется заблокированным и с сохранением исходного форматирования (желтая заливка и т.д.). %)

А если вставлять просто ПКМ в таблицу - то все нормально.
 
Ответить
Сообщение
ttv, попробуйте сейчас


попробовала, у меня также - если вставлять тыкая мышью в окно буфера обмена - то вставляется заблокированным и с сохранением исходного форматирования (желтая заливка и т.д.). %)

А если вставлять просто ПКМ в таблицу - то все нормально.

Автор - ttv
Дата добавления - 15.01.2018 в 08:41
Mikael Дата: Понедельник, 15.01.2018, 16:06 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 80
Репутация: 31 ±
Замечаний: 0% ±

Excel 2010
Сорри, про буфер обмена проглядел. У меня нет опыта общения с ним, поэтому тут помочь не смогу. Судя по информации в гугле, буфер обмена это уже другая история, стандартными методами к нему не подобраться.

Как вариант, предлагаю такой подход:
Если открыт буфер обмена, то на любые изменения ячеек запоминать их значения во временной переменной, отменять изменения, и вставлять туда же значения из переменной, если нет - отслеживать режим копирования/вырезания.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    
    With Application
        Call Module9.AppSettings(0)
        If .DisplayClipboardWindow Then
            Dim aTmp() As Variant
            aTmp = IIf(Target.Count > 1, Target.Value, Array(Target.Value))
            .Undo: Target.Value = aTmp
        Else
            If .CutCopyMode > 0 Then
                .Undo: Target.PasteSpecial Paste:=xlPasteValues
            End If  '.CutCopyMode
        End If  '.DisplayClipboardWindow
        Call Module9.AppSettings(1)
    End With    'Application
    
End Sub
[/vba]
При этом нужно обязательно добавить следующий код в модуль9:
[vba]
Код
Public Sub AppSettings(ByVal bValue As Boolean)
    With Application: .ScreenUpdating = bValue: .EnableEvents = bValue: End With
End Sub
[/vba]
А в Ваши макросы добавить вызовы в начале и в конце:
[vba]
Код
Call AppSettings(0)
    ...
    ...
    ...
Call AppSettings(1)
[/vba]
Это делается чтобы обработчик Worksheet_Change не срабатывал когда не надо.
Добавил файл:
К сообщению приложен файл: 2157253.xlsm (29.3 Kb)


Сообщение отредактировал Mikael - Понедельник, 15.01.2018, 16:07
 
Ответить
СообщениеСорри, про буфер обмена проглядел. У меня нет опыта общения с ним, поэтому тут помочь не смогу. Судя по информации в гугле, буфер обмена это уже другая история, стандартными методами к нему не подобраться.

Как вариант, предлагаю такой подход:
Если открыт буфер обмена, то на любые изменения ячеек запоминать их значения во временной переменной, отменять изменения, и вставлять туда же значения из переменной, если нет - отслеживать режим копирования/вырезания.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    
    With Application
        Call Module9.AppSettings(0)
        If .DisplayClipboardWindow Then
            Dim aTmp() As Variant
            aTmp = IIf(Target.Count > 1, Target.Value, Array(Target.Value))
            .Undo: Target.Value = aTmp
        Else
            If .CutCopyMode > 0 Then
                .Undo: Target.PasteSpecial Paste:=xlPasteValues
            End If  '.CutCopyMode
        End If  '.DisplayClipboardWindow
        Call Module9.AppSettings(1)
    End With    'Application
    
End Sub
[/vba]
При этом нужно обязательно добавить следующий код в модуль9:
[vba]
Код
Public Sub AppSettings(ByVal bValue As Boolean)
    With Application: .ScreenUpdating = bValue: .EnableEvents = bValue: End With
End Sub
[/vba]
А в Ваши макросы добавить вызовы в начале и в конце:
[vba]
Код
Call AppSettings(0)
    ...
    ...
    ...
Call AppSettings(1)
[/vba]
Это делается чтобы обработчик Worksheet_Change не срабатывал когда не надо.
Добавил файл:

Автор - Mikael
Дата добавления - 15.01.2018 в 16:06
ttv Дата: Понедельник, 22.01.2018, 10:12 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Mikael, получилось, все отлично работает! СПАСИБО вам огромнейшее!!!
 
Ответить
СообщениеMikael, получилось, все отлично работает! СПАСИБО вам огромнейшее!!!

Автор - ttv
Дата добавления - 22.01.2018 в 10:12
ttv Дата: Среда, 24.01.2018, 15:50 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
на любые изменения ячеек


еще вопросик - а можно это все применить только к определенному диапазону ячеек? А не ко всем ячейкам на листе?
 
Ответить
Сообщение
на любые изменения ячеек


еще вопросик - а можно это все применить только к определенному диапазону ячеек? А не ко всем ячейкам на листе?

Автор - ttv
Дата добавления - 24.01.2018 в 15:50
Mikael Дата: Четверг, 25.01.2018, 10:49 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 80
Репутация: 31 ±
Замечаний: 0% ±

Excel 2010
ttv, можно, к какому?
Делается примерно так:
в начало обработчика события Worksheet_Change добавить условие
[vba]
Код
If Intersect(Target, Range("A1:D12")) Is Nothing Then Exit Sub
[/vba]

Upd: чтобы работал только для столбцов Дата Х1 Х2 подставьте вот такой диапазон [vba]
Код
Range("B14:D" & [a14].End(xlDown).Row)
[/vba]


Сообщение отредактировал Mikael - Четверг, 25.01.2018, 11:16
 
Ответить
Сообщениеttv, можно, к какому?
Делается примерно так:
в начало обработчика события Worksheet_Change добавить условие
[vba]
Код
If Intersect(Target, Range("A1:D12")) Is Nothing Then Exit Sub
[/vba]

Upd: чтобы работал только для столбцов Дата Х1 Х2 подставьте вот такой диапазон [vba]
Код
Range("B14:D" & [a14].End(xlDown).Row)
[/vba]

Автор - Mikael
Дата добавления - 25.01.2018 в 10:49
ttv Дата: Четверг, 01.02.2018, 11:27 | Сообщение № 14
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Upd: чтобы работал только для столбцов Дата Х1 Х2 подставьте вот такой диапазон


Mikael, спасибо огромнейшее, получилось как мне надо, теперь просто космос, а не файл! hands Пользователи рыдают от счастья :D


Сообщение отредактировал ttv - Четверг, 01.02.2018, 11:28
 
Ответить
Сообщение
Upd: чтобы работал только для столбцов Дата Х1 Х2 подставьте вот такой диапазон


Mikael, спасибо огромнейшее, получилось как мне надо, теперь просто космос, а не файл! hands Пользователи рыдают от счастья :D

Автор - ttv
Дата добавления - 01.02.2018 в 11:27
  • Страница 1 из 1
  • 1
Поиск:

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