“您不能编辑此选项,因为它受到保护。”但仅限Office 2013以来?

时间:2013-07-11 13:06:35

标签: .net office-interop word-2013

我们已经在我们的应用程序中快乐地运行了这几行代码(在Office,2003,2007和2010等多个版本中)。目的是在Word文档中执行一种邮件合并,用数据库中的名称,地址等替换字段占位符:

    Dim w As Word.Application
    Dim d As Microsoft.Office.Interop.Word.Document = Nothing

...

    Dim f As Microsoft.Office.Interop.Word.Field
    For Each f In d.Fields
        f.Select()
        If fieldName = w.Selection.Text Then
            f.Result.Text = value
        End If
    Next

但是,运行Office 2013的用户在行f.Result.Text = value上报告此错误:

  

System.Runtime.InteropServices.COMException(0x800A17EC):你不是   允许编辑此选择,因为它受到保护。

因此,只有在用户运行Office 2013时才会发生这种情况,而且此错误的联机帮助很少。

文档的任何部分都不受保护,用户可以直接在Word中编辑文档而没有任何问题。

8 个答案:

答案 0 :(得分:20)

无奈之下,甚至在博客文章和远离此特定错误的讨论中搜索答案似乎Office 2013中的更改似乎是对ReadingLayout的默认处理。

引入行w.ActiveWindow.View.ReadingLayout = False似乎解决了我们的问题。

答案 1 :(得分:3)

我们有一些C#自动化在Word 2007/2010中运行良好,但在Word 2013中停止使用相同的“您不被允许...”警告。

按照此site的步骤解决了这个问题。

基本上有两种设置需要检查:

  • 文件 - 选项 - 常规。取消选中“在阅读视图中打开电子邮件附件和其他不可编辑的文件”
  • 文件 - 选项 - 信任中心 - 信任中心设置。选择受保护的视图,然后清除所有复选框。

答案 2 :(得分:2)

您没有指定文档的打开方式,但是通过遵循this question上接受的答案解决了我遇到的问题。

WordApplication.Documents.Open()切换到WordApplication.Documents.Add()解决了我的申请问题。

答案 3 :(得分:1)

在我的情况下,此错误是由.LockContentControl == true的内容控件的存在引起的。

要解决此问题,我构建了一个IEnumerable<ContentControl>内容控件,并将此属性设置为true,并设置.LockContentControl = false。 现在我可以.InsertColumnsRight()没有问题。然后我为我的集合中的所有内容控件恢复.LockContentControl = true

答案 4 :(得分:1)

尝试了以上大多数建议,但我发现此问题得以解决。 我们正在使用密码以只读方式打开文档作为模板。 所以不能使用“添加”

Documents.Open(strTemplateDoc, ReadOnly:=True, PasswordDocument:=strDocPassword, Visible:=False)

将View.Type设置为wdNormalView停止了错误 “不允许您编辑此选择,因为它受到了保护”

wdDocPage.ActiveWindow.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdNormalView

感谢所有其他人的建议-他们提供了很多帮助。

答案 5 :(得分:0)

过去两天(在创建一个dotm模板时)我发生了这种情况,而为我修复的是创建一个新的normal.dotx!不知道这是否适用于其他人,但它确实适合我!

答案 6 :(得分:0)

当您打开文档时,请指定它不应以只读方式打开

object readOnly = false; 
doc = word.Documents.Open(ref path, ref miss, ref readOnly, ...);

答案 7 :(得分:0)

对我来说,问题类似于Tim Dols的回答,但我需要解锁内容控件的内容,即LockContents属性: mycontentcontrol.LockContents = False

对于@ CrazyIvan1974,该解决方案的问题是Add创建了一个新文档。如果在使用“添加”时指向现有文档,则不会加载文档,而是使用原始文档作为模板创建新文档。这可以断开模板和插件的连接,如果你保存原始的

,真的搞砸了你