2012-05-27 10 views
10

Ten mały Excel VBA funkcja zawsze zwraca wartość false, co nie jest przekazywana w słowo.Spellcheck jedno słowo w funkcji programu Excel

Function SpellCheck(SomeWord As String) 

SpellCheck = Application.CheckSpelling(SomeWord) 

End Function 

W rzeczywistości, w IDE mogę sprawdzić, Application.CheckSpelling („hello”) nie powiedzie się, chociaż moduł sprawdzania pisowni programu Excel wykrywa błędy pisowni.

Co próbuję zrobić, to uzyskać wartość T/F dla każdego słowa, jeśli jest napisane poprawnie.

+0

Właśnie przetestowałem i działa ... –

+0

Czy możesz spróbować zrobić zestaw wierszy, a następnie wywołać funkcję z sąsiedniej kolumny? – WhiskerBiscuit

+0

Tak, to jest bardzo stary błąd. Jeśli użyjesz go jako UDF, to nie zadziała :) –

Odpowiedz

11

Jak wspomniałem w swoim komentarzu, działa.

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 nie będzie poprawne, czy oferta w celu skorygowania błędnie napisane słowo, tylko zwraca True lub False

Testowałem

?Application.CheckSpelling("hello")

w najbliższym oknie i powrócił True

EDIT: Wywołanie Application.CheckSpelling z UDF zawsze zwróci False. Ostatnim razem, kiedy sprawdzałem, wciąż był to błąd i nie było możliwości obejścia tego. Jeśli jest na to ostatnia aktualizacja, to nie jestem tego świadomy. :)

więcej Edytuj

tutaj jest funkcja nieznacznie zmodyfikowane, które będą działać jako UDF jak dobrze :)

wpadł na pomysł z tym 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 
+0

+1 Dobry Znajdź :) –

0

Założę nie wykonano:

Application.SpellingOptions.DictLang = 1033  
0

Masz rację co do UDF. Ten mały pracownik pomaga.

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 
5

Jedna pułapka zwrócić uwagę jest to, że Application.CheckSpelling zwróci true dla dowolnego tekstu, który ma charakter poza kodowej języka, dla którego załatwić pisowni.

Na przykład sprawdzenie w języku angielskim zwróci wartość True. Wygląda na to, że Excel jeszcze nie (od wersji 2010) w pełni dotarł do świata Unicode.

Jeśli to jest problem w aplikacji, trzeba albo do odfiltrowania tekst ze znaków spoza kodowej wcześniej, można też pożyczyć funkcję sprawdzania pisowni wyrazu, który nie ma tego błędu, na przykład tak (dostosowanym z 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 

teraz Unicode sprawdzana jest w porządku, i teoretycznie można zapewnić słownika ścieżkę pliku jako parametr do funkcji CheckSpelling do sprawdzenia w dowolnym języku masz plik słownika dla:

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

W rzeczywistości jednak sprawdzenie odbywa się za pomocą głównego słownika domyślnego języka (zgodnie z ustawieniem w Plik/Opcje/Język), niezależnie od wybranego słownika (zaznaczone w Word 2010, nie wiesz o poprzednich wersjach). Możesz zmienić to ustawienie ręcznie (i musisz ponownie uruchomić program Word, aby zmiana weszła w życie).

Domyślnym językiem jest klucz rejestru. W pakiecie Office 2010:

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

Więc teoretycznie można zautomatyzować zmianę języka, jak również przy użyciu obwolut VBA do Windows Scripting, WMI lub WinAPI zmienić rejestr (a następnie uruchom ponownie program Word), ale na Windows 7 z UAC włączony Wystąpiły problemy z pozwoleniem i właśnie w tym momencie zrezygnowałem z eksperymentu. Próbowałem tylko trasy WinAPI.

1

Choć błąd w użyciu Excel Application object nadal istnieje, UDF, że wymaga to za metody Application.CheckSpelling mogą korzystać z Early Binding i Static deklaracji zmiennej.

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

Początkowe wiązanie przyspiesza tworzenie obiektu Excel.Application. W przypadku użycia w VBA Excela nie ma potrzeby korzystania z CreateObject function, ponieważ istnieje biblioteka referencyjna.

Statyczna deklaracja zmiennych nadal istnieje w przypisanym stanie po wyjściu z funkcji i nie jest przekształcana przy kolejnych użyciach UDF. To sprawia, że ​​sytuacje takie jak użycie UDF do wypełnienia długiej kolumny lub jako formuła określania w warunkowej regule formatowania są bardziej wydajne.

Powiązane problemy