Excel vba: ограничить область редактирования в листе Excel - PullRequest
1 голос
/ 16 декабря 2010

Я хочу ограничить пользователей для редактирования диапазона в листе MS Excel.

Scenario:

  | A | B | C | D | E | F | G | H | I | J | ... IV
-------------------------------------------
1 |   |   |   |   |   |   |   |   |   |   |
-------------------------------------------
2 |   |   |   |   |   |   |   |   |   |   |
-------------------------------------------
3 |   |   |   |   |   |   |   |   |   |   |
-------------------------------------------
4 |   |   |   |   |   |   |   |   |   |   |
-------------------------------------------
...
65536

В приведенной выше таблице пользователь должен иметь доступ для редактирования диапазона от Column A до Column H.Column I to IV пользователи не должны разрешать редактировать текст или что-либо еще.Нет ограничений на количество строк.

Спасибо:)

Ответы [ 5 ]

2 голосов
/ 16 декабря 2010

Чтобы сделать это программно, попробуйте это в модуле (и адаптируйте его под свои потребности):

Sub ProtectAToH()
Dim ws as Worksheet
For each ws In ActiveWorkbook.Worksheets
  ws.Columns("A:H").Locked = False
  ws.Protect Contents:=True, Password:="myPassword"
Next ws
End Sub
2 голосов
/ 16 декабря 2010

В три шага

1) Выберите весь лист.Формат-> Блокировка ячеек-> Снять блокировку для всех ячеек.(По умолчанию все ячейки изначально «заблокированы»)

2) Выберите нужные столбцы блокировки.Формат-> Блокировка ячеек-> Применить блокировку (Это декларативно, вы ничего не блокируете, просто объявляете, что будете блокировать на следующем шаге)

3) Формат-> Защитить рабочую таблицу.(Это вызывает реальную защиту)

Вы сделали.

HTH

0 голосов
/ 23 сентября 2013

Опция c) iDevlop должна быть изменена для предотвращения бесконечного цикла:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("A1:G25")) Is Nothing Then
        If Not Target.Cells.Count > 1 Then                  'Prevent Error on Row Insert or Delete
            If Not Target.Value = "" Then Target.Value = "" 'Prevent infinite loop
        End If
    End If
End Sub

Это по-прежнему позволяет пользователю вставлять копию из нескольких ячеек в указанный вами диапазон пересечений. Не понял, что один.

0 голосов
/ 16 декабря 2010
ActiveSheet.ScrollArea = "$A:$H"

ограничит количество ячеек, которые может выбрать пользователь.

0 голосов
/ 16 декабря 2010

Некоторые альтернативы предложениям sasfrog и belisarius (просто чтобы обогатить ваши варианты):

a) вы также можете просто скрыть столбцы K: IV и защитить лист, чтобы не показывать
б) Используя Инструменты, Защита, параметр «Разрешить пользователям редактировать диапазоны», определите диапазон $ a: $ h как редактируемый без пароля для пользователей, принадлежащих к группе «Все», затем защитите свой лист. Мне нравится этот.

Не забывайте, что любое решение, включающее встроенную защиту Excel, не позволит вашим пользователям вставлять / удалять строки.

c) Использование VBA (не помешает удалению / вставке строк):

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not (Intersect(Target, Range("$h:$iv")) Is Nothing) Then
    Target.Value = ""  'or something else'
  End If
End Sub
...