Conteggio frequenza caratteri (Microsoft Word)
Scott sta cercando un modo per ottenere un “conteggio delle frequenze” di tutti i personaggi in un documento. Vorrebbe sapere quante volte ogni carattere, codici ASCII da 9 a 255, ricorre. È possibile utilizzare Trova e sostituisci per determinare il conteggio dei singoli caratteri (cerca semplicemente un carattere in questione e poi sostituiscilo con se stesso), ma un tale approccio sarebbe noioso, nella migliore delle ipotesi, se fosse necessario farlo per 247 codici di caratteri diversi per ottenere le informazioni desiderate.
Tale attività deve essere eseguita con una macro, ma ci sono diversi modi per affrontarla. Un modo è scrivere una macro che passi attraverso ogni membro della raccolta di caratteri, esaminandoli e assegnando quel carattere a uno dei numerosi contatori.
Sub CountChars1() Dim iCount(0 To 255) As Integer Dim i As Integer Dim vCharacter As Variant Dim sTemp As String ' Initialize the array For i = 0 To 255 iCount(i) = 0 Next i ' Fill the array For Each oCharacter In ActiveDocument.Characters i = Asc(oCharacter) iCount(i) = iCount(i) + 1 Next ' Add document for results Documents.Add Selection.TypeText Text:="ASCII Character Count" & vbCrLf ' Only output codes 9 through 255 For i = 9 To 255 sTemp = Chr(i) If i < 32 Then sTemp = Trim(Str(i)) sTemp = sTemp & Chr(9) & Trim(Str(iCount(i))) sTemp = sTemp & vbCrLf Selection.TypeText Text:=sTemp Next i End Sub
La macro utilizza la matrice iCount per accumulare i conteggi di ogni codice carattere, quindi viene creato un nuovo documento per l’output dei risultati. (Il documento dei risultati può essere formattato nel modo desiderato.)
Questo approccio può funzionare bene per documenti relativamente brevi, fino a poche pagine. Quando il documento si allunga, la macro diventa più lenta. Perché?
Perché per qualche motivo ci vuole molto tempo per usare la raccolta dei personaggi. Se la macro è troppo lenta per i tuoi documenti, allora ti consigliamo di cambiarla un po ‘in modo che funzioni esclusivamente con le stringhe.
Sub CountChars2() Dim iCount(0 To 255) As Long Dim i As Long Dim j as integer Dim lCharCount As Long Dim sDoc As String Dim sTemp As String ' Initialize the array For i = 0 To 255 iCount(i) = 0 Next i ' Assign document to a huge string lCharCount = ActiveDocument.Characters.Count sDoc = ActiveDocument.Range(0, lCharCount) ' Fill the array For i = 1 to Len(sDoc) j = Asc(Mid(sDoc, i, 1)) iCount(j) = iCount(j) + 1 Next ' Add document for results Documents.Add Selection.TypeText Text:="ASCII Character Count" & vbCrLf ' Only output codes 9 through 255 For i = 9 To 255 sTemp = Chr(i) If i < 32 Then sTemp = Trim(Str(i)) sTemp = sTemp & Chr(9) & Trim(Str(iCount(i))) sTemp = sTemp & vbCrLf Selection.TypeText Text:=sTemp Next i End Sub
Si noti che questa versione della macro inserisce l’intero documento in una singola stringa, sDoc. Questa stringa può quindi essere elaborata molto rapidamente dalla macro. (Un documento di 635 pagine ha impiegato solo circa 30 secondi per essere elaborato sul mio sistema.) Poiché questa versione è progettata per funzionare con documenti più lunghi, si noti anche che alcuni tipi di variabili sono stati modificati per riflettere la probabilità di conteggi maggiori.
_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 (112) si applica a Microsoft Word 2007, 2010, 2013 e 2016. Puoi trovare una versione di questo suggerimento per la vecchia interfaccia del menu di Word qui: