Ureader.com  
Microsoft software help and Community
   home   |   control panel login   |   archive   |  
 
Word
application.errors
conversions
docmanagement
drawing.graphics
formatting.longdocs
international
internet.assistant
mail
mailmerge.fields
menustoolbars
newusers
numbering
oleinterop
pagelayout
printingfonts
setup.networking
spelling.grammar
tables
vba.addins
vba.beginners
vba.customization
vba.general
vba.userforms
web.authoring
word6-7macros
word97vba
  
 
date: Sat, 16 Aug 2008 07:58:24 -0700 (PDT),    group: microsoft.public.word.vba.general        back       


checking for fonts in document   
Hi,

I have a list of fonts and what I want to do is run some code over the
open document to see if it contains any fonts that are NOT in my list
and then return TRUE if it only contains fonts in my list of
acceptable fonts and FALSE if it contains other fonts,

I guess I need to hold the 'acceptable' fonts in some form of array
and then have a loop that checks the first font in the document to see
if it is in the array and if that passes then move onto the next font
it finds in the document.

I reckon I could probably handle the checking within an array, but I
dont quite no how to find out what fonts are in the open document in
the first place.

Any help would be much appreciated.

Thanks.
date: Sat, 16 Aug 2008 07:58:24 -0700 (PDT)   author:   macroapa

RE: checking for fonts in document   
To: macroapa,

I haven't done a lot of testing on this, so let me know how they work. But I 
think this is the right idea. The first function "IsFontInUseInDoc" calls the 
second function "IsFontInRange." 

Private Function IsFontInUseInDoc(ByVal sFontName As String, ByVal oDoc As 
Document) As Boolean
    Dim oRange As Range
    Dim bReturn As Boolean
    
    bReturn = False
    For Each oRange In oDoc.StoryRanges
        If IsFontInRange(sFontName, oRange) = True Then
            bReturn = True
        End If
        Do While Not (oRange.NextStoryRange Is Nothing)
            Set oRange = oRange.NextStoryRange
            If IsFontInRange(sFontName, oRange) = True Then
                bReturn = True
            End If
        Loop
    Next oRange
    IsFontInUseInDoc = bReturn
End Function

Private Function IsFontInRange(ByVal sFontName As String, ByVal oRange As 
Range) As Boolean
    oRange.Collapse Direction:=wdCollapseStart
    With oRange.Find
        .ClearFormatting
        .Font.Name = sFontName
        .Forward = True
        .Format = True
        .Text = ""
        .Execute
    End With
    IsFontInRange = oRange.Find.Found
End Function

And then you need something like the following to run the above two functions.

Sub TestIsFontInUseInDoc()
    Const FontList = "Garamond,Arial,SimSun,Times New Roman"
    Dim vFontList As Variant
    Dim i As Long
    
    vFontList = Split(FontList, ",")
    For i = LBound(vFontList) To UBound(vFontList)
        MsgBox vFontList(i) & " is " & IsFontInUseInDoc(vFontList(i), 
ActiveDocument)
    Next i
End Sub

Steven Craig Miller

"macroapa" wrote:

> Hi,
> 
> I have a list of fonts and what I want to do is run some code over the
> open document to see if it contains any fonts that are NOT in my list
> and then return TRUE if it only contains fonts in my list of
> acceptable fonts and FALSE if it contains other fonts,
> 
> I guess I need to hold the 'acceptable' fonts in some form of array
> and then have a loop that checks the first font in the document to see
> if it is in the array and if that passes then move onto the next font
> it finds in the document.
> 
> I reckon I could probably handle the checking within an array, but I
> dont quite no how to find out what fonts are in the open document in
> the first place.
> 
> Any help would be much appreciated.
> 
> Thanks.
>
date: Sat, 16 Aug 2008 10:36:00 -0700   author:   StevenM stevencraigmiller(at)comcast(dot)net

Re: checking for fonts in document   
Steven,

Interesting code, but I am not sure that it is a solution to the OPs 
problem.  Your code will evaluate your list of fonts and indicate if that 
font "is" or "is not" contained in the document.  I think the OP wants to 
look at the document and determine if it contains any font that "is not" on 
his list.

I have probably done less testing than you ;-), but I think this (clunky as 
it may be) may be close to a solution.

Sub ScratchMacro()
'Return true if the doc contains only acceptable fonts.
MsgBox CheckForFonts
End Sub

Function CheckForFonts() As Boolean
Dim oRng As Word.Range
Dim vFontNames()
Dim i As Long
Dim FontList As New Collection
Dim oChr As Range
Dim pTemp As String
CheckForFonts = True
'Collect the acceptable font names
vFontNames = Array("Times New Roman", "Arial", "Courier New")
'Create a collection of the acceptable font names
For i = 0 To UBound(vFontNames)
  FontList.Add vFontNames(i), vFontNames(i)
Next i
'Since "font" is an attribute that can be applied to
'individual characters, or even spaces, I suppose
'you will have to check each one.
For Each oRng In ActiveDocument.StoryRanges
  For Each oChr In oRng.Characters
    On Error GoTo Err_Handler
    'If the font name is not in the collection, this line throws an error 
*****
    pTemp = FontList.Item(oChr.Font.Name)
    On Error GoTo 0
  Next oChr
  Do While Not (oRng.NextStoryRange Is Nothing)
    Set oRng = oRng.NextStoryRange
    For Each oChr In oRng.Characters
      On Error GoTo Err_Handler
      pTemp = FontList.Item(oChr.Font.Name)
      On Error GoTo 0
    Next oChr
  Loop
Next oRng
Exit Function
Err_Handler:
'***** Capture that error and process the unacceptable font.
If Err.Number = 5 And CheckForFonts Then
  CheckForFonts = False
  oChr.HighlightColorIndex = wdYellow
  Resume Next
ElseIf Err.Number = 5 Then
  oChr.HighlightColorIndex = wdYellow
  Resume Next
Else
  MsgBox Err.Number & " " & Err.Description
  End
End If
End Function


StevenM wrote:
> To: macroapa,
>
> I haven't done a lot of testing on this, so let me know how they
> work. But I think this is the right idea. The first function
> "IsFontInUseInDoc" calls the second function "IsFontInRange."
>
> Private Function IsFontInUseInDoc(ByVal sFontName As String, ByVal
> oDoc As Document) As Boolean
>    Dim oRange As Range
>    Dim bReturn As Boolean
>
>    bReturn = False
>    For Each oRange In oDoc.StoryRanges
>        If IsFontInRange(sFontName, oRange) = True Then
>            bReturn = True
>        End If
>        Do While Not (oRange.NextStoryRange Is Nothing)
>            Set oRange = oRange.NextStoryRange
>            If IsFontInRange(sFontName, oRange) = True Then
>                bReturn = True
>            End If
>        Loop
>    Next oRange
>    IsFontInUseInDoc = bReturn
> End Function
>
> Private Function IsFontInRange(ByVal sFontName As String, ByVal
> oRange As Range) As Boolean
>    oRange.Collapse Direction:=wdCollapseStart
>    With oRange.Find
>        .ClearFormatting
>        .Font.Name = sFontName
>        .Forward = True
>        .Format = True
>        .Text = ""
>        .Execute
>    End With
>    IsFontInRange = oRange.Find.Found
> End Function
>
> And then you need something like the following to run the above two
> functions.
>
> Sub TestIsFontInUseInDoc()
>    Const FontList = "Garamond,Arial,SimSun,Times New Roman"
>    Dim vFontList As Variant
>    Dim i As Long
>
>    vFontList = Split(FontList, ",")
>    For i = LBound(vFontList) To UBound(vFontList)
>        MsgBox vFontList(i) & " is " & IsFontInUseInDoc(vFontList(i),
> ActiveDocument)
>    Next i
> End Sub
>
> Steven Craig Miller
>
> "macroapa" wrote:
>
>> Hi,
>>
>> I have a list of fonts and what I want to do is run some code over
>> the open document to see if it contains any fonts that are NOT in my
>> list and then return TRUE if it only contains fonts in my list of
>> acceptable fonts and FALSE if it contains other fonts,
>>
>> I guess I need to hold the 'acceptable' fonts in some form of array
>> and then have a loop that checks the first font in the document to
>> see if it is in the array and if that passes then move onto the next
>> font it finds in the document.
>>
>> I reckon I could probably handle the checking within an array, but I
>> dont quite no how to find out what fonts are in the open document in
>> the first place.
>>
>> Any help would be much appreciated.
>>
>> Thanks.

-- 
Greg Maxey -  Word MVP

My web site http://gregmaxey.mvps.org
Word MVP web site http://word.mvps.org
date: Sat, 16 Aug 2008 14:48:30 -0400   author:   Greg Maxey RrOMEOgOLF

Re: checking for fonts in document   
Greg Maxey wrote: << ... I am not sure that it is a solution to the OPs 
problem.  Your code will evaluate your list of fonts and indicate if that 
font "is" or "is not" contained in the document.  I think the OP wants to 
look at the document and determine if it contains any font that "is not" on 
his list. >>

Point taken.

Attempt number 2:

Sub ListFontsInDoc()
    Dim sFonts As String
    sFonts = FindFontsInUseInDoc(ActiveDocument)
    sFonts = Replace(sFonts, ",", vbCr)
    MsgBox sFonts
End Sub

Private Function FindFontsInUseInDoc(ByVal oDoc As Document) As String
    Dim oRange As Range
    Dim sFonts As String
    
    For Each oRange In oDoc.StoryRanges
        sFonts = FindFontsInRange(oRange, sFonts)
        Do While Not (oRange.NextStoryRange Is Nothing)
            Set oRange = oRange.NextStoryRange
            sFonts = FindFontsInRange(oRange, sFonts)
        Loop
    Next oRange
    If Len(sFonts) > 0 Then
        sFonts = Left(sFonts, Len(sFonts) - 1)
    End If
    FindFontsInUseInDoc = sFonts
End Function

Private Function FindFontsInRange(ByVal oRange As Range, ByVal sFonts As 
String) As String
    Dim oChar As Range
    For Each oChar In oRange.Characters
        If InStr(1, sFonts, oChar.Font.Name, vbTextCompare) = 0 Then
            sFonts = sFonts & oChar.Font.Name & ","
        End If
    Next oChar
    FindFontsInRange = sFonts
End Function

Steven Craig Miller
date: Sat, 16 Aug 2008 12:40:01 -0700   author:   StevenM stevencraigmiller(at)comcast(dot)net

Re: checking for fonts in document   
On 16 Aug, 20:40, StevenM <stevencraigmiller(at)comcast(dot)net>
wrote:
> Greg Maxey wrote: << ... I am not sure that it is a solution to the OPs
>
> problem.  Your code will evaluate your list of fonts and indicate if that
> font "is" or "is not" contained in the document.  I think the OP wants to
> look at the document and determine if it contains any font that "is not" on
> his list. >>
>
> Point taken.
>
> Attempt number 2:
>
> Sub ListFontsInDoc()
>     Dim sFonts As String
>     sFonts = FindFontsInUseInDoc(ActiveDocument)
>     sFonts = Replace(sFonts, ",", vbCr)
>     MsgBox sFonts
> End Sub
>
> Private Function FindFontsInUseInDoc(ByVal oDoc As Document) As String
>     Dim oRange As Range
>     Dim sFonts As String
>
>     For Each oRange In oDoc.StoryRanges
>         sFonts = FindFontsInRange(oRange, sFonts)
>         Do While Not (oRange.NextStoryRange Is Nothing)
>             Set oRange = oRange.NextStoryRange
>             sFonts = FindFontsInRange(oRange, sFonts)
>         Loop
>     Next oRange
>     If Len(sFonts) > 0 Then
>         sFonts = Left(sFonts, Len(sFonts) - 1)
>     End If
>     FindFontsInUseInDoc = sFonts
> End Function
>
> Private Function FindFontsInRange(ByVal oRange As Range, ByVal sFonts As
> String) As String
>     Dim oChar As Range
>     For Each oChar In oRange.Characters
>         If InStr(1, sFonts, oChar.Font.Name, vbTextCompare) = 0 Then
>             sFonts = sFonts & oChar.Font.Name & ","
>         End If
>     Next oChar
>     FindFontsInRange = sFonts
> End Function
>
> Steven Craig Miller

Thanks both, really wasn't expecting a complete solution to my
problem, so that's great.  I haven't tried them out yet, but looking
through what you've posted, I'm quite confident now.

Thanks again.
date: Sat, 16 Aug 2008 13:12:41 -0700 (PDT)   author:   macroapa

Google
 
Web ureader.com


    COPYRIGHT 2007, YARDI TECHNOLOGY LIMITED, ALL RIGHT RESERVE  |   contact us