这个小的Excel VBA函数总是返回false,没有传入任何单词。
Function SpellCheck(SomeWord As String)
SpellCheck = Application.CheckSpelling(SomeWord)
End Function
事实上,在IDE中,我可以验证Application.CheckSpelling(“hello”)是否失败,尽管Excel拼写检查程序确实检测到拼写错误。
我正在尝试的是,如果拼写正确,我会为每个单词获取T / F值。
答案 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
无法更正或提供更正拼写错误的字词,它只返回True
或False
我测试了
?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。
例如,用英语检查nő会返回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.de,Windows Scripting或WMI以更改注册表(然后重新启动Word),但在Windows上7启用了UAC我遇到了权限问题,这就是我放弃实验的地方。我只尝试过WinAPI路线。
答案 2 :(得分:1)
虽然使用Excel Application object的错误仍然存在,但需要Application.CheckSpelling方法的UDF可以从Early Binding和Static变量声明中受益。
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