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

这个小小的Excel VBA函数总是返回false,不传什么字。

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

事实上,在IDE中,我可以validationApplication.CheckSpelling(“hello”)失败,但Excel拼写检查器确实检测到拼写错误。

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

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

 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

我testing过了

?Application.CheckSpelling("hello")

在即时窗口中,并返回True

编辑 :从UDF调用Application.CheckSpelling将始终返回False 。 上次我查了一下,还是一个bug,没有办法解决。 如果最近有更新,我不知道。 🙂

更多编辑

这是你的function稍作修改,这将作为一个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 

需要注意的一个缺点是,Application.CheckSpelling将返回True,用于任何在拼写检查所针对的语言的代码页之外具有字符的文本。

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

如果这是你的应用程序的问题,那么你必须事先在代码页之外屏蔽掉字符,或者你可以借用Word的拼写检查function,这个function没有这个bug,比如像这样(改编自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被检查的很好,理论上,您可以提供一个字典文件path作为CheckSpelling函数的参数,以检查任何您使用的字典文件的语言:

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

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

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

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

所以在理论上,你可以自动化语言的变化以及使用VBA包装到Windows脚本 , WMI或WinAPI来更改registry(然后重新启动Word),但是在启用了UAC的Windows 7上,我遇到了权限问题,这是我放弃了这个实验。 我只尝试了WinAPI路线。

尽pipe使用Excel应用程序对象的错误仍然存​​在,但是需要使用Application.CheckSpelling方法的UDF可以从Early Binding和Staticvariables声明中受益。

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

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

在函数退出之后,静态variables声明继续存在于其分配的状态中,并且不会在后续使用UDF时重新进行。 这使得像使用UDF填充长列的情况或作为条件格式化规则中的确定公式更有效。

我敢打赌,你没有这样做

 Application.SpellingOptions.DictLang = 1033 

你对UDF是正确的。 虽然这小jobber帮助。

 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