VBA Word Count

Discussion in 'Word VBA Beginners' started by GB, Feb 20, 2008.

  1. GB

    GB Guest

    Hi, couple of minor problems. I wanted to help my wife with a macro that
    would count all the words in the document and also the number of words in
    bold. I can't even get to first base on this because the VBA word count
    seems to be all screwy.

    For example: 'MsgBox ActiveDocument.Range.Words.Count' returns an answer of
    10 for a document that has 5 words in it. The word count on the menu
    Tools...word count gives the correct answer. Is there a simple way to access
    that, and why does words.count not just ummm count the words?

    BTW this is Word 2003, and it's up to date with all the patches.
     
    GB, Feb 20, 2008
    #1
    1. Advertisements

  2. GB

    Jay Freedman Guest

    GB wrote:
    > Hi, couple of minor problems. I wanted to help my wife with a macro
    > that would count all the words in the document and also the number of
    > words in bold. I can't even get to first base on this because the VBA
    > word count seems to be all screwy.
    >
    > For example: 'MsgBox ActiveDocument.Range.Words.Count' returns an
    > answer of 10 for a document that has 5 words in it. The word count on
    > the menu Tools...word count gives the correct answer. Is there a
    > simple way to access that, and why does words.count not just ummm
    > count the words?
    > BTW this is Word 2003, and it's up to date with all the patches.


    The Words collection contains a separate item for each punctuation mark,
    each paragraph mark, and each inline graphic in the document. That makes it
    unsuitable for your purpose. The number in the Word Count dialog, which
    matches the usual English definition of "words", is instead available from
    the ComputeStatistics method.

    Here's sample code that you can modify to your taste:

    Sub demo()
    Dim WordCount As Long
    Dim myRange As Range

    Set myRange = ActiveDocument.Range

    WordCount = myRange.ComputeStatistics(wdStatisticWords)
    MsgBox WordCount & " words"

    ' now count bold words
    WordCount = 0
    With myRange.Find
    .ClearFormatting
    .Format = True
    .Text = ""
    .Font.Bold = True
    .Forward = True
    .Wrap = wdFindStop
    While .Execute
    WordCount = WordCount + 1
    myRange.Collapse wdCollapseEnd
    Wend
    End With
    MsgBox WordCount & " bold words"
    End Sub


    --
    Regards,
    Jay Freedman
    Microsoft Word MVP
    Email cannot be acknowledged; please post all follow-ups to the newsgroup so
    all may benefit.
     
    Jay Freedman, Feb 20, 2008
    #2
    1. Advertisements

  3. GB

    Helmut Weber Guest

    Hi GB,

    select all of the doc.

    MsgBox Selection.Words.Count
    MsgBox Selection.Range.ComputeStatistics(wdStatisticWords)

    The second comes closer to what you want,
    though it is regrettable that Word uses different
    methods for word count.

    >... macro that would count the number of words in bold.


    >For example: 'MsgBox ActiveDocument.Range.Words.Count' returns an answer of
    >10 for a document that has 5 words in it. The word count on the menu
    >Tools...word count gives the correct answer. Is there a simple way to access
    >that, and why does words.count not just ummm count the words?


    What a word constitutes,
    is a fuzzy concept of fuzzy naturally language.
    You would need a fuzzy computer, a contradiction in itself,
    to count words, and it would return a fuzzy answer...

    Try this, which is refinable at nauseam,
    but will never be perfect.

    Sub Test14()
    Dim lBld As Long
    Dim rDcm As Range
    Dim oWrd As Range
    Set rDcm = ActiveDocument.Range
    For Each oWrd In rDcm.Words
    If oWrd.Font.Bold And Len(oWrd) > 1 Then
    lBld = lBld + 1
    End If
    Next
    MsgBox lBld
    End Sub

    Greetings from Bavaria, German
    Helmut Weber MVP WordBVA
    (MA linguistics)
     
    Helmut Weber, Feb 20, 2008
    #3
  4. GB

    GB Guest

    "Jay Freedman" <> wrote in message
    news:...

    >> why does words.count not just count the words?


    >
    > The Words collection contains a separate item for each punctuation mark,
    > each paragraph mark, and each inline graphic in the document. That makes
    > it unsuitable for your purpose. The number in the Word Count dialog, which
    > matches the usual English definition of "words", is instead available from
    > the ComputeStatistics method.


    Thanks very much, Jay. Your code (snipped) does the job nicely. That raises
    another question, namely where is there a fairly simple beginner's guide to
    the Word object model? The trouble with the help file is that it explains
    how to use a particular property or method, but it's not so good at helping
    to find the right one in the first place.
     
    GB, Feb 20, 2008
    #4
  5. GB

    GB Guest

    "Jay Freedman" <> wrote in message
    news:...
    > With myRange.Find
    > .Forward = True
    > .Wrap = wdFindStop
    > While .Execute
    > WordCount = WordCount + 1
    > myRange.Collapse wdCollapseEnd
    > Wend
    > End With


    I was curious why the line 'myRange.Collapse wdCollapseEnd' needs to be
    there? I'm quite surprised that it works, as I would expect it to collapse
    the range you are finding in whilst still finding bold words in it. It seems
    to work quite nicely with or without that line in it.
     
    GB, Feb 20, 2008
    #5
  6. GB

    Jay Freedman Guest

    GB wrote:
    > "Jay Freedman" <> wrote in message
    > news:...
    >> With myRange.Find
    >> .Forward = True
    >> .Wrap = wdFindStop
    >> While .Execute
    >> WordCount = WordCount + 1
    >> myRange.Collapse wdCollapseEnd
    >> Wend
    >> End With

    >
    > I was curious why the line 'myRange.Collapse wdCollapseEnd' needs to
    > be there? I'm quite surprised that it works, as I would expect it to
    > collapse the range you are finding in whilst still finding bold words
    > in it. It seems to work quite nicely with or without that line in it.


    The behavior of the Find object is something that defies understanding.

    When the .Execute method succeeds (and returns True), the .Start and .End
    values of the Range object are changed to cover the found text. You can
    watch this happening in the Locals window as you single-step (F8) in the
    code. In some hidden bit of memory, though, VBA remembers the original range
    and continues to search through it. The exception to this occurs when the
    body of the While loop modifies the content of the Range object by adding or
    removing text, or by changing the .Start or .End value. That's when the
    ..Collapse is required; if it's omitted, the next .Execute will indeed search
    within the _current_ location of the Range object.

    Rather than forget the .Collapse when it is needed, and because it does no
    harm if it isn't needed, I have a standard "template" for a Find loop that
    includes it. Yes, you can take it out.

    --
    Regards,
    Jay Freedman
    Microsoft Word MVP
    Email cannot be acknowledged; please post all follow-ups to the newsgroup so
    all may benefit.
     
    Jay Freedman, Feb 20, 2008
    #6
  7. GB

    Jay Freedman Guest

    On Wed, 20 Feb 2008 17:42:27 -0000, "GB" <> wrote:

    >
    >"Jay Freedman" <> wrote in message
    >news:...
    >
    >>> why does words.count not just count the words?

    >
    >>
    >> The Words collection contains a separate item for each punctuation mark,
    >> each paragraph mark, and each inline graphic in the document. That makes
    >> it unsuitable for your purpose. The number in the Word Count dialog, which
    >> matches the usual English definition of "words", is instead available from
    >> the ComputeStatistics method.

    >
    >Thanks very much, Jay. Your code (snipped) does the job nicely. That raises
    >another question, namely where is there a fairly simple beginner's guide to
    >the Word object model? The trouble with the help file is that it explains
    >how to use a particular property or method, but it's not so good at helping
    >to find the right one in the first place.


    I can't say I've kept up with what's in print on this subject. After all this
    time, I just carry around large chunks of the object model in my head :) and
    use the help and the Object Browser (F2 in the VBA editor) to refresh my memory
    when necessary.

    There's a fairly good introduction to the concepts at
    <http://msdn2.microsoft.com/en-us/library/aa272082(office.11).aspx>.

    If you ask the help for the topic "Word Object Model (Table)" you'll get a
    diagram of the top levels. Each box in the table is hyperlinked to the topic
    about that object, and the topic has links at the top for Properties, Methods,
    and (where applicable) Events.

    If you're looking for a property or method and you don't know what it's called,
    or what object it belongs to, use the Object Browser. Type into the search box
    any term or fragment that you think might be related to what you want, and click
    the Search (binoculars) button. You'll get a list of everything in the object
    model whose names contain that fragment.

    --
    Regards,
    Jay Freedman
    Microsoft Word MVP
    Email cannot be acknowledged; please post all follow-ups to the newsgroup so all may benefit.
     
    Jay Freedman, Feb 21, 2008
    #7
  8. GB

    Jay Prakash Guest

    Active filename

    when I try to write the name of the active word file name to another opened word file, it writes onle the opened file with below said way. Can you help to resolve it?

    Code:
    ActiveDocument.Name

    Thanks
    JP

    > On Wednesday, February 20, 2008 10:35 AM GB wrote:


    > Hi, couple of minor problems. I wanted to help my wife with a macro that
    > would count all the words in the document and also the number of words in
    > bold. I can't even get to first base on this because the VBA word count
    > seems to be all screwy.
    >
    > For example: 'MsgBox ActiveDocument.Range.Words.Count' returns an answer of
    > 10 for a document that has 5 words in it. The word count on the menu
    > Tools...word count gives the correct answer. Is there a simple way to access
    > that, and why does words.count not just ummm count the words?
    >
    > BTW this is Word 2003, and it's up to date with all the patches.



    >> On Wednesday, February 20, 2008 10:55 AM Jay Freedman wrote:


    >> GB wrote:
    >>
    >> The Words collection contains a separate item for each punctuation mark,
    >> each paragraph mark, and each inline graphic in the document. That makes it
    >> unsuitable for your purpose. The number in the Word Count dialog, which
    >> matches the usual English definition of "words", is instead available from
    >> the ComputeStatistics method.
    >>
    >> Here's sample code that you can modify to your taste:
    >>
    >> Sub demo()
    >> Dim WordCount As Long
    >> Dim myRange As Range
    >>
    >> Set myRange = ActiveDocument.Range
    >>
    >> WordCount = myRange.ComputeStatistics(wdStatisticWords)
    >> MsgBox WordCount & " words"
    >>
    >> ' now count bold words
    >> WordCount = 0
    >> With myRange.Find
    >> .ClearFormatting
    >> .Format = True
    >> .Text = ""
    >> .Font.Bold = True
    >> .Forward = True
    >> .Wrap = wdFindStop
    >> While .Execute
    >> WordCount = WordCount + 1
    >> myRange.Collapse wdCollapseEnd
    >> Wend
    >> End With
    >> MsgBox WordCount & " bold words"
    >> End Sub
    >>
    >>
    >> --
    >> Regards,
    >> Jay Freedman
    >> Microsoft Word MVP
    >> Email cannot be acknowledged; please post all follow-ups to the newsgroup so
    >> all may benefit.



    >>> On Wednesday, February 20, 2008 11:26 AM Helmut Weber wrote:


    >>> Hi GB,
    >>>
    >>> select all of the doc.
    >>>
    >>> MsgBox Selection.Words.Count
    >>> MsgBox Selection.Range.ComputeStatistics(wdStatisticWords)
    >>>
    >>> The second comes closer to what you want,
    >>> though it is regrettable that Word uses different
    >>> methods for word count.
    >>>
    >>>
    >>>
    >>> What a word constitutes,
    >>> is a fuzzy concept of fuzzy naturally language.
    >>> You would need a fuzzy computer, a contradiction in itself,
    >>> to count words, and it would return a fuzzy answer...
    >>>
    >>> Try this, which is refinable at nauseam,
    >>> but will never be perfect.
    >>>
    >>> Sub Test14()
    >>> Dim lBld As Long
    >>> Dim rDcm As Range
    >>> Dim oWrd As Range
    >>> Set rDcm = ActiveDocument.Range
    >>> For Each oWrd In rDcm.Words
    >>> If oWrd.Font.Bold And Len(oWrd) > 1 Then
    >>> lBld = lBld + 1
    >>> End If
    >>> Next
    >>> MsgBox lBld
    >>> End Sub
    >>>
    >>> Greetings from Bavaria, German
    >>> Helmut Weber MVP WordBVA
    >>> (MA linguistics)



    >>>> On Wednesday, February 20, 2008 12:42 PM GB wrote:


    >>>> "Jay Freedman" <> wrote in message
    >>>> news:...
    >>>>
    >>>>
    >>>>
    >>>> Thanks very much, Jay. Your code (snipped) does the job nicely. That raises
    >>>> another question, namely where is there a fairly simple beginner's guide to
    >>>> the Word object model? The trouble with the help file is that it explains
    >>>> how to use a particular property or method, but it's not so good at helping
    >>>> to find the right one in the first place.



    >>>>> On Wednesday, February 20, 2008 12:55 PM GB wrote:


    >>>>> "Jay Freedman" <> wrote in message
    >>>>> news:...
    >>>>>
    >>>>> I was curious why the line 'myRange.Collapse wdCollapseEnd' needs to be
    >>>>> there? I'm quite surprised that it works, as I would expect it to collapse
    >>>>> the range you are finding in whilst still finding bold words in it. It seems
    >>>>> to work quite nicely with or without that line in it.



    >>>>>> On Wednesday, February 20, 2008 1:54 PM Jay Freedman wrote:


    >>>>>> GB wrote:
    >>>>>>
    >>>>>> The behavior of the Find object is something that defies understanding.
    >>>>>>
    >>>>>> When the .Execute method succeeds (and returns True), the .Start and .End
    >>>>>> values of the Range object are changed to cover the found text. You can
    >>>>>> watch this happening in the Locals window as you single-step (F8) in the
    >>>>>> code. In some hidden bit of memory, though, VBA remembers the original range
    >>>>>> and continues to search through it. The exception to this occurs when the
    >>>>>> body of the While loop modifies the content of the Range object by adding or
    >>>>>> removing text, or by changing the .Start or .End value. That's when the
    >>>>>> .Collapse is required; if it's omitted, the next .Execute will indeed search
    >>>>>> within the _current_ location of the Range object.
    >>>>>>
    >>>>>> Rather than forget the .Collapse when it is needed, and because it does no
    >>>>>> harm if it isn't needed, I have a standard "template" for a Find loop that
    >>>>>> includes it. Yes, you can take it out.
    >>>>>>
    >>>>>> --
    >>>>>> Regards,
    >>>>>> Jay Freedman
    >>>>>> Microsoft Word MVP
    >>>>>> Email cannot be acknowledged; please post all follow-ups to the newsgroup so
    >>>>>> all may benefit.



    >>>>>>> On Wednesday, February 20, 2008 7:56 PM Jay Freedman wrote:


    >>>>>>> On Wed, 20 Feb 2008 17:42:27 -0000, "GB" <> wrote:
    >>>>>>>
    >>>>>>>
    >>>>>>> I can't say I've kept up with what's in print on this subject. After all this
    >>>>>>> time, I just carry around large chunks of the object model in my head :) and
    >>>>>>> use the help and the Object Browser (F2 in the VBA editor) to refresh my memory
    >>>>>>> when necessary.
    >>>>>>>
    >>>>>>> There's a fairly good introduction to the concepts at
    >>>>>>> <http://msdn2.microsoft.com/en-us/library/aa272082(office.11).aspx>.
    >>>>>>>
    >>>>>>> If you ask the help for the topic "Word Object Model (Table)" you'll get a
    >>>>>>> diagram of the top levels. Each box in the table is hyperlinked to the topic
    >>>>>>> about that object, and the topic has links at the top for Properties, Methods,
    >>>>>>> and (where applicable) Events.
    >>>>>>>
    >>>>>>> If you're looking for a property or method and you don't know what it's called,
    >>>>>>> or what object it belongs to, use the Object Browser. Type into the search box
    >>>>>>> any term or fragment that you think might be related to what you want, and click
    >>>>>>> the Search (binoculars) button. You'll get a list of everything in the object
    >>>>>>> model whose names contain that fragment.
    >>>>>>>
    >>>>>>> --
    >>>>>>> Regards,
    >>>>>>> Jay Freedman
    >>>>>>> Microsoft Word MVP
    >>>>>>> Email cannot be acknowledged; please post all follow-ups to the newsgroup so all may benefit.



    >>>>>>> Submitted via EggHeadCafe - Software Developer Portal of Choice
    >>>>>>> Book Review: Google Analytics
    >>>>>>> http://www.eggheadcafe.com/tutorial...85f8fda2442/book-review-google-analytics.aspx
     
    Jay Prakash, Sep 17, 2010
    #8
  9. GB

    Jay Freedman Guest

    Re: Active filename

    When you have more than one document open at the same time, the variable "ActiveDocument" refers to the document that has the focus (the active cursor) at the instant that line of the macro is
    executed. If the macro changes the focus (for example, by opening another document or by using the Activate method), the ActiveDocument changes too. So "ActiveDocument" could refer to different
    documents at different times during the execution of the single macro.

    The way to work around this is to declare and initialize one or more variables of type Document, and use those variables instead of ActiveDocument. For example:

    Sub Demo()
    Dim FirstDoc As Document
    Dim SecondDoc As Document

    Set FirstDoc = ActiveDocument
    ' so FirstDoc is the document that had the focus when the macro started

    Set SecondDoc = Documents.Add ' open a new blank document, which becomes ActiveDocument

    MsgBox "When macro started, " & FirstDoc.Name & " was active"
    MsgBox "Now " & SecondDoc.Name & " is active"
    End Sub

    --
    Regards,
    Jay Freedman
    Microsoft Word MVP
    Email cannot be acknowledged; please post all follow-ups to the newsgroup so all may benefit.


    On Fri, 17 Sep 2010 13:37:28 GMT, Jay Prakash <> wrote:

    >when I try to write the name of the active word file name to another opened word file, it writes onle the opened file with below said way. Can you help to resolve it?
    >
    >Code:
    >ActiveDocument.Name
    >
    >Thanks
    >JP
    >
     
    Jay Freedman, Sep 18, 2010
    #9
    1. Advertisements

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.
Similar Threads
  1. Thejan Mendis

    How to count numbers of character in a line

    Thejan Mendis, Jul 20, 2003, in forum: Word VBA Beginners
    Replies:
    1
    Views:
    120
    Doug Robbins - Word MVP
    Jul 20, 2003
  2. Dennis

    VBA word count, closed document(s)

    Dennis, Aug 10, 2003, in forum: Word VBA Beginners
    Replies:
    1
    Views:
    130
    Jay Freedman
    Aug 11, 2003
  3. ES
    Replies:
    2
    Views:
    98
  4. Thejan Mendis

    Find and replace a word count

    Thejan Mendis, Apr 30, 2004, in forum: Word VBA Beginners
    Replies:
    1
    Views:
    130
    Jonathan West
    Apr 30, 2004
  5. Simon

    VBA in Word 97 and Word 2002 / Office XP:

    Simon, Jul 14, 2004, in forum: Word VBA Beginners
    Replies:
    1
    Views:
    86
    Jonathan West
    Jul 14, 2004
  6. ahmed

    insert word count with further calculation

    ahmed, Oct 22, 2004, in forum: Word VBA Beginners
    Replies:
    2
    Views:
    111
    ahmed
    Oct 25, 2004
  7. How to count in VBA?

    , Apr 14, 2007, in forum: Word VBA Beginners
    Replies:
    10
    Views:
    153
    Tony Strazzeri
    Jun 27, 2007
  8. Glenn

    Word 97 VBA in Word 2003

    Glenn, Apr 21, 2007, in forum: Word VBA Beginners
    Replies:
    2
    Views:
    99
    Glenn
    May 18, 2007
Loading...