Скотт ищет способ получить «частотный счет» всех символов в документе. Он хотел бы знать, сколько раз встречается каждый символ, коды ASCII от 9 до 255. Можно использовать Найти и Заменить для определения количества отдельных символов (просто найдите нужный символ и затем замените его самим собой), но такой подход был бы в лучшем случае утомительным, если бы вам нужно было сделать это за 247 разные коды символов, чтобы получить желаемую информацию.

Такая задача должна быть выполнена с помощью макроса, но есть несколько подходов к ней. Один из способов — написать быстрый макрос, который будет проходить по каждому члену коллекции Character, проверять каждый и назначать этот символ одному из ряда счетчиков.

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

Макрос использует массив iCount для накопления счетчиков каждого кода символа, а затем создается новый документ для вывода результатов. (Документ с результатами может быть отформатирован любым желаемым образом.)

Этот подход может хорошо работать для относительно коротких документов, до нескольких страниц. Когда документ становится длиннее, макрос становится медленнее. Зачем?

Потому что по какой-то причине использование коллекции персонажей занимает много времени. Если макрос работает слишком медленно для ваших документов, вы захотите немного изменить его, чтобы он работал только со строками.

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

Обратите внимание, что эта версия макроса помещает весь документ в одну строку sDoc. Затем эту строку можно очень и очень быстро обработать макросом. (На обработку документа из 635 страниц в моей системе потребовалось всего около 30 секунд.) Поскольку эта версия предназначена для работы с более длинными документами, обратите внимание также на то, что некоторые типы переменных были изменены, чтобы отразить вероятность большего количества.

_Примечание: _

Если вы хотите знать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах WordTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / wordribbon-WordTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

WordTips — ваш источник экономичного обучения работе с Microsoft Word.

(Microsoft Word — самая популярная программа для обработки текстов в мире.) Этот совет (411) применим к Microsoft Word 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Word (Word 2007 и позже) здесь:

link: / wordribbon-Character_Frequency_Count [Количество символов].