Проверка орфографии одним словом в функции 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