Esecuzione di macro basate su parole chiave (Microsoft Word)
Eyal si chiede se esiste un modo per eseguire automaticamente una macro se un utente digita una parola o una frase particolare.
Sfortunatamente, non esistono procedure di eventi VBA di Word che rileveranno quando il testo viene digitato in un documento. Tuttavia, Word rileva internamente quando viene immessa una parola completa in modo che possa eseguire operazioni come il controllo ortografico, la correzione automatica e l’aggiornamento del conteggio delle parole. Tuttavia, non è possibile attingere a questo metodo di rilevamento interno.
Probabilmente l’approccio migliore è utilizzare la funzionalità timer di VBA per verificare se è stata inserita una parola. (Ricorda: Word aggiorna internamente il conteggio delle parole ogni volta che una parola viene completata, in modo che il codice del timer possa monitorare il conteggio delle parole per vedere se è cambiato.) Il metodo OnTime ha un’impostazione minima di un secondo, il che significa che il tuo timer- il codice basato può essere eseguito solo una volta al secondo. È possibile che un dattilografo veloce digiti più di una parola al secondo, quindi il tuo codice deve effettivamente controllare le ultime parole inserite.
Ecco il codice che puoi usare:
Dim wCount As Long Dim aRange As Range Dim tWords Dim inactiveSW As Boolean Sub InitializeTimer() tWords = Array("APPLE", "ORANGE", "PEAR") wCount = ActiveDocument.Words.Count Set aRange = Selection.Range aRange.Start = ActiveDocument.Range.Start inactiveSW = False StartTimer End Sub
Public Sub StartTimer() Application.OnTime When:=Now + TimeValue("00:00:01"), _ Name:="TestWords" End Sub
Public Sub TestWords() Dim testWord As String Dim i As Long Dim k As Long Dim kw As Long Dim xc As Long If inactiveSW Then Exit Sub With ActiveDocument xc = .Range.Words.Count - wCount If xc > 0 And xc < 5 Then aRange.End = Selection.End kw = aRange.Words.Count - 1 If kw > 0 Then For k = kw - xc + 1 To kw testWord = UCase(Trim(aRange.Words(k).Text)) For i = 0 To UBound(tWords) If testWord = tWords(i) Then mysub (testWord) Exit For End If Next i Next k End If End If wCount = .Range.Words.Count End With StartTimer End Sub
Public Sub KillOnTime() 'cannot stop the timer so set inactive switch inactiveSW = True End Sub
Sub mysub(s As String) ' this subroutine is executed when a special word is entered MsgBox s End Sub
La prima routine che devi eseguire è la macro InitializeTimer. Imposta le variabili necessarie prima di avviare effettivamente il metodo OnTime. Quindi chiama la macro StartTimer che imposta effettivamente il timer che esegue la macro TestWords.
TestWords controlla se il conteggio delle parole è aumentato e, in caso affermativo, controlla le ultime cinque parole inserite per vedere se corrispondono a una delle tue parole trigger. (Le parole trigger sono impostate nell’array tWords, nella macro InitializeTimer. Devono essere inserite nell’array tutte in maiuscolo.) Se viene rilevata una parola trigger, il tuo codice (mysub) viene eseguito e la parola trigger viene passata al tuo codice.
Va notato che potrebbe essere possibile che il conteggio delle parole salti di più di cinque, in particolare se il testo viene incollato nel documento. Se vuoi che il codice controlli tutte le parole che possono essere incollate nel documento, dovrai cambiare la riga del codice di controllo, che è questa:
If xc > 0 And xc < 5 Then
Tutto quello che devi fare è cambiarlo in questo:
If xc > 0 Then
Se vuoi interrompere il controllo delle parole, esegui la macro KillOnTime, che imposta un flag che impedisce il controllo delle parole. Per riavviare il controllo in un secondo momento, eseguire nuovamente InitializeTimer.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti WordTips), ho preparato una pagina speciale che include informazioni utili.
WordTips è la tua fonte di formazione economica su Microsoft Word.
(Microsoft Word è il software di elaborazione testi più popolare al mondo.) Questo suggerimento (12375) si applica a Microsoft Word 2007, 2010, 2013, 2016, 2019 e Word in Office 365. Puoi trovare una versione di questo suggerimento per vecchia interfaccia del menu di Word qui: