Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

word equivalente di worksheet_change

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

word equivalente di worksheet_change

Postdi wallace&gromit » 07/08/17 09:17

Ciao, vorrei eseguire una macro che parte ad ogni digitazione in word, qualcosa di analogo alla worksheet_change di excel.
In pratica mi serve un contatore del numero di battute (non solo delle parole, come già integrato in word).
Con questa macro ottengo ciò che voglio, aprendo una userform "NumerBattute" con la textbox "contatore" che riporta il dato:
Codice: Seleziona tutto
Sub ContaBattute()
tot = Application.ActiveDocument.Characters.Count
tot1 = Application.ActiveDocument.Paragraphs.Count
NumeroBattute.Show vbModeless
NumeroBattute.Contatore = tot - tot1
End Sub

Però per ottenerla devo lanciare ogni volta la macro, mentre io vorrei che si aggiornasse automaticamente, vedendo il contatore incrementare ad ogni battuta inserita. Si può fare?
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Sponsor
 

Re: word equivalente di worksheet_change

Postdi Anthony47 » 07/08/17 11:16

Per quello che ne so non esiste un evento cui potersi agganciare.
Pero' nella barra di stato di Word puoi gia' leggere il contatore di Parole (1); fai click sul valore visualizzato e potrai vedere altre statistiche (2) tra cui il numero di caratteri.
Immagine

Se non vedi il contatore di parole, tasto dx sulla barra di stato e personalizza.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17650
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: word equivalente di worksheet_change

Postdi wallace&gromit » 07/08/17 13:31

Ciao Anthony,
magari ci si può agganciare alla pressione della barra spaziatrice o al limite del punto?
Questo sarebbe sufficiente, visto che il conteggio deve comunque essere fatto alla fine delle parole o, al limite, delle frasi.

Il conteggio delle parole non è sufficiente quando servono il numero di battute (visto che le parole hanno lunghezze variabili), la finestra con il conteggio più approfondito la posso aprire anche direttamente con un'apposita icona, ma non posso averla in modalità modeless e continuare a scrivere, vedendola aggiornare.
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: word equivalente di worksheet_change

Postdi peppo55 » 07/08/17 14:33

Ciao wallace&gromit,

nella scheda Revisione c’è il comando Conteggio parole. Puoi attivarlo usando i tasti Alt + R + T .
per chiudere l’Userform premi Esc.

Credo sia più comodo (non è detto che la scheda Revisione sia attiva) aggiungere il comando conteggio parole alla Barra di Accesso rapido. Usa i tasti Alt + 4

peppo
peppo

Excel 2010
peppo55
Utente Senior
 
Post: 167
Iscritto il: 30/09/12 13:51

Re: word equivalente di worksheet_change

Postdi wallace&gromit » 07/08/17 14:56

Ciao Peppo, mi servono le battute (tutti i caratteri, compresi spazi e punteggiatura, esclusi segni di paragrafo), non le parole.
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: word equivalente di worksheet_change

Postdi patel » 07/08/17 17:39

patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: word equivalente di worksheet_change

Postdi wallace&gromit » 08/08/17 08:32

Ciao Patel, grazie per l'indicazione, ma stiamo entrando di prepotenza in un campo di mia totale ignoranza.
Ho provato a fare questo:
Ho creato un modulo di classe e l'ho chiamato EventClassModule
In quel modulo ho selezionato "App" e ho inserito l'evento DocumentChange (una sub vuota per il momento)
Ho aperto un nuovo modulo normale e ho inserito queste istruzioni:
Codice: Seleziona tutto
Dim X As New EventClassModule
Sub Register_Event_Handler()
 Set X.App = Word.Application
End Sub

Ho lanciato questa macro... e non ho riscontrato niente di particolare (ma non me l'aspettavo nemmeno).
Ora ho inserito nella sub DocumentChange il testo:
MsgBox "ciao"
Mi aspettavo che ad ogni modifica nel documento mi apparisse la box, invece, o il mio word è particolarmente maleducato e non saluta mai oppure ho sbagliato qualcosa (propendo per la seconda).
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: word equivalente di worksheet_change

Postdi patel » 08/08/17 10:28

Le classi non rientrano nel mio sapere, però con questa imbeccata Anthony potrebbe essere in grado di aiutarti
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: word equivalente di worksheet_change

Postdi wallace&gromit » 08/08/17 14:33

Haha, risolto l'enigma: document change significa cambiare da un doc all'altro, aprendo un nuovo file, word mi ha salutato!
Ora devo solo trovare se esiste il comando modifica documento.

Edit: mah, per ora il meglio che trovo è DocumentBeforeSave
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: word equivalente di worksheet_change

Postdi Anthony47 » 09/08/17 07:31

Le classi non rientrano nel mio sapere, però con questa imbeccata Anthony potrebbe essere in grado di aiutarti
Eh eh, Anthony e' in viaggio e a mala pena legge le domande, figurarsi se riesce a fare prove...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17650
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: word equivalente di worksheet_change

Postdi patel » 09/08/17 09:48

allora buone vacanze !
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: word equivalente di worksheet_change

Postdi Anthony47 » 15/08/17 21:05

Finite le (mie) vacanze riprendo questa discussione anche se penso che per W&G quanto avete fatto sia gia' sufficiente, e propongo una ipotesi basata su una OnTime, seguendo il seguente approccio:
-Inserire nel progetto Normal una sub che si riesegue periodicamente con OnTime
-Questa Sub ontime viene avviata all'apertura del documento da monitorare
-I dati statistici vengono presentati su una userform

Quindi il progetto "Normal" dovra' includere:
-una userform che ho chiamato InfoForm (1)
-il modulo che ho chiamato ModuloTimed, con la sub che si esegue ontime (2)
Immagine

Il codice della sub ontime:
Codice: Seleziona tutto
Sub Timed()
Dim myNext As Date, toMonitor As String
Dim cIPPa As Object, CippaYes As Boolean, CE As Document
'
Debug.Print ""
toMonitor = "Proto_Timed.docm"          '<<< Il nome del Documento cui associare questa gestione
On Error Resume Next
    Debug.Print ActiveDocument.Name
    Set CE = Documents(toMonitor)
On Error GoTo 0
If CE Is Nothing Then
'il Doc da monitorare non e' aperto:
    Unload InfoForm
    Exit Sub
End If
For Each cIPPa In UserForms
    If cIPPa.Name = "InfoForm" Then
        CippaYes = True
        Exit For
    End If
Next cIPPa
If Not CippaYes Then
    InfoForm.Show vbModeless
    InfoForm.Left = ActiveWindow.Width - InfoForm.Width - 20
End If
myNext = Now + TimeValue("00:00:02")
Application.OnTime myNext, "Timed"
Debug.Print "ReTimed", Now
If ActiveDocument.Name = toMonitor Then
    Debug.Print ">>> Run", Now
    InfoForm.Label2.Caption = ActiveDocument.Range.ComputeStatistics(wdStatisticWords)
    InfoForm.Label4.Caption = ActiveDocument.Range.ComputeStatistics(wdStatisticCharacters)
    InfoForm.Label6.Caption = ActiveDocument.Range.ComputeStatistics(wdStatisticParagraphs)
    InfoForm.Label7.Caption = Format(Now, "hh:mm:ss")
End If
'
End Sub

L'istruzione marcata <<< va personalizzata come da commento

ModuloTimed e il suo contenuto puo' essere generato scaricando questo file e poi, dal progetto Normal, facendo Menu /File /Importa file
https://www.dropbox.com/s/bi5008yva1car ... d.bas?dl=0

Per generare la userform scaricare questi due file e poi importare il file InfoForm.frm
https://www.dropbox.com/s/corjbhodcsmea ... m.frm?dl=0
https://www.dropbox.com/s/104ck3cfka7s0 ... m.frx?dl=0

Il documento da monitorare e' opportuno che contenga, nel modulo ThisDocument
Codice: Seleziona tutto
Private Sub Document_Open()
Debug.Print "Aperto:", ThisDocument.Name, Now
Call Normal.ModuloTimed.Timed
End Sub

Private Sub Document_Close()     'solo per debug
    Debug.Print "Chiuso:", ActiveDocument.Name, Now
    Beep
End Sub

Questo avviera' la Sub Timed e la relativa form appena si apre il documento.

La Sub Document_Close come pure tutte le righe Debug.Print sono solo per debug; quindi possono essere eliminate.

Con tutto questo ambaradan, quando il documento da monitorare verra' aperto si attiveranno la userform e la Sub Timed, che si ripetera' ogni 2 secondi (la frequenza puo' essere ovviamente modificata nel codice); sulla form sono riportati alcuni dati statistici relativi alla lunghezza del documento monitorato.

Spero che sia di qualche utilita'...
Avatar utente
Anthony47
Moderatore
 
Post: 17650
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: word equivalente di worksheet_change

Postdi wallace&gromit » 16/08/17 15:09

So che questo non è molto gentile da dire ma:
BENTORNATO DALLE VACANZE!!!

Quanto fatto finora mi soddisfaceva solo parzialmente, invece così funziona benissimo. Ho solo dovuto inserire wdStatisticCharactersWithSpaces al posto di quello senza spazi e ottengo esattamente quello che volevo.

Mi rimane un solo desiderio: sarebbe bello non dovere specificare il nome del file in normal, ma passarlo con la chiamata di routine dal file da monitorare. Così ogni file creato a partire da un modello contenente la macro Document_Open attiva questa visualizzazione.
Ho provato semplicemente a impostare un argomento ma mostra la userform corretta solo all'apertura e poi non si aggiorna (con il messaggio: "argomento non facoltativo")

Codice: Seleziona tutto
Private Sub Document_Open()
Debug.Print "Aperto:", ThisDocument.Name, Now
toMonitor = ThisDocument.Name
Call Normal.ModuloTimed.Timed(toMonitor)
End Sub


Codice: Seleziona tutto
Sub Timed(toMonitor)
Dim myNext As Date ', toMonitor As String
Dim cIPPa As Object, CippaYes As Boolean, CE As Document
'
Debug.Print ""
'toMonitor = "macro conta battute.docm"          '<<< Il nome del Documento cui associare questa gestione
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: word equivalente di worksheet_change

Postdi Anthony47 » 16/08/17 23:04

Fortunatamente posso permettermi di evitare le ferie a Ferragosto...

Per quanto riguarda sganciare Sub Timed da un documento predichiarato, bisogna inserire una variabile visibile anche dal modulo ThisDocument e persistente; quindi:
In ModuloTimed
Codice: Seleziona tutto
Public ToMonitor As String    'RIGOROSAMENTE IN TESTA
Sub Timed()
Dim myNext As Date   '', ToMonitor As String
Dim cIPPa As Object, CippaYes As Boolean, CE As Document
'
'etc etc

In ognuno dei ThisDocument interessati:
Codice: Seleziona tutto
Private Sub Document_Open()
Debug.Print "Aperto:", ThisDocument.Name, Now
tomonitor = ThisDocument.Name    'AGGIUNTA
Call Normal.ModuloTimed.Timed
End Sub

C'e' tuttavia il vincolo che puo' essere gestito un solo documento alla volta; se non e' accettabile ne parliamo.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17650
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: word equivalente di worksheet_change

Postdi wallace&gromit » 17/08/17 16:02

Direi che è perfetto così: la gestione di due documenti non è richiesta.
La possibilità di lavorare sul documento e vedere aggiornato il numero di caratteri in questo modo funziona ottimamente.
Ancora una volta grazie mille Anthony e... alla prossima!
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21


Torna a Applicazioni Office Windows


Topic correlati a "word equivalente di worksheet_change":


Chi c’è in linea

Visitano il forum: Nessuno e 47 ospiti