拼写检查Excel函数中的单个单词

时间:2012-05-27 18:16:42

标签: excel vba spell-checking

这个小的Excel VBA函数总是返回false,没有传入任何单词。

Function SpellCheck(SomeWord As String)

SpellCheck = Application.CheckSpelling(SomeWord)

End Function

事实上,在IDE中,我可以验证Application.CheckSpelling(“hello”)是否失败,尽管Excel拼写检查程序确实检测到拼写错误。

我正在尝试的是,如果拼写正确,我会为每个单词获取T / F值。

5 个答案:

答案 0 :(得分:11)

就像我在评论中提到的那样。

Option Explicit

Sub Sample()
    MsgBox SpellCheck("hello") '<~~ Returns True
    MsgBox SpellCheck("daasd") '<~~ Returns False
End Sub

Function SpellCheck(SomeWord As String) As Boolean
    SpellCheck = Application.CheckSpelling(SomeWord)
End Function

Application.CheckSpelling无法更正或提供更正拼写错误的字词,它只返回TrueFalse

我测试了

?Application.CheckSpelling("hello")

在即时窗口中,它返回True

编辑:从UDF调用Application.CheckSpelling将始终返回False。上次我检查时,它仍然是一个错误,没有办法解决它。如果有最近的更新,那么我不知道它。 :)

更多编辑

这是稍微修改过的函数,它也可以用作UDF:)

link

获得了这个想法
Function SpellCheck(rng As Range) As Boolean
    Dim oxlAp As Object
    Set oxlAp = CreateObject("Excel.Application")
    SpellCheck = oxlAp.CheckSpelling(rng.Value)
    oxlAp.Quit
    Set oxlAp = Nothing
End Function

答案 1 :(得分:5)

值得注意的一个缺陷是Application.CheckSpelling将为任何具有您执行拼写检查的语言代码页之外的字符的文本返回True。

例如,用英语检查会返回True。显然Excel还没有(截至2010年)完全进入Unicode世界。

如果您的应用程序出现问题,您必须事先在代码页外部使用字符筛选文本,或者您可以借用Word的拼写检查功能,该功能没有此错误,例如这样(改编自{{ 3}}):

    Public Function CheckSpellingWd( _
            ByRef Text As String, _
            Optional ByVal IgnoreUpperCase As Boolean = False, _
            Optional ByVal ReUse As Boolean = True _
        ) As Boolean

        'Reuse Word object on next call
        Static wd As Word.Application

        If Len(Text) > 0 Then
            'create Word object on first call
            If wd Is Nothing Then
            Set wd = New Word.Application
            wd.DisplayAlerts = wdAlertsNone
            End If

            'Do spellcheck
            CheckSpellingWd = wd.CheckSpelling(Text, , IgnoreUpperCase)
        Else
            'Return True on empty string
            CheckSpellingWd = True
        End If
    End Function

现在可以很好地检查Unicode,理论上,您可以提供字典文件路径作为CheckSpelling函数的参数,以检查您拥有字典文件的任何语言:

Application.CheckSpelling(Word, CustomDictionary, IgnoreUppercase, MainDictionary, _
    CustomDictionary2, CustomDictionary3, CustomDictionary4, CustomDictionary5, _
    CustomDictionary6, CustomDictionary7, CustomDictionary8, CustomDictionary9, _
    CustomDictionary10)

实际上,无论您指定的字典是什么,都使用默认语言的主词典(在文件/选项/语言中设置)完成检查(在Word 2010中检查,不确定以前的版本)。您只能手动更改该设置(并且必须重新启动Word才能使更改生效)。

默认语言设置由注册表项控制。在Office 2010中:

HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\LanguageResources\InstallLanguage

理论上,您可以使用VBA包装器自动执行语言更改www.vb-tec.deWindows ScriptingWMI以更改注册表(然后重新启动Word),但在Windows上7启用了UAC我遇到了权限问题,这就是我放弃实验的地方。我只尝试过WinAPI路线。

答案 2 :(得分:1)

虽然使用Excel Application object的错误仍然存​​在,但需要Application.CheckSpelling方法的UDF可以从Early BindingStatic变量声明中受益。

Function spellCheck(str As String) As Boolean
    Static xlApp As New Excel.Application
    spellCheck = xlApp.CheckSpelling(str)
End Function

早期绑定可加快Excel.Application对象的创建速度。在Excel的VBA中使用时,不需要使用CreateObject function作为参考库。

静态变量声明在退出函数后继续以指定的状态存在,并且在后续使用UDF时不会重新生成。这使得使用UDF填充长列或作为条件格式设置规则中的确定公式更有效的情况。

答案 3 :(得分:0)

我打赌你没有做到

Application.SpellingOptions.DictLang = 1033     

答案 4 :(得分:0)

你对UDF是正确的。这个小工作者虽然有所帮助。

Sub SpellCheckColumn()
    Dim rRng As Range

    Set rRng = Range("A1", Range("A" & Rows.Count).End(xlUp))

    For Each rCell In rRng
    If Not Application.CheckSpelling(rCell) Then
        rCell.Offset(, 1) = "Checkspell Error"
    Next rCell
End Sub