12

这个 Excel VBA 小函数总是返回 false,没有传入什么字。

Function SpellCheck(SomeWord As String)

SpellCheck = Application.CheckSpelling(SomeWord)

End Function

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

如果拼写正确,我要做的是为每个单词获取一个 T/F 值。

4

5 回答 5

12

就像我在评论中提到的那样,它有效。

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

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

更多编辑

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

从这个链接得到想法

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
于 2012-05-27T18:22:13.013 回答
5

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

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

如果这是您的应用程序中的问题,您要么必须事先筛选出带有代码页之外的字符的文本,要么您可以借用 Word 的拼写检查功能,它没有这个错误,例如像这样(改编自www.vb-tec .de ):

    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 包装器对Windows ScriptingWMIWinAPI更改注册表(然后重新启动 Word)来自动更改语言,但是在启用 UAC 的 Windows 7 上,我遇到了权限问题,这就是我放弃了实验。我只尝试了 WinAPI 路由。

于 2012-11-22T19:20:29.970 回答
1

虽然使用Excel 应用程序对象的错误仍然存​​在,但Application.CheckSpelling方法需要它的 UDF可以从早期绑定静态变量声明中受益。

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

早期绑定加速了 Excel.Application 对象的创建。在 Excel 的 VBA 中使用时,无需使用CreateObject 函数,因为存在参考库。

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

于 2016-03-31T18:56:32.723 回答
0

我打赌你没有

Application.SpellingOptions.DictLang = 1033     
于 2012-05-27T18:44:21.683 回答
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
于 2012-05-27T18:45:02.140 回答