【问题标题】:MS Word automation: can't enable red underlines for spelling checkMS Word 自动化:无法为拼写检查启用红色下划线
【发布时间】:2013-06-20 23:42:02
【问题描述】:

我的代码需要在 MS Word 2010 中启用拼写检查,以便用户可以在拼写错误下看到红色下划线。

在当前版本中,我尝试这样做以启用拼写检查:

wordApplication.Options.CheckSpellingAsYouType = true;
wordApplication.Options.SuggestSpellingCorrections = true;
wordApplication.ActiveDocument.ShowSpellingErrors = true;
wordApplication.ActiveDocument.CheckSpelling();

我打开 Word 并输入“测试文本字符串”。在此之后我运行我的代码但没有任何反应:

我在“textxt”下看不到任何下划线。如果我转到选项,我会看到“键入时检查拼写”选项已启用:

现在如果我检查这个属性:

wordApplication.ActiveDocument.SpellingErrors[0].Text

它将包含“textxt”,表示实际检查了拼写。

另外,如果我只是重新启动 MS Word 并输入相同的文本 - 红色下划线变得可见:

我也尝试调用 Application.ScreenRefresh 并设置 ScreenUpdating 属性,但这没有任何效果。

注意:我在开始时运行此代码/宏,此时文档中没有文本。如果有一些文字 - 它可以工作。

注意2:重现的具体步骤:

  1. 启动 MS Word。转到选项并禁用“键入时检查拼写”。重新启动 Word。

  2. 启动 Word 并运行以下宏:

    Options.CheckSpellingAsYouType = true
    Options.SuggestSpellingCorrections = true
    ActiveDocument.ShowSpellingErrors = true
    
  3. 输入以下文本:“测试文本字符串。”。按 Enter。

  4. 运行以下宏

    MsgBox ActiveDocument.SpellingErrors(1).Text

您将在 MessageBox 中看到“textxt”,但看不到红色下划线

【问题讨论】:

  • 这是 VBA 吗? VBA 在行尾不使用分号,最后一行不包含括号。当我进行这些更改并运行这些代码行时,texxt 会带有下划线,并且会弹出一个拼写对话框询问我是否要更改它。运行代码时不会出错?
  • 那是 C#。但是我对 VBA 也有同样的问题。仅当文档包含一些文本但它为空且此宏在我开始输入某些内容时在开头运行时才有效 - 我看不到任何红色下划线。
  • 我不想将此作为答案发布,因为我无法真正重现您所获得的内容。但是,我确实发现运行宏 Word 后仍会自动更正简单的错误。我添加了行 Application.AutoCorrect.ReplaceTextFromSpellingChecker = False 导致出现红线。
  • 您应该会在代码运行后发现,在您对文档进行更改之前,不会进行“键入时”检查。您可能还需要等待,因为它是后台作业。与CheckSpellings调用无关,不会影响显示。
  • @Christina,使用 AutoCorrect.ReplaceTextFromSpellingChecker 操作对我没有帮助

标签: c# vba automation ms-word


【解决方案1】:

偶然发现以下解决方案:如果用户输入一些文本后,我调用以下代码下划线显示:

int iDummy = wordDocument.wordApp.ActiveDocument.SpellingErrors.Count;

【讨论】:

  • 这个解决方案的问题是每次添加新文本后都需要执行这段代码。
【解决方案2】:

由于代表率低,我无法对 Oleg 的回答发表评论,但在此值得注意的是,对于 Word 2013,使用 Application.ActiveDocument.SpellingErrors.Count 方法似乎会删除某些人的当前选择深不可测的原因,这可能是有问题的。

只有在当前未选择文本时才检查Count 来隐藏此效果;例如:

// "document" is a Microsoft.Office.Tools.Word.Document
var selected = document.Application.Selection.Range;
if(Math.Abs(selected.End - selected.Start) == 0)
{
    var count = document.Application.ActiveDocument.SpellingErrors.Count;
}

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2012-08-01
    • 2014-07-20
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2011-05-31
    • 2012-09-30
    相关资源
    最近更新 更多