Создание списка шрифтов документа (Microsoft Word)
Word позволяет использовать шрифты, установленные в используемой вами системе. Шрифты устанавливаются в Windows, поэтому они доступны не только для Word, но и для всех программ, установленных в вашей системе.
Когда вы создаете документ в своей системе, легко узнать, какие шрифты используются — список шрифтов ограничен теми, которые доступны в системе. Однако, если вы получаете документ от другого человека, в его системе могут быть установлены шрифты, отличные от ваших. Это означает, что их документ Word может быть отформатирован с использованием шрифтов, которых у вас даже нет в вашей системе.
Если вы хотите создать список шрифтов, используемых в документе (в отличие от списка шрифтов, доступных в системе), у вас есть несколько вариантов. Прежде всего, вы можете открыть документ Word в текстовом редакторе и просмотреть те части документа, которые обычно не отображаются в Word. Ближе к концу файла вы должны увидеть список шрифтов, используемых в документе. Однако если вы это сделаете, вы должны быть очень осторожны, чтобы не вносить никаких изменений в документ Word, пока он открыт в вашем текстовом редакторе. Это может легко сделать документ непригодным для использования в Word.
Решение на основе Word — просто просмотреть каждый символ в документе и проверить, какой шрифт используется для форматирования символа. Посимвольный подход необходим, потому что каждый символ может быть отформатирован с помощью другого шрифта, а VBA не позволяет вам получить доступ к коллекции шрифтов по отношению к самому документу — похоже, что такая коллекция не поддерживается. Таким образом, самый безопасный (и самый медленный)
Метод состоит в том, чтобы просто пройти по каждому символу и создать свой собственный список. Следующий макрос VBA выполняет задачу:
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
Очевидно, что чем длиннее ваш документ, тем больше времени потребуется для завершения макроса. (Я запустил макрос для документа на 1100 страниц, и это заняло примерно 46 минут. Для пятистраничного документа это заняло меньше минуты.) Когда это будет сделано, макрос создает новый документ, содержащий отсортированный список используемых шрифтов.
Вышеупомянутый макрос проходит только по основному документу. Возможно, в других элементах вашего документа используются другие шрифты. Если вы хотите, чтобы они были включены в список, вам нужно использовать вариант макроса, который учитывает эти другие элементы. Следующий макрос (ListFontsInDoc2) намного длиннее, и в список также включены три других макроса, которые вызываются из основного макроса.
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: On Error GoTo 0 'Get next linked story (if any) 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
_Примечание: _
Если вы хотите знать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах WordTips), я подготовил специальную страницу, содержащую полезную информацию.
link: / wordribbon-WordTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
WordTips — ваш источник экономичного обучения работе с Microsoft Word.
(Microsoft Word — самая популярная программа для обработки текстов в мире.) Этот совет (1522) применим к Microsoft Word 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Word (Word 2007 и позже) здесь:
link: / wordribbon-Creating_a_Document_Font_List [Создание списка шрифтов документа]
.