Scott đang tìm cách để có được “tần suất đếm” của tất cả các ký tự trong một tài liệu. Anh ta muốn biết mỗi ký tự, mã ASCII từ 9 đến 255, xảy ra bao nhiêu lần. Có thể sử dụng Tìm và Thay thế để xác định số lượng các ký tự riêng lẻ (chỉ cần tìm kiếm một ký tự được đề cập và sau đó thay thế nó bằng chính nó), nhưng cách tiếp cận như vậy sẽ rất tẻ nhạt, tốt nhất là nếu bạn cần làm điều đó cho 247 mã ký tự khác nhau để có được thông tin mong muốn.

Một nhiệm vụ như vậy phải được thực hiện bằng macro, nhưng có một số cách để tiếp cận nó. Một cách là viết một macro nhanh sẽ đi qua từng thành viên của bộ sưu tập Ký tự, kiểm tra từng ký tự và gán ký tự đó cho một trong số các bộ đếm.

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

Macro sử dụng mảng iCount để tích lũy số lượng của mỗi mã ký tự, sau đó một tài liệu mới được tạo để xuất kết quả. (Tài liệu kết quả có thể được định dạng theo bất kỳ cách nào bạn muốn.)

Cách tiếp cận này có thể hoạt động tốt đối với các tài liệu tương đối ngắn, lên đến một vài trang. Khi tài liệu dài hơn, macro sẽ chậm hơn. Tại sao?

Bởi vì một số lý do để sử dụng bộ sưu tập Nhân vật sẽ mất rất nhiều thời gian. Nếu macro chạy quá chậm đối với tài liệu của bạn, thì bạn sẽ muốn thay đổi nó một chút để nó chỉ hoạt động với chuỗi.

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

Lưu ý rằng phiên bản macro này sẽ nhồi toàn bộ tài liệu vào một chuỗi duy nhất, sDoc. Chuỗi này sau đó có thể được macro xử lý rất rất nhanh. (Một tài liệu dài 635 trang chỉ mất khoảng 30 giây để xử lý trên hệ thống của tôi.) Bởi vì phiên bản này được tạo ra để hoạt động với các tài liệu dài hơn, hãy lưu ý rằng một số loại biến đã được thay đổi để phản ánh khả năng số lượng lớn hơn.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên các trang WordTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

WordTips là nguồn của bạn để đào tạo Microsoft Word hiệu quả về chi phí.

(Microsoft Word là phần mềm xử lý văn bản phổ biến nhất trên thế giới.) Mẹo này (411) áp dụng cho Microsoft Word 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Word (Word 2007 và sau này) tại đây: