Đếm tần số ký tự (Microsoft Word)
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: