Частота символов (Microsoft Word)
Скотт ищет способ получить «частотный счет» всех символов в документе. Он хотел бы знать, сколько раз встречается каждый символ, коды ASCII от 9 до 255. Можно использовать Найти и Заменить для определения количества отдельных символов (просто найдите нужный символ и затем замените его самим собой), но такой подход был бы в лучшем случае утомительным, если бы вам нужно было сделать это за 247 разные коды символов, чтобы получить желаемую информацию.
Такая задача должна быть выполнена с помощью макроса, но есть несколько подходов к ней. Один из способов — написать макрос, который будет проходить по каждому члену коллекции Characters, проверять каждый и назначать этот символ одному из ряда счетчиков.
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 — самая популярная программа для обработки текстов в мире.) Этот совет (112) применим к Microsoft Word 2007, 2010, 2013 и 2016. Вы можете найти версию этого совета для более старого интерфейса меню Word здесь:
link: / word-Character_Frequency_Count [Количество символов]
.