MS Access 2013:通过 VBA 使用 MS Word 的语法检查

Posted

技术标签:

【中文标题】MS Access 2013:通过 VBA 使用 MS Word 的语法检查【英文标题】:MS Access 2013: using MS Word's grammar check via VBA 【发布时间】:2014-06-16 07:26:43 【问题描述】:

(问题下方的解决方案)

我有一个访问表单,允许用户在文本框 (MYFIELD) 中输入文本。当用户退出该字段时,我已经自动设置了拼写检查选项

Private Sub MYFIELD_Exit(Cancel As Integer)
Dim strSpell
    strSpell = MYFIELD
    If IsNull(Len(strSpell)) Or Len(strSpell) = 0 Then
       Exit Sub
    End If
    With MYFIELD
        .SetFocus
        .SelStart = 0
        .SelLength = Len(strSpell)
    End With
    DoCmd.SetWarnings False
    DoCmd.RunCommand acCmdSpelling
    DoCmd.SetWarnings True

End Sub

我还想启用语法检查。因为它不是在 Access 中构建的,所以我需要使用 word 的,但我不知道该怎么做。

我在forum 上找到了这段代码

1) 发布此消息的人说他的用户“将文本输入到一个大控件中。然后将该控件合并到一个 word 文档中”。我的字段只是一个长文本字段,我还能使用(或改编)下面的代码吗?

2) 如果是,我不确定如何将它与我的代码混合使用(尽管我进行了所有搜索-我不熟悉 VBA-,但我不明白如何从我的表单中调用此公共函数):

Public Function SpellIt(ctl As Control)
   Dim wdApp As Word.Application
   Dim wdDoc As Word.Document


    On Error GoTo SpellIt_Err

   Set wdApp = New Word.Application

      If Not IsNull(ctl) Then
         Set wdDoc = wdApp.Documents.Add
         wdApp.Selection.Text = ctl
         wdApp.Dialogs(wdDialogToolsSpellingAndGrammar).Show
         If Len(wdApp.Selection.Text) <> 1 Then
            ctl = wdApp.Selection.Text
         Else
            wdDoc.Close wdDoNotSaveChanges
            wdApp.Quit
            Set wdApp = Nothing
            Exit Function
         End If
         wdDoc.Close wdDoNotSaveChanges
      End If

   wdApp.Quit
   Set wdApp = Nothing

   MsgBox "Spelling and Grammar Check Complete.", vbInformation, "Microsoft Word Spelling And Grammar:"
   Exit Function

SpellIt_Err:
    Err.Clear
    ctl.Undo
    MsgBox "We encountered an error in it's conversation with Microsoft Word regarding your comment." & vbCrLf & _
        "As a precaution, any changes made within the grammar and spelling dialog box have not been retained.", _
        vbCritical, "Spelling and Grammar Check NOT Complete:"
End Function

非常感谢您的帮助!

这里是解决方案:(我需要将ctl更改为ctrl)

Private Sub Description_Exit(Cancel As Integer)
Call SpellIt(Description)
End Sub
Public Function SpellIt(ctrl As Control)
   Dim wdApp As Word.Application
   Dim wdDoc As Word.Document


    On Error GoTo SpellIt_Err

   Set wdApp = New Word.Application

      If Not IsNull(ctrl) Then
         Set wdDoc = wdApp.Documents.Add
         wdApp.Selection.Text = ctrl
         wdApp.Dialogs(wdDialogToolsSpellingAndGrammar).Show
         If Len(wdApp.Selection.Text) <> 1 Then
            ctl = wdApp.Selection.Text
         Else
            wdDoc.Close wdDoNotSaveChanges
            wdApp.Quit
            Set wdApp = Nothing
            Exit Function
         End If
         wdDoc.Close wdDoNotSaveChanges
      End If

   wdApp.Quit
   Set wdApp = Nothing

   MsgBox "Spelling and Grammar Check Complete.", vbInformation, "Microsoft Word Spelling And Grammar:"
   Exit Function

SpellIt_Err:
    Err.Clear
    ctl.Undo
    MsgBox "We encountered an error in it's conversation with Microsoft Word regarding your comment." & vbCrLf & _
        "As a precaution, any changes made within the grammar and spelling dialog box have not been retained.", _
        vbCritical, "Spelling and Grammar Check NOT Complete:"
End Function

【问题讨论】:

只需将函数指向带有文本的控件对象。它将打开 word,在内容 (wdApp.Dialogs) 上运行拼写/语法对话框,然后在完成后关闭。 CheckGrammar 方法,因为它适用于 Application 对象。检查字符串的语法错误。返回一个布尔值以指示字符串是否包含语法错误。如果字符串不包含错误,则为真。 expression.CheckGrammar(String) 表达式 必需。返回 Application 对象的表达式。字符串 必需的字符串。要检查语法错误的字符串。 谢谢博士!你给我一些线索来理解这段晦涩的代码 感谢@bmgh1985 的帮助!我已经更新了上面的代码,尝试“将函数指向带有文本的控制对象”。但是我从 Access 中得到一个错误:“过程声明与具有相同名称的事件或过程的描述不匹配”。你知道我做错了什么吗?如您所见,我是新手,这可能很明显,但我无法弄清楚。谢谢! @bmgh1985 我做了更多的挖掘工作,但我仍然卡住了。我不知道语法检查将如何启动(我试图在退出字段 MYFIELD 时启动它,我想由语法检查器检查)。任何建议将不胜感激!谢谢! 【参考方案1】:

好的,您似乎对函数的实际含义感到困惑。函数的形式为Function(Arguments),并在Sub 中调用。它不作为独立运行,不应被视为独立运行。一个已经可用的例子是MsgBox()。您调用 MsgBox 函数,该函数接受一个参数(在本例中为一个或多个参数)并将其传递给函数,将其转换为您需要的内容。

首先要做的事情。您拥有的文本框称为 MYFIELD。那是你的控制。最好不要让函数具有相同的名称。将其重命名为 Public Function ButChng(ctrl as Control)。函数本身不需要从它原来的样子去触碰。

在您的MYFIELD_Exit 子中,您需要做的就是调用该函数。所以它会这样写:

Private Sub MYFIELD_Exit(Cancel As Integer)
Call ButChng(MYFIELD) 'this puts the MYFIELD control as your variable to go through ButChng
Exit Sub

然后它应该按预期工作。

【讨论】:

好的,我已经删除了 VBA 中的所有内容,并将 MYFIELD 名称更改为 Description 然后我在 Option Compare Database 下输入了代码。我还使用 SpellIt 保留了原始功能,所以我确信我不会把这段代码搞砸。我已经尽我所能做到你所说的(我不确定是否应该删除Public Function 这两个词)但是Access 仍然给我一个错误:子或函数未定义并且SpellIt (Description) 中的高度描述。请查看我的问题(底部)中的更新,了解我编写的代码。知道为什么吗?对不起,我太傻了.. 您似乎遗漏了几行。在SpellIt (Description) 之后,您需要添加End Sub,然后您需要使用Public Function SpellIt(ctrl as Control) 行声明该函数,因为您似乎再次混合了您的Functions 和Subs。这里有一些链接可以帮助您更详细地解释它:excel-easy.com/vba/function-sub.html 和 cpearson.com/excel/writingfunctionsinvba.aspx(我不能高度推荐最后一个站点来学习 VBA 的来龙去脉) 哦,刚刚看到最底部的 Exit Sub。也摆脱它 OK 它做到了,但我仍然收到错误:需要运行时错误 424 对象。 (请参阅突出显示的行tinypic.com/r/j7gbir/8)。这是否与我有一个类文件而不是基本文件这一事实有关? (在你给我的链接中,他们说使用“模块”)。 Module1 是空的,我所有的代码都在 Form_Movie_Form 中。非常感谢您的耐心等待! 另外,我已经更新了我的问题中的代码,以匹配您在上一条评论中要求我执行的操作。

以上是关于MS Access 2013:通过 VBA 使用 MS Word 的语法检查的主要内容,如果未能解决你的问题,请参考以下文章

通过 VBA 在 MS Access 中自动链接/刷新 ODBC 链接表

在列表框 ms-access 2013 VBA 中将多个不同的字段作为列表项返回

MS Outlook 干扰 Access vba 程序

我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码

MS Access:如何找到 VBA 函数的所有用法?

MS Access 2013 从 VBA 调用插入查询并出现奇怪的错误