Zeichenfrequenz (Microsoft Word)
Scott sucht nach einer Möglichkeit, eine „Häufigkeitszählung“ aller Zeichen in einem Dokument zu erhalten. Er möchte wissen, wie oft jedes Zeichen, die ASCII-Codes 9 bis 255, vorkommt. Es ist möglich, mithilfe von Suchen und Ersetzen die Anzahl der einzelnen Zeichen zu bestimmen (suchen Sie einfach nach einem fraglichen Zeichen und ersetzen Sie es dann durch sich selbst). Ein solcher Ansatz wäre jedoch bestenfalls mühsam, wenn Sie ihn für 247 ausführen müssten verschiedene Zeichencodes, um die gewünschten Informationen zu erhalten.
Eine solche Aufgabe muss mit einem Makro erledigt werden, es gibt jedoch mehrere Möglichkeiten, sich ihr zu nähern. Eine Möglichkeit besteht darin, ein schnelles Makro zu schreiben, das jedes Mitglied der Zeichensammlung durchläuft, jedes untersucht und dieses Zeichen einem von mehreren Zählern zuweist.
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
Das Makro verwendet das iCount-Array, um die Anzahl der einzelnen Zeichencodes zu akkumulieren. Anschließend wird ein neues Dokument erstellt, um die Ergebnisse auszugeben. (Das Ergebnisdokument kann beliebig formatiert werden.)
Dieser Ansatz eignet sich gut für relativ kurze Dokumente mit bis zu wenigen Seiten. Wenn das Dokument länger wird, wird das Makro langsamer. Warum?
Weil die Verwendung der Characters-Sammlung aus irgendeinem Grund viel Zeit in Anspruch nimmt. Wenn das Makro für Ihre Dokumente zu langsam ausgeführt wird, sollten Sie es ein wenig ändern, damit es nur mit Zeichenfolgen funktioniert.
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
Beachten Sie, dass diese Version des Makros das gesamte Dokument in eine einzige Zeichenfolge, sDoc, stopft. Diese Zeichenfolge kann dann vom Makro sehr, sehr schnell verarbeitet werden. (Die Verarbeitung eines 635-seitigen Dokuments auf meinem System dauerte nur etwa 30 Sekunden.) Da diese Version für längere Dokumente geeignet ist, sollten Sie auch beachten, dass einige der Variablentypen geändert wurden, um die Wahrscheinlichkeit größerer Zählungen widerzuspiegeln.
_Hinweis: _
Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der WordTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.
WordTips ist Ihre Quelle für kostengünstige Microsoft Word-Schulungen.
(Microsoft Word ist die weltweit beliebteste Textverarbeitungssoftware.) Dieser Tipp (411) gilt für Microsoft Word 97, 2000, 2002 und 2003. Sie finden eine Version dieses Tipps für die Multifunktionsleistenschnittstelle von Word (Word 2007) und später) hier: