2012-05-27 11 views
10

Questa piccola funzione di Excel VBA restituisce sempre false, non quale parola viene passato.ortografico una sola parola in funzione di Excel

Function SpellCheck(SomeWord As String) 

SpellCheck = Application.CheckSpelling(SomeWord) 

End Function 

Infatti, nell'IDE posso verificare che Application.CheckSpelling ("ciao") non riesce, sebbene il correttore ortografico di Excel rilevi errori di ortografia.

Quello che sto cercando di fare è ottenere un valore T/F per ogni parola, se è stato digitato correttamente.

+0

L'ho appena testato e funziona ... –

+0

Puoi provare a creare una serie di righe e quindi chiamare la funzione dalla colonna adiacente? – WhiskerBiscuit

+0

Sì, è un bug molto vecchio. Se lo usi come UDF, allora non funzionerà :) –

risposta

11

Come ho detto nel mio commento funziona.

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 sarà non corretto o offrire per correggere una parola errata, restituisce solo True o False

ho testato

?Application.CheckSpelling("hello")

nella finestra immediata ed è tornato True

EDIT: Chiamare Application.CheckSpelling da UDF restituire sempre False. L'ultima volta che ho controllato, era ancora un bug e non c'era modo di aggirarlo. Se c'è un recente aggiornamento su questo, non ne sono a conoscenza. :)

altri Cambia

Qui è la vostra funzione leggermente modificato, che funzionerà come un'UDF così :)

avuto l'idea da questo 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 Buono Trova :) –

0

scommetto non ha fatto

Application.SpellingOptions.DictLang = 1033  
0

Sei corretto riguardo l'UDF. Questo piccolo lavoro aiuta comunque.

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

Una trappola a cui fare attenzione è che Application.CheckSpelling tornerà True per qualsiasi testo che ha un carattere di fuori della tabella codici della lingua per la quale si fa il controllo ortografico.

Ad esempio, il controllo n. in inglese restituisce True. Apparentemente Excel non ha ancora (a partire dalla versione 2010) completamente arrivato nel mondo Unicode.

Se questo è un problema nell'applicazione, è necessario schermare il testo con caratteri al di fuori della tabella codici in anticipo, oppure è possibile prendere in prestito la funzione di controllo ortografico di Word, che non ha questo bug, ad esempio come questo (adattato da 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 

Ora Unicode viene controllato bene, e in teoria, è possibile fornire un percorso di file dizionario come parametro alla funzione CheckSpelling per controllare in qualsiasi lingua si ha un file dizionario per:

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

In realtà, tuttavia, il controllo viene eseguito utilizzando il dizionario principale della lingua predefinita (come impostato in File/Opzioni/Lingua) indipendentemente dal dizionario specificato (archiviato in Word 2010, non sono sicuro delle versioni precedenti). È possibile modificare tale impostazione solo manualmente (e riavviare Word per rendere effettiva la modifica).

L'impostazione della lingua predefinita è regolata da una chiave di registro. In Office 2010:

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

Quindi, in teoria, si potrebbe automatizzare il cambio di lingua e utilizzando wrapper VBA per Windows Scripting, WMI o WinAPI per modificare il Registro di sistema (e quindi riavviare Word), ma su Windows 7 con UAC abilitato Mi sono imbattuto in problemi di autorizzazione, ed è qui che ho rinunciato all'esperimento. Ho solo provato la rotta WinAPI però.

1

Mentre il problema che usando l'Excel Application object esiste ancora, un UDF che richiede per il metodo Application.CheckSpelling possono beneficiare Early Binding e una dichiarazione di variabile Static.

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

L'associazione anticipata accelera la creazione dell'oggetto Excel.Application. Se utilizzato all'interno di VBA di Excel, non è necessario utilizzare CreateObject function come la libreria di riferimento esistente.

La dichiarazione di variabile statica continua a esistere nel suo stato assegnato dopo che la funzione è stata chiusa e non è rifusa su utilizzi successivi dell'UDF. Ciò rende situazioni come l'utilizzo dell'UDF per riempire una colonna lunga o come la formula di determinazione in una regola di formattazione condizionale più efficiente.

Problemi correlati