Проверка орфографии одним словом в функции Excel
Эта небольшая функция Excel VBA всегда возвращает false, не имеет никакого слова.
Function SpellCheck(SomeWord As String)
SpellCheck = Application.CheckSpelling(SomeWord)
End Function
Фактически, в среде IDE я могу проверить, что Application.CheckSpelling( "привет" ) не удается, хотя средство проверки орфографии Excel обнаруживает ошибки.
То, что я пытаюсь сделать, это получить значение T/F для каждого слова, если оно написано правильно.
Ответы
Ответ 1
Как я уже упоминал в своем комментарии, он работает.
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
EDIT. Вызов 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
Ответ 2
Одна ошибка, на которую следует обратить внимание, заключается в том, что Application.CheckSpelling вернет True для любого текста, который имеет символ за пределами кодовой страницы языка, для которого вы выполняете проверку орфографии.
Например, проверка nő на английском языке возвращает 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 Scripting, WMI или WinAPI, чтобы изменить реестр (а затем перезапустить Word), но в Windows 7 с UAC включен Я столкнулся с проблемами разрешения, и именно здесь я отказался от эксперимента. Я только пробовал маршрут WinAPI, хотя.
Ответ 3
Пока ошибка в использовании объекта приложения Excel по-прежнему существует, UDF, требующий его для Application.CheckSpelling может извлечь выгоду из Early Binding и Статическое объявление.
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 для заполнения длинного столбца или в качестве формулы определения в условном правиле форматирования более эффективным.
Ответ 4
Готов поспорить, что вы не делали
Application.SpellingOptions.DictLang = 1033
Ответ 5
Вы правы в 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