Ответ на ваш вопрос «Да». Можно защитить только определенные части документа, в то же время защищая другие части, хотя от того, что вы хотите сделать, зависит, насколько это может быть сложно.
Возможно, вы захотите прочитать следующую документацию, чтобы закрепить ваше понимание некоторых ключевых ссылок.
- Объект выбора (документация MSDN)
- Перечисление wdUnits (документация MSDN)
- Метод Document.Protect (документация MSDN)
- Перечисление wdProtectionType (документация MSDN)
- Разрешить изменения частей защищенного документа (показывает шаги пользовательского интерфейса, которые можно использовать для записи макроса)
ПРИМЕЧАНИЕ: Я уверен, что есть более понятный и практичный способ написать это, однако то, что я разработал, работает так, как вы хотите.
Таким образом, с помощью некоторых счетчиков и нескольких операторов if...
я смог заставить работать следующий код.
Единственное, что вы можете сделать, это добавить некоторый код в ваш код Sub Table()
, чтобы переместить курсор в правильное место и снять защиту документа перед добавлением новой таблицы (как будто вы пытаетесь добавить новую таблицу, пока документ защищен, это даст вам ошибку во время выполнения).
Вот что я придумал (я приведу некоторые объяснения под кодом):
Sub TestPartProtect()
Dim i As Long
Dim c As Long
Dim r As Long
Dim t As Long
Dim myCount As Long
Dim myDoc As Object
i = 1
c = 1
r = 1
t = ActiveDocument.Tables.Count
myCount = 1
Set myDoc = ActiveDocument
myRepeat:
If i > t Then GoTo myProtect
mydoc.Tables(i).Cell(r, c).Select
With Selection
If myCount = 1 Then
myCount = myCount + 1
c = c + 1
GoTo myRepeat
ElseIf myCount > 1 Then
Selection.Editors.Add wdEditorEveryone
c = c + 1
myCount = myCount + 1
End If
If c > myDoc.Tables(i).Columns.Count Then
c = 1
r = r + 1
End If
If r > myDoc.Tables(i).Rows.Count Then
r = 1
i = i + 1
myCount = 1
GoTo myRepeat
End If
GoTo myRepeat
End With
myProtect:
myDoc.Protect wdAllowOnlyReading
End Sub
Так сверху донизу; переменные i, c, r, t
и myCount
используются в качестве счетчиков.
i
представляет целое число, которое динамически используется для ссылки на индексы таблиц. Это помогает вашему коду работать более чем с 1 конкретной таблицей без необходимости переписывать ваш код сотни раз. Я объясню дальше, после других.
c
представляет целое число для номера столбца, на который ссылается код.
r
представляет целое число для номера строки, на которую ссылается код.
t
представляет общее количество таблиц в ActiveDocument.
myCount
представляет количество клеток. Каждый раз, когда на ячейку ссылаются, myCount увеличивается.
Более подробно: для каждой ячейки таблицы, если это ячейка (1, 1), она игнорируется и код перемещается в следующую ячейку. От ячейки (1, 2) до ячейки (3, 3), она помещает исключение защиты для ВСЕХ пользователей в ячейку и увеличивает соответствующие счетчики на ходу. Как только c
больше, чем фактическое количество столбцов в таблице, c
сбрасывается в 1, а r
увеличивается на 1. Когда r
больше, чем фактическое количество строк в таблице, оно сбрасывается до 1, i
увеличивается на 1 (готов сослаться на следующую таблицу в документе), а myCount
сбрасывается на 1 (готов начать заново). Если i
больше, чем фактическое количество таблиц в ActiveDocument, тогда код направляется на GoTo Protection
, который затем защищает весь документ только для чтения, кроме исключенных разделов, которые мы только что установили.