2015-10-23 6 views
7

Я хотел бы автоматизировать процесс защиты текстового документа для комментариев только с помощью документа Office 2007. VBA's Document.Protect. Это прекрасно работает, если документ еще не защищен, но не работает, как только защита была ранее установлена.VBA Document.Protect not setting wdProtectionType (Office 2007)

Ниже приведен минимальный рабочий пример, показывающий ошибку, с которой я сталкиваюсь (см. Ниже). Я воспроизведен на другом ПК с пакетом обновления 3 (SP3) для Office 2007. Проблема возникает даже при использовании пустого документа.

Для воспроизведения используйте следующий макрос после сохранения нового документа:

Sub ProtectionBugOffice2007() 

    ' Apply a first type of locking to simulate an existing lock 
    RecentFiles(1).Open 
    If ActiveDocument.ProtectionType <> wdNoProtection Then ActiveDocument.Unprotect 
    ActiveDocument.Protect wdAllowOnlyFormFields 
    ActiveDocument.Close (wdSaveChanges) 

    ' Now do the real test: Lock with our intended protection type 
    RecentFiles(1).Open 
    ActiveDocument.Unprotect 
    ActiveDocument.Protect wdAllowOnlyComments 
    ActiveDocument.Close (wdSaveChanges) 

    ' Validate! 
    RecentFiles(1).Open 
    If ActiveDocument.ProtectionType = wdAllowOnlyComments Then 
     MsgBox "Success!" 
    Else 
     MsgBox "Failure! Should be " & wdAllowOnlyComments & " but is " & ActiveDocument.ProtectionType 
    End If 
    ActiveDocument.Close 

End Sub 

Things исследованные перед:

  • Office 2007 до настоящего времени с SP 3 и последние окна обновления
  • Если выполненный вручную тип защиты может быть изменен правильно, но записан как макрос, сбой.
  • Другие виды сохранения документа (Document.Save или Document.SaveAs (2))
  • Отключение ReadingLayout ActiveWindow.View.ReadingLayout = False (см ответ Alredo в): Никаких изменений в офисе 2007

правок:

  • 2015-10-23: начальная проблема
  • 2015-10-25: Добавлен минимальный рабочий пример.
  • 2015-10-25: Обнаружено, что только после ручной или программной настройки типа защиты его больше нельзя изменять.
  • 2015-10-26: Предлагаемая Баунти
+0

я сделал несколько чтений, чтобы проверить функцию защиты, но вы, кажется, делает это хорошо ... И ваш код отлично работает для меня ... Я бы предположил, что вы использовали объект для лучшего контроля над ссылками, поскольку «ActiveDocument» может легко изменяться во время выполнения. – R3uK

+0

Спасибо за вашу помощь! Это работает для вас? В какой версии Office? –

+0

2010 64bit, работает как шарм ... И когда я повторил на защищенном документе и получил сообщение об ошибке, говорящее, что это невозможно, поэтому я не могу понять, где может быть ваша проблема ... – R3uK

ответ

2

После выполнения некоторых исследований в Интернете и коды неудачи на меня несколько раз. Я нашел сообщение, которое решило мою проблему, которая была вызвана тем, что слово открывает защищенные документы при чтении.

Это ссылка на исходное сообщение Link to post

Sub ProtectionBugOffice2007() 

    Dim oDoc As Document 

    ' Apply a first type of locking to simulate an existing lock 
    Set oDoc = OpenRecentNotReadOnly 

    If oDoc.ProtectionType <> wdNoProtection Then oDoc.Unprotect 
    oDoc.Protect wdAllowOnlyFormFields 
    oDoc.Close (wdSaveChanges) 

    ' Now do the real test: Lock with our intended protection type 
    Set oDoc = OpenRecentNotReadOnly 
    oDoc.Unprotect 
    oDoc.Protect wdAllowOnlyComments 
    oDoc.Close (wdSaveChanges) 

    ' Validate! 
    Set oDoc = OpenRecentNotReadOnly 
    If oDoc.ProtectionType = wdAllowOnlyComments Then 
     MsgBox "Success!" 
    Else 
     MsgBox "Failure! Should be " & wdAllowOnlyComments & " but is " & oDoc.ProtectionType 
    End If 
    oDoc.Close 

End Sub 

' Function to open the document not in read only. 
Function OpenRecentNotReadOnly() As Document 

    Dim ret As Document 

    Set ret = RecentFiles(1).Open 
    ActiveWindow.View.ReadingLayout = False 

    'Return the value 
    Set OpenRecentNotReadOnly = ret 
End Function 

Я надеюсь, что это помогает :)

+0

Я вижу, как это может быть проблемой, но я отключил возможность открытия в макете чтения и улучшен код образца. Еще проблема для меня (офис 2007). '\t if (oDoc.ActiveWindow и oDoc.ActiveWindow.View.ReadingLayout) oDoc.ActiveWindow.View.ReadingLayout = False –

+0

К сожалению, этот ответ не помогает в Office 2007. –