Word ti consente di utilizzare i caratteri installati nel sistema che stai utilizzando. I caratteri vengono installati in Windows, in modo che siano disponibili non solo per Word, ma per tutti i programmi installati sul sistema.

Quando si crea un documento sul sistema, è facile sapere quali caratteri vengono utilizzati: l’elenco dei caratteri è limitato a quelli disponibili nel sistema. Se ricevi un documento da una persona diversa, tuttavia, nel sistema dell’altra persona potrebbero essere installati caratteri diversi da te. Ciò significa che il loro documento Word potrebbe essere formattato con caratteri che non hai nemmeno sul tuo sistema.

Se vuoi generare un elenco di caratteri usati all’interno di un documento (al contrario di un elenco di caratteri disponibili su un sistema), hai un paio di scelte. Prima di tutto, puoi aprire il documento di Word in un editor di testo e guardarti intorno nelle parti del documento che normalmente non vedi in Word. Verso la fine del file dovresti vedere un elenco di caratteri utilizzati nel documento. Se lo fai, tuttavia, dovresti stare molto attento a non apportare modifiche al documento di Word mentre è aperto nel tuo editor di testo. In questo modo è possibile rendere facilmente il documento non più utilizzabile in Word.

Una soluzione basata su Word consiste semplicemente nel guardare attraverso ogni carattere in un documento e verificare quale carattere viene utilizzato per formattare il carattere. È necessario un approccio carattere per carattere perché ogni carattere potrebbe essere formattato con un carattere diverso e VBA non consente di accedere a una raccolta di caratteri in relazione al documento stesso: sembra che tale raccolta non venga mantenuta. Quindi, il più sicuro (e il più lento)

il metodo consiste semplicemente nel passare da un personaggio all’altro e creare il proprio elenco. La seguente macro VBA esegue l’operazione:

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

Ovviamente, più lungo è il tuo documento, più tempo impiegherà la macro per finire. (Ho eseguito la macro su un documento di 1.100 pagine e ci sono voluti circa 46 minuti. Su un documento di cinque pagine ci è voluto meno di un minuto.) Al termine, la macro crea un nuovo documento che contiene un elenco ordinato dei caratteri utilizzati.

La macro precedente passa solo attraverso il documento principale. È possibile che ci siano altri tipi di carattere diversi utilizzati in altri elementi del documento. Se vuoi che siano inclusi nell’elenco, devi usare una variazione sulla macro che tenga conto di questi altri elementi. La seguente macro (ListFontsInDoc2) è molto più lunga e l’elenco include anche altre tre macro chiamate dall’interno della macro principale.

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

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti WordTips), ho preparato una pagina speciale che include informazioni utili.

WordTips è la tua fonte di formazione economica su Microsoft Word.

(Microsoft Word è il software di elaborazione testi più popolare al mondo.) Questo suggerimento (1522) si applica a Microsoft Word 97, 2000, 2002 e 2003. È possibile trovare una versione di questo suggerimento per l’interfaccia a barra multifunzione di Word (Word 2007 e più tardi) qui: