12

この小さなExcelVBA関数は、常に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

注意すべき落とし穴の 1 つは、Application.CheckSpelling が、スペルチェックを行う言語のコードページ外の文字を含むテキストに対して True を返すことです。

たとえば、英語でをチェックすると、 True が返されます。どうやら Excel はまだ (バージョン 2010 の時点で) Unicode の世界に完全には到達していません。

それがアプリケーションの問題である場合は、コードページ外の文字を含むテキストを事前に除外するか、Word のスペルチェック機能を借りることができます。これには、このバグはありません。 .):

    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

したがって、理論的には、 Windows ScriptingWMI、またはWinAPIのVBA ラッパーを使用してレジストリを変更する (そして Word を再起動する) ことで、言語の変更を自動化することもできますが、UAC が有効になっている Windows 7 では、アクセス許可の問題が発生しました。私は実験をあきらめた。ただし、WinAPIルートのみを試しました。

于 2012-11-22T19:20:29.970 に答える
1

Excel Application オブジェクトを使用する際のバグは依然として存在しますが、 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 関数を使用する必要はありません。

Static 変数宣言は、関数が終了した後も割り当てられた状態で存在し続け、その後の 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 に答える