2015-10-23 67 views
7

我想使用Office 2007 VBA的Document.Protect自動完成保護Word文檔的註釋過程。如果文檔沒有任何保護,這可以正常工作,但一旦保護之前已經設置,就會失敗。VBA Document.Protect未設置wdProtectionType(Office 2007)

以下是一個最小的工作示例,顯示了我正面臨的錯誤(請參閱下文)。我在另一臺運行Office 2007 SP3的PC上進行了複製。即使使用空白文檔也會出現問題。

複製,使用下面的宏保存新的空白文檔後:

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 

以前的事情調查:

  • 的Office 2007是最新的,與SP 3和最新的Windows更新
  • 如果手動執行保護類型可以正確更改,但由於宏記錄失敗而記錄。
  • 其他類型保存文檔(Document.Save或Document.SaveAs(2))
  • 禁用ReadingLayout ActiveWindow.View.ReadingLayout = False(見Alredo的答案)的:

    :在Office 2007

編輯無變化

  • 2015-10-23:初始問題
  • 2015-10-25:添加了最小工作示例。
  • 2015-10-25:發現只有在手動或以編程方式設置保護類型後,才能更改該保護類型。
  • 2015年10月26日:提供的賞金
+0

我做了幾個讀數檢查保護功能,但你似乎把它做好...而且你的代碼對我來說工作正常......我只會建議你使用一個對象來更好地控制引用,因爲'ActiveDocument'可以在運行時輕鬆更改。 – R3uK

+0

感謝您的幫助!它適合你嗎?哪個Office版本? –

+0

2010 64位,工作就像一個魅力...當我重試一個受保護的文件,並得到一個錯誤消息說這是不可能的,所以我不能理解你的問題可以在哪裏... – R3uK

回答

2

在網上做了一些研究之後,代碼失敗對我好幾次。我發現一篇文章解決了我的問題,這是因爲Word在閱讀視圖中打開了安全文檔。

這是原帖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 and oDoc.ActiveWindow.View.ReadingLayout)oDoc.ActiveWindow.View.ReadingLayout = False –

+0

不幸的是,這個答案在Office 2007下無效。 –