Добрый день, форумчане! Помогите автоматизировать процесс защиты множества книг. Необходимо защитить паролем (любым, к примеру "123456") определенные ячейки в книгах. Во всех книгах только 1 лист "TDSheet". Защищаем все ячейки в книгах, кроме тех, что: 1) расположены в столбцах от C до Z через один, т.е. C E G I .. Z, И 2) имеют значение формата ТЕКСТ равное "0,00", И 3) цвет фона равен "Нет заливки".
В итоге, в этих ячейках будет предоставлена возможность для занесения данных пользователями.
Добрый день, форумчане! Помогите автоматизировать процесс защиты множества книг. Необходимо защитить паролем (любым, к примеру "123456") определенные ячейки в книгах. Во всех книгах только 1 лист "TDSheet". Защищаем все ячейки в книгах, кроме тех, что: 1) расположены в столбцах от C до Z через один, т.е. C E G I .. Z, И 2) имеют значение формата ТЕКСТ равное "0,00", И 3) цвет фона равен "Нет заливки".
В итоге, в этих ячейках будет предоставлена возможность для занесения данных пользователями.Мурад
В ручном режиме алгоритм следующий: 1. Открываем поиск, указываем формат ячейки С5. Вводим значения для поиска 0,00 2. Нажимаем найти все. Закрываем поиск. 3. Открываем Формат ячеек, переходим на вкладку Защита 4. Снимаем галочку с "Защищаемая ячейка", ОК 5. Выбираем Защиту листа, вводим пароль, ОК.
И все, готово. Вот аналогичные действия скопировать для остальных файлов..
В ручном режиме алгоритм следующий: 1. Открываем поиск, указываем формат ячейки С5. Вводим значения для поиска 0,00 2. Нажимаем найти все. Закрываем поиск. 3. Открываем Формат ячеек, переходим на вкладку Защита 4. Снимаем галочку с "Защищаемая ячейка", ОК 5. Выбираем Защиту листа, вводим пароль, ОК.
И все, готово. Вот аналогичные действия скопировать для остальных файлов..Мурад
Sub d() Dim wb As Workbook Dim r As Range, cell As Range, r1 As Range, c As Range
For Each cell In Selection Set wb = Workbooks.Open(cell.Value)
With wb With wb.Sheets(1) .Cells.Locked = True
Set r = Intersect(.Range("C:C,E:E,G:G,I:I,K:K,M:M,O:O"), .UsedRange) For Each c In r If c.Text = "0,00" And c.Interior.Pattern = xlNone Then If r1 Is Nothing Then Set r1 = c Else Set r1 = Union(r1, c) End If Next r1.Locked = False ' r1.Select .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=123 End With .Close True End With Next End Sub
[/vba]
можно так: [vba]
Код
Sub d() Dim wb As Workbook Dim r As Range, cell As Range, r1 As Range, c As Range
For Each cell In Selection Set wb = Workbooks.Open(cell.Value)
With wb With wb.Sheets(1) .Cells.Locked = True
Set r = Intersect(.Range("C:C,E:E,G:G,I:I,K:K,M:M,O:O"), .UsedRange) For Each c In r If c.Text = "0,00" And c.Interior.Pattern = xlNone Then If r1 Is Nothing Then Set r1 = c Else Set r1 = Union(r1, c) End If Next r1.Locked = False ' r1.Select .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=123 End With .Close True End With Next End Sub
Shylo, Вероятнее всего, Вы не выделили диапазон ячеек, в которых указаны полные адреса книг, по отношению к которым Вы планируете устанавливать защиту. [vba]
Код
For Each cell In Selection
[/vba] Тут макрос подразумевает запуск из книги с перечнем всех книг (а вернее полных адресов книг) в ячейках. Эти ячейки нужно предварительно выделить, а уже после запустит макрос.
Shylo, Вероятнее всего, Вы не выделили диапазон ячеек, в которых указаны полные адреса книг, по отношению к которым Вы планируете устанавливать защиту. [vba]
Код
For Each cell In Selection
[/vba] Тут макрос подразумевает запуск из книги с перечнем всех книг (а вернее полных адресов книг) в ячейках. Эти ячейки нужно предварительно выделить, а уже после запустит макрос.Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Пятница, 01.12.2017, 15:55
SLAVICK, спасибо огромное! По поводу указания списка файлов, где производится защита, есть кусок макроса:
[vba]
Код
'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True) If VarType(avFiles) = vbBoolean Then Exit Sub bPolyBooks = True lCol = 1 Else avFiles = Array(ThisWorkbook.FullName) End If
[/vba]
Вот его встроить бы, и будет макрос-конфетка)
SLAVICK, спасибо огромное! По поводу указания списка файлов, где производится защита, есть кусок макроса:
[vba]
Код
'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True) If VarType(avFiles) = vbBoolean Then Exit Sub bPolyBooks = True lCol = 1 Else avFiles = Array(ThisWorkbook.FullName) End If
[/vba]
Вот его встроить бы, и будет макрос-конфетка)Мурад
Сообщение отредактировал Мурад - Воскресенье, 03.12.2017, 12:42
Sub d() Dim wb As Workbook Dim r As Range, It, r1 As Range, c As Range
avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Âûáîð ôàéëîâ", , True) If VarType(avFiles) = vbBoolean Then Exit Sub
For Each It In avFiles Set wb = Workbooks.Open(It) With wb On Error GoTo errH With wb.Sheets(1) .Cells.Locked = True
Set r = Intersect(.Range("C:C,E:E,G:G,I:I,K:K,M:M,O:O"), .UsedRange) For Each c In r If c.Text = "0,00" And c.Interior.Pattern = xlNone Then If r1 Is Nothing Then Set r1 = c Else Set r1 = Union(r1, c) End If Next r1.Locked = False ' r1.Select .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=123 End With .Close True End With Next MsgBox "Done" Exit Sub errH: MsgBox Err.Number & vbCr & Err.Description End Sub
[/vba] Я для получения списка файлов чаще использую TotalCommander - там быстро и удобно можно отфильтровать и скопировать имена всех файлов в буфер обмена - а потом вставить в к лист.
Sub d() Dim wb As Workbook Dim r As Range, It, r1 As Range, c As Range
avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Âûáîð ôàéëîâ", , True) If VarType(avFiles) = vbBoolean Then Exit Sub
For Each It In avFiles Set wb = Workbooks.Open(It) With wb On Error GoTo errH With wb.Sheets(1) .Cells.Locked = True
Set r = Intersect(.Range("C:C,E:E,G:G,I:I,K:K,M:M,O:O"), .UsedRange) For Each c In r If c.Text = "0,00" And c.Interior.Pattern = xlNone Then If r1 Is Nothing Then Set r1 = c Else Set r1 = Union(r1, c) End If Next r1.Locked = False ' r1.Select .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=123 End With .Close True End With Next MsgBox "Done" Exit Sub errH: MsgBox Err.Number & vbCr & Err.Description End Sub
[/vba] Я для получения списка файлов чаще использую TotalCommander - там быстро и удобно можно отфильтровать и скопировать имена всех файлов в буфер обмена - а потом вставить в к лист.SLAVICK
Воспользовался вначале нижним макросом, не получилось ничего. Затем заменил код на первый вариант со списком файлов на листе. Вышло сообщение об ошибке.
Воспользовался вначале нижним макросом, не получилось ничего. Затем заменил код на первый вариант со списком файлов на листе. Вышло сообщение об ошибке.Мурад
А от куда Вы знаете, что не получилось? Выдало ошибку? У Вас там все выбранные файлы были с заполненными диапазонами? Если не выходит - положите в архив пару файлов, с которыми не срабатывает.
А от куда Вы знаете, что не получилось? Выдало ошибку? У Вас там все выбранные файлы были с заполненными диапазонами? Если не выходит - положите в архив пару файлов, с которыми не срабатывает.SLAVICK