Word cho phép bạn sử dụng các phông chữ được cài đặt trên hệ thống bạn đang sử dụng. Phông chữ được cài đặt trong Windows để chúng không chỉ có sẵn cho Word mà còn cho tất cả các chương trình được cài đặt trên hệ thống của bạn.

Khi bạn đang tạo một tài liệu trên hệ thống của mình, thật dễ dàng biết được những phông chữ nào đang được sử dụng — danh sách phông chữ được giới hạn cho những phông chữ có sẵn trên hệ thống. Tuy nhiên, nếu bạn nhận được tài liệu từ một người khác, hệ thống của người đó có thể được cài đặt phông chữ khác với bạn. Điều này có nghĩa là tài liệu Word của họ có thể được định dạng bằng các phông chữ mà bạn thậm chí không có trên hệ thống của mình.

Nếu bạn muốn tạo danh sách các phông chữ được sử dụng trong tài liệu (trái ngược với danh sách các phông chữ có sẵn trên hệ thống), bạn có một số lựa chọn. Trước hết, bạn có thể mở tài liệu Word trong trình soạn thảo văn bản và nhìn xung quanh các phần của tài liệu mà bạn thường không thấy trong Word. Gần cuối tệp, bạn sẽ thấy danh sách các phông chữ được sử dụng trong tài liệu. Tuy nhiên, nếu bạn làm điều này, bạn nên hết sức cẩn thận để không thực hiện bất kỳ thay đổi nào đối với tài liệu Word khi nó đang mở trong trình soạn thảo văn bản của bạn. Làm như vậy có thể dễ dàng khiến tài liệu không còn sử dụng được trong Word.

Giải pháp dựa trên Word là chỉ cần xem qua từng ký tự trong tài liệu và kiểm tra phông chữ nào được sử dụng để định dạng ký tự. Phương pháp tiếp cận từng ký tự là cần thiết vì mỗi ký tự có thể được định dạng bằng một phông chữ khác nhau và VBA không cho phép bạn truy cập vào bộ sưu tập phông chữ liên quan đến chính tài liệu — có vẻ như không có bộ sưu tập nào như vậy được duy trì. Như vậy, an toàn nhất (và chậm nhất)

phương pháp là chỉ cần bước qua từng ký tự và tạo danh sách của riêng bạn. Macro VBA sau hoàn thành nhiệm vụ:

Public Sub ListFontsInDoc1()

Dim FontList(199) As String   Dim FontCount As Integer   Dim FontName As String   Dim J As Integer, K As Integer, L As Integer   Dim X As Long, Y As Long   Dim FoundFont As Boolean   Dim rngChar As Range   Dim strFontList As String

FontCount = 0   X = ActiveDocument.Characters.Count   Y = 0   ' For-Next loop through every character   For Each rngChar In ActiveDocument.Characters     Y = Y + 1     FontName = rngChar.Font.Name     StatusBar = Y & ":" & X     ' check if font used for this char already in list     FoundFont = False     For J = 1 To FontCount       If FontList(J) = FontName Then FoundFont = True     Next J     If Not FoundFont Then       FontCount = FontCount + 1       FontList(FontCount) = FontName     End If   Next rngChar

' sort the list   StatusBar = "Sorting Font List"

For J = 1 To FontCount - 1     L = J     For K = J + 1 To FontCount       If FontList(L) > FontList(K) Then L = K     Next K     If J <> L Then       FontName = FontList(J)

FontList(J) = FontList(L)

FontList(L) = FontName     End If   Next J

StatusBar = ""

' put in new document   Documents.Add   Selection.TypeText Text:="There are " & _    FontCount & " fonts used in the document, as follows:"

Selection.TypeParagraph   Selection.TypeParagraph   For J = 1 To FontCount     Selection.TypeText Text:=FontList(J)

Selection.TypeParagraph   Next J End Sub

Rõ ràng, tài liệu của bạn càng dài, macro sẽ càng mất nhiều thời gian để hoàn thành. (Tôi chạy macro trên tài liệu 1.100 trang và mất khoảng 46 phút. Trên tài liệu năm trang, mất chưa đầy một phút.) Khi hoàn tất, macro sẽ tạo một tài liệu mới chứa danh sách được sắp xếp các phông chữ được sử dụng.

Macro trên chỉ bước qua tài liệu chính. Có thể có các phông chữ khác, khác nhau được sử dụng trong các phần tử khác trong tài liệu của bạn. Nếu bạn muốn những yếu tố đó có trong danh sách, thì bạn cần sử dụng một biến thể trên macro có tính đến những yếu tố khác này. Macro sau (ListFontsInDoc2) dài hơn nhiều và danh sách cũng bao gồm ba macro khác được gọi từ bên trong macro chính.

Public Sub ListFontsInDoc2()

Dim rngStory As Word.Range   Dim rngChar As Range   Dim oShp As Word.Shape   Dim FontName As String   Dim lngIndex As Long   Dim lngChar As Long   Dim lngCharCount As Long   Dim colFontsUsed As New Collection   Dim oDocList As Word.Document

For Each rngStory In ActiveDocument.StoryRanges     lngChar = 0     lngCharCount = rngStory.Characters.Count     Do       'Evaluate each character       Set rngChar = rngStory.Characters(1)

If rngStory.End > 1 Then         Do           lngChar = lngChar + 1           FontName = rngChar.Font.Name           StatusBar = "Evaluauting character " & lngChar & _            " of " & lngCharCount & " characters in the story range"

'Check if font used for this character already in list           On Error Resume Next           'Collection key prevents adding fonts already           'in the collection           colFontsUsed.Add rngChar.Font.Name, rngChar.Font.Name           On Error GoTo 0           rngChar.MoveStart wdCharacter, 1           rngChar.MoveEnd wdCharacter, 1           'Set rngChar = rngChar.Next '         Loop Until rngChar.End = rngStory.End       End If

'Evaluate shapes in headers and footers       Select Case rngStory.StoryType         Case 6, 7, 8, 9, 10, 11           'No shape will throw an error that we handle and skip           On Error GoTo Err_Handler           If rngStory.ShapeRange.Count > 0 Then             For Each oShp In rngStory.ShapeRange               If oShp.TextFrame.HasText Then                 lngChar = 0                 lngCharCount = oShp.TextFrame.TextRange.Characters.Count                 For Each rngChar In oShp.TextFrame.TextRange.Characters                   lngChar = lngChar + 1                   FontName = rngChar.Font.Name                   StatusBar = "Evaluauting character " & _                    lngChar & " of " & lngCharCount & _                    " characters in the story range"

On Error Resume Next                   colFontsUsed.Add rngChar.Font.Name, rngChar.Font.Name                   On Error GoTo 0                 Next rngChar               End If             Next oShp           End If         Case Else           'Do Nothing       End Select

SkipRange:

Set rngStory = rngStory.NextStoryRange     Loop Until rngStory Is Nothing   Next rngStory   'Sort the collection.

StatusBar = "Sorting Font List"

Set colFontsUsed = SortCollection(colFontsUsed)

StatusBar = ""

'Create font list document.

Set oDocList = Documents.Add   With oDocList.Range     .Text = "There are " & colFontsUsed.Count & _      " fonts used in the document, as follows:" & vbCr & vbCr     For lngIndex = 1 To colFontsUsed.Count       .InsertAfter colFontsUsed(lngIndex) & vbCr     Next lngIndex   End With   Set oDocList = Nothing   Exit Sub

Err_Handler:

Resume SkipRange End Sub
Public Function SortCollection(ByVal oCol As Collection) As Collection   Dim arrIndex() As Long   Dim lngCount As Long   Dim i As Long   Dim m As Long   Dim oColSorted As New Collection

lngCount = oCol.Count   If lngCount = 0 Then     Set SortCollection = New Collection     Exit Function   End If

'Allocate an index array.

ReDim arrIndex(0 To lngCount - 1) As Long   'Fill the index array.

For i = 0 To lngCount - 1     arrIndex(i) = i + 1   Next i

'Generate an ordered heap   For i = lngCount/2 - 1 To 0 Step -1     Heapify oCol, arrIndex, i, lngCount   Next i

'Sort the index array   For m = lngCount To 2 Step -1     Exchange arrIndex, 0, m - 1     Heapify oCol, arrIndex, 0, m - 1   Next   For i = 0 To lngCount - 1     oColSorted.Add oCol.Item(arrIndex(i))

Next ' fill output collection   Set SortCollection = oColSorted End Function
Private Sub Heapify(oCol As Collection, arrIndexPasssed() As Long, _  lngIndex As Long, lngCount As Long)

Dim lngMidCount As Long   Dim i As Long   lngMidCount = lngCount/2

Do While lngIndex < lngMidCount     i = 2 * lngIndex + 1     If i + 1 < lngCount Then       If oCol.Item(arrIndexPasssed(i)) < oCol.Item(arrIndexPasssed(i + 1)) _        Then i = i + 1     End If     If oCol.Item(arrIndexPasssed(lngIndex)) >= oCol.Item(arrIndexPasssed(i)) _      Then Exit Do     Exchange arrIndexPasssed, lngIndex, i     lngIndex = i   Loop End Sub
Private Sub Exchange(Index() As Long, i As Long, j As Long)

Dim Temp As Long   Temp = Index(i)

Index(i) = Index(j)

Index(j) = Temp End Sub

_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 (1522) á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: