Выполнение макроса из-под защиты листа / частичная защита ячеек на листе

Автор Anton Stasenko, 27.02.2012, 15:42

« назад - далее »

Anton Stasenko

Нужна помощь по следующей проблеме: есть файл в который вносится информация на листы Баланс,2011, 2010, Отчет о прибылях и убытках 2011, 2010 (они потом используются в качестве источника данных для заполнения другим макросом на лист  "Balansas,pna" - для упрощения оставлен только макрос очищащий эти данные). Проблемы следующие:
1) Надо защитить ячейки на всех листах книги, где есть формулы. Я пошел через защиту листов, на которых перед этим снимается Lock Cell - загадка для меня в том, что на некоторых листах это работает ("Instrukcijos", "Balansas,pna", "2011 PA" - на этом надо оставить весь лист с возможностью редактирования), а на других не работает никак - все защищается без возможности редактирования - в чем проблема не могу разобраться.
2) надо чтобы работали макросы при включенной защите редактирования - я вроде бы сделал такую возможность (см. на примере макроса "ClearBalansas2011"), но проблема в том - что смог сделать это только когда пароль точно зафиксирован - а как сделать, чтобы макрос сам "узнавал" какой пароль был введен?

Wasilic

  'Перед обработкой   
ActiveSheet.Unprotect Password:="111"   'Снять защиту с паролем 111
  'Код обработки
  'После обработки

ActiveSheet.Protect Password:="111"   'Защитить лист с паролем 111
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

Anton Stasenko

На сколько я понял - это ответ на вопрос №2 - вот с этим то у меня проблем и нет (в макросе "ClearBalansas" у меня похожий код - а вот если другой пользователь захочет поставить пароль не "111", а другой - как заставить макрос "понять" какой именно пароль надо ввести, чтобы он выполнил требуемые действия?

Wasilic

Цитата: Anton Stasenko от 27.02.2012, 17:11
а вот если другой пользователь захочет поставить пароль не "111", а другой
А зачем тогда пароль, если его ставит пользователь?  :-\
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

Anton Stasenko

Там будет 2 уровня пользователей - главный бухгалтер (которая сможет менять пароль и формулы) и обычные бухгалтеры, которые не смогут обладать таким правом

GWolf

Добрый день!

Как вариант:

sub primer()

   '"Зашейте" в макрос различные пароли: для главбуха и для рядовых бухгалтеров.
   PassWdGBx = "stopno" ' - для главбуха
   PassWdBux = "zero" ' - для бухгалтеров

   'ну а теперь дадим пользователю ввести пароль, и сравнив его с прошитыми, определимся какой уровень защиты пользователю   доступен.

   pw = inputbox("Введите пароль:", "Запрос системы")

   if pw= PassWdGBx and pw <> PassWdBux then
      'доступ для главбуха
   elseif pw<> PassWdGBx and pw = PassWdBux then
      'доступ для бухгалтера
   else
      'отказать в доступе и покинуть систему
      msgbox "",""
      exit sub
   end if
end sub

Путей к вершине - множество. Этот один из многих!

Anton Stasenko

Да спасибо, не думал, что можно использовать несколько паролей. Остается еще один вопрос из первого поста - почему при защите листа не появляется возможность ввода данных?

Wasilic

Цитата: Anton Stasenko от 28.02.2012, 10:59
почему при защите листа не появляется возможность ввода данных?
Ну так, покажите нам этот лист!
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

Anton Stasenko


Wasilic

Цитата: Anton Stasenko от 28.02.2012, 10:59
почему при защите листа не появляется возможность ввода данных?
Антон, так может поясните, на каком листе и в каком диапазоне
не появляется возможность ввода данных!
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

Anton Stasenko

Надо защитить ячейки на всех листах книги, где есть формулы. Я пошел через защиту листов, на которых перед этим снимается Lock Cell - загадка для меня в том, что на некоторых листах это работает ("Instrukcijos", "Balansas,pna", "2011 PA" - на этом надо оставить весь лист с возможностью редактирования), а на других не работает никак - все защищается без возможности редактирования - в чем проблема не могу разобраться. Ниже макрос который я уже изменял и не могу понять - почему когда на листе "2011 PA" Selection.Locked = False дает возможность внесения информации во всем листе, а на листе "2011 Balansas" - нет. При этом если выделять определенные ячейки на листе "Balansas, pna" и блокировать их как Selection.Locked = True, то получается все как мне надо (можно вносить данные только туда, где нет формул). А эта же самая операция на листе "Investicijos" - уж ене дает такого эффекта. в чем проблема?


Wasilic

Ну Вы и нагородили!
Команда Cells.Select  выделяет ВСЕ ячейки ТОЛЬКО НА АКТИВНОМ листе.
Команда  Selection.Locked = False  снимает с выделенных ячеек защиту когда лист будет защищен, НО выполняется эта команда только при снятой защите листа!

Чтобы на листе 2011 Balansas все ячейки были доступны
Достаточно просто снять с него защиту
Sheets("2011 Balansas").Unprotect Password:="12345"

Чтобы на защищенном листе были доступны ТОЛЬКО ячейки например – А9-F71, их можно указать макросом но, перед этим надо снять защиту листа, а потом установить:
Sheets("2011 Balansas").Unprotect Password:="12345"
Worksheets("2011 Balansas").Range("A9:F71").Locked = False
Sheets("2011 Balansas").Protect Password:="12345"


А можно и вручную без огорода.
Снимаете защиту с листа.
Выделяете нужные ячейки – А9-F71
Кликаете на них правой кнопкой мышки
Выбираете «Формат ячеек»
Выбираете закладку «Защита»
Снимаете галку с «Защищаемая ячейка»  > ОК
И так все нужные ячейки.
После этого только ставите или снимаете защиту листа.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

Anton Stasenko

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

Anton Stasenko

К сожалению, предложенные упрощенные варианты защиты листов не сработали почему-то. Пришлось макрос дорабатывать исходя из автозаписи макроса и потребностей:
1) надо блокировать листы выборочно (т.е. нельзя запустить цикл по перебору всех листов)
2) все таки блокировку включать макросом, а не вручную
В результате получилось следующее

Sub Protection()
Worksheets("Instrukcijos").Activate
Dim Msgs, Style
Dim pw As String
    Msgs = "Would you like to protect all sheets in active workbook?"
    Style = vbYesNo + vbDefaultButton2
   
    On Error GoTo Ups
   
    If MsgBox(Msgs, Style) = vbYes Then
        pw = InputBox("Please enter password to protect all sheets in current workbook")
        ActiveWorkbook.Protect (pw)
Application.ScreenUpdating = False
Worksheets("Duomenu tikrinimas").Activate
    Cells.Select
    Selection.Locked = False
    'Selection of Range for protection from changing
    Union(Range("A1:C241,D6:E6,D105:E105,D145:E145,D152:E152,D157:E157,D161:E161" _
        ), Range("D166:E166,D170:E170,D173:E173,D177:E177,D183:E183,D192:E192,D207:E207,D219:E219" _
        ), Range("D228:E228,D234:E234,D238:E238")).Select
    Selection.Locked = True
    Selection.FormulaHidden = False
    Sheets("Duomenu tikrinimas").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = False
Worksheets("Instrukcijos").Activate
    Cells.Select
    Selection.Locked = False
    'Selection of Range for protection from changing
    Range("A1:H1,B3:B17,C6,C8:C10,C13,D15:D17,B22:C25,A28:C28,A29:B169,A172:B195").Select
    Selection.Locked = True
    Selection.FormulaHidden = False
    Sheets("Instrukcijos").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = False
Worksheets("Balansas, pna").Activate
    Cells.Select
    Selection.Locked = False
    'Selection of Range for protection from changing
    Union(Range("C167:D167,C171:D171,C174:D174,C176:D176,C178:D179,E1:F179,A1:B150,A155:B178" _
        ), Range("C1:D11,C18:D18,C27:D29,C32:D32,C35:D35,C41:D41,C44:D46,C54:D54,C58:D58" _
        ), Range("C60:D60,C65:D65,C68:D69,C72:D73,C79:D81,C86:D86,C89:D89,C93:D94" _
        ), Range("C97:D97,C105:D105,C113:D114,C118:D118" _
        ), Range("C131:D131,C135:D135,C139:D139,C150:D151,C159:D160,C163:D164")).Select
    Selection.Locked = True
    Selection.FormulaHidden = False
    Sheets("Balansas, pna").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
Worksheets("Instrukcijos").Activate
   MsgBox ("All sheets were protected successfully")
    End If
Exit Sub

Ups: MsgBox ("Incorrect password (protection already exists)")
   
Worksheets("Instrukcijos").Activate
End Sub

Для снятия защиты у меня получился следующий макрос
Sub Unprotection()
   Worksheets("Instrukcijos").Activate
    Dim Msgs, Style
    Dim pw As String, ps As String, i As Integer
    Msgs = "Would you like to unprotect all sheets in active workbook?"
    Style = vbYesNo + vbDefaultButton2
   
    On Error GoTo Ups
   
    If MsgBox(Msgs, Style) = vbYes Then
        pw = InputBox("Please enter password to unprotect all sheets in current workbook")
        ActiveWorkbook.Unprotect (pw)
        Application.ScreenUpdating = True
    For i = 1 To ActiveWorkbook.Sheets.Count
        Application.ScreenUpdating = False
        Sheets(i).Unprotect (pw)
    Next i
        Application.ScreenUpdating = True
        MsgBox ("All sheets were unprotected successfully")
    End If
Exit Sub

Ups: MsgBox ("Incorrect password (protection already exists)")
Worksheets("Instrukcijos").Activate
End Sub


Остался нерешенным следующий вопрос - макрос защищает от редактирования ячейку, где стоит простая ссылка (чтобы ее случайно не стерли) - но нужна необходимость возможности перехода по этой ссылке - как это можно реализовать не снимая защиты?