Macro pour numéroter les ouvertures de page

P

Philling

Guest
J'ai un fichier excel avec plusieurs onglets. Je cherche une macro qui permet, quel que soit l'onglet, de numéroter les ouvertures. Par exemple, l'ouverture de l'onglet 1 affiche PAGE 1, l'ouverture de l'onglet 8 affiche PAGE 2 et ainsi de suite.
Le but est de permettre, après impression, de classer par ordre numérique les pages utilisées.
Par contre, la numérotation doit être définitive qu'après enregistrement des travaux. Si on ouvre un onglet et qu'on ne s'en sert pas, le n° de page ne doit pas être pris en compte.
Merci d'avance pour vos réponses.
 
M

michel

Guest
Bonjour Philling

Tu trouveras ci joint une procédure ( à intégrer dans this workbook ) qui répondra peu être à ta question ( j'ai interprété , sans en être sur , que tu voulais renommer les onglets uniquement lorsque tu effectuais une modification dans la feuille .)
chaque feuille modifiée est renommée de façon successive de page1 à page x .



Option Explicit
Public i As Byte
Public a As Byte

Private Sub Workbook_Open()
a = 1
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
a = 1
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
'On Error Resume Next
If a = 1 Then
i = i + 1
'Sheets("page" & i).Name = i
ActiveSheet.Name = "page" & i
a = a + 1
End If
End Sub


Le problème est de gérer l'ouverture de fichiers qui comportent déjà cette type d'appellation dans les onglets :
Comme excel n'accepte pas d'avoir deux onglets nommés de la même façon et Comme tu ne veux pas renommer les onglets auxquels tu ne modifies pas , cela se complique

Dans la procédure Private Sub Workbook_SheetChange il y a deux lignes précédées d'une apostrophes . si tu enlèves les apostrophes pour activer les lignes , tu auras possibilité de gérer des doublons de noms d'onglets

Bonne après midi
Michel
 
J

JPH

Guest
Bonjour,
Voila une formule un peu différente de celle de Michel mais "C'EST TON CHOIX" Vu à la télé.
Dès la première modification la page se remome une seule fois.

DOCUMENT JOINT

le script ThisWorkSheet =
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
pageEncours = Sh.Name
If Left(pageEncours, 4) <> "Page" Then Call marquefeuil
End Sub
Dans Module1 =
Sub marquefeuil()
Dim lesfeuilles(100)
Set mondocument = ActiveWorkbook.Worksheets
ttf = mondocument.Count
For fx = 1 To ttf
lesfeuilles(fx) = mondocument(fx).Name
Next
For j = 1 To ttf
If Left(lesfeuilles(j), 4) = "Page" Then cpt = cpt + 1
Next
If cpt = 0 Then 'compteur de page
cpt = 1
Else
cpt = cpt + 1
End If
ActiveSheet.Name = "Page" & cpt
End Sub

Cordialement
 

Pièces jointes

  • NomsPages.zip
    9.3 KB · Affichages: 19
Z

ZON

Guest
Bonjour à tous,


JPH, je la trouve efficace ta macro, un seul bémol il faut utiliser l'évènement sheetActivate il me semble.

Je ne veux pas passer pour un rabat joie mais déclares tes variables...


A+++
 
J

JPH

Guest
Merci Zon, mais tu n'as pas donné le code à Philling ?
Sub Marquefeuil()
Dim lesfeuilles(), Mondocument As Object
Dim Ttf As Byte, Fx As Byte, Cpt As Byte

Set Mondocument = ActiveWorkbook.Worksheets

Ttf = Mondocument.Count
If Ttf >255 then Exit Sub
ReDim lesfeuilles(1 To Ttf)
For Fx = 1 To Ttf
lesfeuilles(Fx) = Mondocument(Fx).Name
If Left(lesfeuilles(Fx), 4) = "Page" Then Cpt = Cpt + 1
Next
Cpt = IIf(Cpt = 0, 1, Cpt + 1) 'équivalent de ton If else
ActiveSheet.Name = "Page" & Cpt
End Sub

Promis je déclarerai mes variables avant de passer les scripts.

Cordialement
 
J

JPH

Guest
Bonsoir,
Pardon Zon mais je n'es pas répondu à ta question :
"l'évènement sheetActivate il me semble."
Pas dans le cas demandé puisque Philling désire renomé une seul fois l'onglet après changement d'une valeur dans une feuille, donc en lecture on change rien.
"Si on ouvre un onglet et qu'on ne s'en sert pas, le n° de page ne doit pas être pris en compte."
Par contre effectivement j'ai balancé du code à la va vite et tes corrections "Zon "sont appréciables, dans le but de faire court selon correction voila le code un peu plus maîgre, car pour ce type d'opération la variable qui servait aux noms des feuilles était obsolette.

Sub Marquefeuil()
Dim Mondocument As Object
Dim Ttf As Byte, Fx As Byte, Cpt As Byte

Set Mondocument = ActiveWorkbook.Worksheets

Ttf = Mondocument.Count
If Ttf > 255 Then Exit Sub
For Fx = 1 To Ttf
If Left(Mondocument(Fx).Name, 4) = "Page" Then Cpt = Cpt + 1
Next
Cpt = IIf(Cpt = 0, 1, Cpt + 1)
ActiveSheet.Name = "Page" & Cpt
End Sub

Merci encore Zon, bien cordialement.
 
@

@+Thierry

Guest
Bonsoir JPH, Zon, Michel, Philling, et Le Forum

Oui c'était assez tordu comme demande et je dois dire que JPH s'en sort royalement !

Just a minor bug, enfin si on veut placer cette dernière macro une seule fois dans le Private Module This Workbook sous l'évènement "Workbook_SheetChange", ce qui simplifie la vie au cas où l'on rajoute des feuilles afin de ne pas à avoir à lancer cette macro dans chaque Private Module de Sheet sous l'évènement "Worksheet_Change"...

Donc voilà comme j'ai placé cette procédure VBA (pas script !! c'est autre chose un VBScript

Dans le Private Module de This WorkBook
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Marquefeuil
End Sub

Dans un Module Standard
Option Explicit

Sub Marquefeuil()
Dim lesfeuilles() As String, Mondocument As Object
Dim Ttf As Byte, Fx As Byte, Cpt As Byte

Set Mondocument = ActiveWorkbook.Worksheets

If Left(ActiveSheet.Name, 4) = "Page" Then Exit Sub

Ttf = Sheets.Count
If Ttf > 254 Then Exit Sub
ReDim lesfeuilles(1 To Ttf)
For Fx = 1 To Ttf
lesfeuilles(Fx) = Mondocument(Fx).Name
If Left(lesfeuilles(Fx), 4) = "Page" Then Cpt = Cpt + 1
Next
Cpt = IIf(Cpt = 0, 1, Cpt + 1) 'équivalent de ton If else
ActiveSheet.Name = "Page" & Cpt
End Sub

En varc ce que j'ai fait :
J'ai mis un test dès le départ car la macro de JPH (en ThisWorkBook évidemment) continue à incrémenter le nom de l'ActiveSheet. J'ai limité avant 255 car après Byte explose (lol), J'ai déclaré la Dynamic Array "lesfeuilles" As String, puisque çà convient et c'est toujours mieux que Variant (Tacite quand non indiqué)... J'ai testé "Mondocument" As Worksheet, Workbook, WorkSheets, WorkBooks etc et j'ai finalement laissé As Object (lol !!)

Sinon je tiens à faire remarquer la Funtion IIf utilisée très judicieusement par JP, et je soulique que c'est vraiment pratique parfois, pour ceux/celles qui voudraient des infos faites une recherche "IIF" sur ce forum STéphane nous a fait des exemples.

Bonne Soirée à tous et toutes
@+Thierry
 
@

@+Thierry

Guest
RE JP, le Fil

Oui cette dernère version montre bien que le Tableau "lesfeuilles" était totalement superflu... Cà ne m'a pas sauté aux yeux en travaillant sur ton code. Par contre il me semble pas avoir vu des correction de Zon dans ce fil ?

Sinon donc, idem pour ma propostion de le mettre en ThisWorkBook sous l'évènement "Workbook_SheetChange"... Mettre un test si la feuille se nomme page...

Bonne Soirée
@+Thierry
 
Z

ZON

Guest
Bonsoir à tous,


Pour la petite histoire, j'avais fait un mail à JPH sans tester en profondeur le code. Je fais ceci (contraire aux US du forum) car ne connaissant pas JPH et que son code fonctionnait, il n'y avait pas lieu d'intervenir (à part pour l'évènement, ce que j'ai fait), c'était juste une autre approche...

Thierry bien vu le 254 mais cela va planter quand même si tu as plus 255 feuilles car le test est fait aprés l'initialisation de Ttf=> juste à inverser les 2 lignes.

If sheets.count >255 then exit sub
Ttf=sheets.count


Enfin en ce qui concerne l'évènement à utiliser à Philing de voir, moi j'ai compris ouverture d'un onglet=>sheet_Activate(=Clic sur onglet)
Sheet_change une cellule doit changer de valeur pour que la procédure s'exécute

A+++
 
@

@+Thierry

Guest
Bonsoir ZOn, le Fil, le Forum


Arf je comprends mieux par mail alors ;-) !! Ou en fait je n'ai pas testé/corrigé le code avec 255 feuilles (lol), j'ai juste noté le 255 qui m'a choqué, mais tu as un oeil averti !!! c'est tout à fait exact ;-)))


Par contre je suis comme JPH, je comprends que Philing souhaite appliquer cette macro par l'évènement Change avec, au choix :
=> Soit ThisWorkBook avec l'évènement Workbook_SheetChange
=> Soit (quoique je trouve très contraignant) dans chaque Private Module de Sheet avec l'évènement "Worksheet_Change".......

Car avec l'évènement "Activate"... si le User Click sur un Onglet par mégarde celui ci sera pris en compte par la macro... Et si je lis le "Cahier des Charges" (lol) Si on ouvre un onglet et qu'on ne s'en sert pas, le n° de page ne doit pas être pris en compte. ......

Ceci dit il y a plein d'évènements, et même "Feeling" pourrait utiliser : "Workbook_BeforePrint".... ou encore "Workbook_BeforeSave"... Enfin il a le choix !!!

Bonne nuit à tous et toutes
@+Thierry
 
P

Philling

Guest
Bonsoir les gars,

Ce que vous faites est épatant, mais je crois on s'est mal compris. Je n'ai apparemment pas été assez précis.
Le numéro de page doit apparaitre dans une cellule et donc sur l'impression papier, et non sur l'onglet lui-même.

Le site m'a envoyé le premier mail, me notifiant une réponse, à 22 h 20. S'il était arrivé plus tôt, j'aurais pu vous freiner dans votre élan.
Je suis désolé pour le temps que vous avez perdu à cause de moi.
En tout cas MERCI pour votre peine.
 
J

JPH

Guest
Bonsoir Zon, Thierry, michel, mais pas de nouvelle de Philling ?
Effectivement je déclenchais l'évenement une seul fois par :
le script ThisWorkSheet =
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
pageEncours = Sh.Name
If Left(pageEncours, 4) <> "Page" Then Call marquefeuil
End Sub
Protégé par le left "Page", mais rendons à César ce qui est à Zon l'idée du "Iif" est de Zon, qu'effectivement nous utilisons pas assez.
Le doc joint à 17h29 "NomsPages.zip" est en état de marche, mais pour la beauté du code Zon a fait un beau geste.
L'homme est grand, la troupe est immense, mais l'équipe est une montagne, " Coubertin" je crois ???

Cordialement
 
J

JPH

Guest
Oupss Philling nos post se croisent,
Pas grave tu laisses les onglets et tu rajoutes :

Ttf = Mondocument.Count
If Ttf > 255 Then Exit Sub
For Fx = 1 To Ttf
If Left(Mondocument(Fx).Name, 4) = "Page" Then Cpt = Cpt + 1
Next
Cpt = IIf(Cpt = 0, 1, Cpt + 1)
ActiveSheet.Name = "Page" & Cpt


cells(1,1) = "Page" & Cpt ' ou ailleurs


End Sub

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 083
Membres
103 458
dernier inscrit
Vulgaris workshop