Using VBA how to get real page number from MS Word

Posted on 2010-09-03
Last Modified: 2013-11-25

Using VBA in Word I need to return the "true" page number of a Range.  The code I'm using below is close, but the if the page number is "IV" (i.e. formatted in roman numerals ) it will return a "4"  Is there a way to return the adjusted page number including the format.  The same document may or may not contain multiple page number formats not just roman numerals so it is not just a matter of changing number format.

Function GetPageNumber(ByVal DaRange As Range) As String

    GetPageNumber = DaRange.Information(wdActiveEndAdjustedPageNumber)
End Function

Open in new window

Question by:eshurak

Expert Comment

ID: 33600101
I'm not sure of a way to do this, but I did find this function which will convert to roman numerals on
Function Decimal2Roman( ByVal intDecimal )

' This Function converts intDecimal to its Roman numeral value.

' Written by: Rob van der Woude,


' intDecimal should be an integer in the range of 1..4999.


' For the Roman numeral "modern" notation is used, i.e. 1999

' will be written as MCMXCIX, not MIM.


' More information on Roman numerals can be found on WikiPedia:


    ' Some housekeeping

    Dim strRoman

    strRoman = ""

    ' First, add an "M" for every multiple of 1000

    Do While intDecimal >= 1000

        intDecimal = intDecimal - 1000

        strRoman = strRoman & "M"


    ' Next, add "CM" for 900, or "D" for 500, or "CD" for 400

    If intDecimal >= 900 Then

        intDecimal = intDecimal - 900

        strRoman = strRoman & "CM"

    ElseIf intDecimal >= 500 Then

        intDecimal = intDecimal - 500

        strRoman = strRoman & "D"

    ElseIf intDecimal >= 400 Then

        intDecimal = intDecimal - 400

        strRoman = strRoman & "CD"

    End If

    ' Add a "C" for every remaining multiple of 100

    Do While intDecimal >= 100

        intDecimal = intDecimal - 100

        strRoman = strRoman & "C"


    ' Add "XC" for 90, or "L" for 50, or "XL" for 40

    If intDecimal >= 90 Then

        intDecimal = intDecimal - 90

        strRoman = strRoman & "XC"

    ElseIf intDecimal >= 50 Then

        intDecimal = intDecimal - 50

        strRoman = strRoman & "L"

    ElseIf intDecimal >= 40 Then

        intDecimal = intDecimal - 40

        strRoman = strRoman & "XL"

    End If

    ' Add an "X" for every remaining multiple of 10

    Do While intDecimal >= 10

        intDecimal = intDecimal - 10

        strRoman = strRoman & "X"


    ' Add "IX" for 9, or "V" for 5, or "IV" for 4

    If intDecimal >= 9 Then

        intDecimal = intDecimal - 9

        strRoman = strRoman & "IX"

    ElseIf intDecimal >= 5 Then

        intDecimal = intDecimal - 5

        strRoman = strRoman & "V"

    ElseIf intDecimal >= 4 Then

        intDecimal = intDecimal - 4

        strRoman = strRoman & "IV"

    End If

    ' Finally, add an "I" for every remaining multiple of 1

    Do While intDecimal >= 1

        intDecimal = intDecimal - 1

        strRoman = strRoman & "I"



    ' Return the result

    Decimal2Roman = strRoman

End Function

Open in new window

LVL 76

Accepted Solution

GrahamSkan earned 500 total points
ID: 33602298
I think the simplest way would be to insert a new Page field, capture the text, and then delete it.
Function GetPageNumberDisplay(rng As Range) As String

    Dim fld As Field


    rng.Collapse wdCollapseEnd

    Set fld = ActiveDocument.Fields.Add(rng, wdFieldPage)

    rng.Start = fld.Code.Start - 2

    rng.End = fld.Code.End + 3


    GetPageNumberDisplay = rng.Text


End Function

Open in new window


Author Comment

ID: 33619589
Thanks for both of your responses.

I'm going to use a modified version of Graham's solution.

It will get any page number format used no matter what Number Style is being used.

I'm also using fld.Result instead of change the rng object to get the page number.
Function GetPageNumberDisplay(rng As Range) As String

    Dim fld As Field


if rng.Sections(1).footers(1).PageNumbers.NumberStyle <> wdPageNumberStyleArabic Then

    rng.Collapse wdCollapseEnd

    Set fld = ActiveDocument.Fields.Add(rng, wdFieldPage)


    GetPageNumberDisplay = fld.Result


    Set fld = Nothing


    GetPageNumber = rng.Information(wdActiveEndAdjustedPageNumber)

End if

End Function

Open in new window


Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Selection object is designed for user interaction. It has a Range property, so it can be used in most places that a Range object can. Recorded macros must use the Selection because they are simply copying what the user is doing. A Range prope…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
This video teaches the viewer how to align pictures around text while keeping the text properly aligned in the document.
This video walks the viewer through the process of creating envelopes and labels, with multiple names and addresses. Navigate to the “Start Mail Merge” button in the Mailings tab: Follow the step-by-step process until asked to find the address doc…

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now