13

几年来,我们已经让这几行代码在我们的应用程序中愉快地运行(以及在 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 中编辑文档而不会出现任何问题。

4

8 回答 8

22

绝望中,即使在博客文章和讨论中寻找答案也与此特定错误相去甚远,似乎 Office 2013 中对 ReadingLayout 的默认处理方式发生了变化。

引入这条线w.ActiveWindow.View.ReadingLayout = False似乎已经解决了我们的问题。

于 2013-07-11T13:17:20.910 回答
4

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

按照本网站上的步骤解决了该问题。

基本上有两个设置要检查:

  • 文件——选项——常规。取消选中“在阅读视图中打开电子邮件附件和其他不可编辑的文件”</li>
  • 文件——选项——信任中心——信任中心设置。选择受保护的视图,然后清除所有复选框。
于 2014-03-11T16:33:41.207 回答
3

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

切换WordApplication.Documents.Open()WordApplication.Documents.Add()解决我的应用程序的问题。

于 2014-04-04T14:11:10.263 回答
2

在我的例子中,这个错误是由内容控件的存在引起的.LockContentControl == true

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

于 2015-04-15T09:21:36.030 回答
2

尝试了上面的大部分建议,但我发现这解决了问题。我们使用密码以只读方式将文档作为模板打开。所以不能使用“添加”

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

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

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

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

于 2018-07-25T09:25:47.110 回答
0

在过去的两天里,这一直发生在我身上(在创建 dotm 模板时),为我解决的问题是创建一个新的 normal.dotx!不知道这是否对其他人有用,但它对我有用!

于 2015-04-03T17:26:08.677 回答
0

打开文档时,指定不应以只读方式打开

object readOnly = false; 
doc = word.Documents.Open(ref path, ref miss, ref readOnly, ...);
于 2016-07-19T11:07:30.423 回答
0

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

对于@CrazyIvan1974,该解决方案的问题在于 Add 创建了一个新文档。如果您在使用添加时指向现有文档,它不会加载该文档,而是使用原始文档作为模板创建一个新文档。这可能会断开模板和加载项的连接,如果您保存原始文件,那真的会让您感到困惑

于 2016-12-05T19:38:24.850 回答