PDA

View Full Version : Problems with Page X of Y numbers



Valvolino78
06-13-2018, 08:55 AM
Hi everyone,
new to forum and word vba, and I very need help.
I have to rearrange a doc file (composed by multiple sections) created by an application from a third party.
I managed to resolve all the problems but pagenumbers in header, given in the form of "Page X of Y".
I have to decide yet if maintaining the native page number format or change it.
In the case I want to maintain the original format, my problem is that the Y is always of 1 minus than total page numbers (if I activate field codes, I get <NUMPAGES -1> and I can't manage to solve it with vba, that is a must).
In the case I want to delete the native format "Page X of Y", I can remove "Page", "X" and "of", but not the same for "Y", which still remains: I've searched in a number of vba forums, but I found only the macro for deleting page numbers, that works for the "X" as I said, but not with the "Y"!
These are the code I use for deleting "Page X of":

Sub cancella()
Dim objSect As Section
Dim objHF As HeaderFooter
Dim objPNum As PageNumber
For Each objSect In ActiveDocument.Sections
For Each objHF In objSect.Headers
For Each objPNum In objHF.PageNumbers
objPNum.Delete
Next
Next
For Each objHF In objSect.Footers
For Each objPNum In objHF.PageNumbers
objPNum.Delete
Next
Next
Next


Call cancellare
End Sub


Sub cancellare()
WordBasic.viewheaderonly
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "*" (the * is substitued by "Page" first and by"of" then, because if I use * as wildcard the
macro deletes one char at time only):
.Forward = True
.Wrap = wdFindContinue
.Format = False
End With
If Selection.Find.Execute Then
With Selection
Selection.Delete
End With
End If
End Sub


Very thanks in advance for the precious help!!!

gmayor
06-13-2018, 08:50 PM
Without knowing what else is in the header/footers or even if there is any additional text in the same paragraph as the page number it is a bit tricky to ensure that only the required field construction is deleted, however the following should work


Option Explicit

Sub Macro1()

Dim objSect As Section
Dim objHF As HeaderFooter
Dim objField As Field
Dim oRng As Range
ActiveWindow.View.ShowFieldCodes = True
For Each objSect In ActiveDocument.Sections
For Each objHF In objSect.Headers
If objHF.Exists Then
For Each objField In objHF.Range.Fields
If objField.Type = wdFieldPage Then
Set oRng = objField.Result
DelPageOf oRng
Exit For
End If
Next objField
End If
Next objHF
For Each objHF In objSect.Footers
If objHF.Exists Then
For Each objField In objHF.Range.Fields
If objField.Type = wdFieldPage Then
Set oRng = objField.Result
DelPageOf oRng
Exit For
End If
Next objField
End If
Next objHF
Next objSect
ActiveWindow.View.ShowFieldCodes = False
lbl_Exit:
Set objSect = Nothing
Set objHF = Nothing
Set objField = Nothing
Set oRng = Nothing
Exit Sub
End Sub

Private Sub DelPageOf(oRng As Range)
oRng.End = oRng.Paragraphs(1).Range.End - 1
If oRng.Fields.Count = 3 Then
oRng.Fields(1).Delete
oRng.Fields(2).Delete
oRng.Fields(1).Delete
oRng.Collapse 1
Do While oRng.Characters(1) = Chr(32) Or _
oRng.Characters(1) = "o" Or oRng.Characters(1) = "f"
oRng.Characters(1).Delete
Loop
End If
lbl_Exit:
Set oRng = Nothing
Exit Sub
End Sub