Microsoft 365 activation de la dernière feuille créée selon son n° (pas sa position)

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,

J'ai besoin de pouvoir activer la dernière feuille créée dans mon classeur
Par exemple ici j'ai créé les Feuile1 à 6

le code "Sheets(Sheets.Count).Select" fonctionne

mais active la dernière Feuille selon sa position dans le classeur
alors que c'est la dernière créé soit la Feuil6 que je souhaite activer.

Malgré mes recherches et essais, je n'ai pas trouvé comment coder.
Pourriez-vous m'aider sachant que mes feuilles sont créées depuis longtemps et donc antérieurement au code que vous m'aurez (je l'espère LOL) transmis.
Je joins un fichier test.

Avec mes remerciement,
Je vous souhaite à toutes et à tous une belle journée,
amicalement,
lionel,
 

Pièces jointes

  • derniere_Feuille.xlsm
    22.1 KB · Affichages: 10

eriiic

XLDnaute Barbatruc
Bonjour à tous,

comme ce n'est que la dernière qui t'intéresse, autant ne stoker que celle-ci dans un nom :
VB:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
    ThisWorkbook.Names.Add Name:="derniere", RefersTo:=Sh.Name
End Sub

Sub test()
    Sheets([derniere]).Activate
End Sub
ou stocker le codename si le nom peut être amené à être modifié.
eric
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonsoir Eric,

Merci d'êtes là toi aussi :)

Mais ton code ne va pas fonctionner.
Normal car j'aurais du mieux expliquer :
Le fichier dans lequel la code va être utilisé est un fichier de facturation.
Il y a une feuille "matrice" nommée "Facture"
- les infos par client sont saisie dans cette feuille dans laquelle il y a un bouton pour facturer.
- Quand je clique sur le bouton, une nouvelle feuille est créée et est renommée au nom du client concerné
et ainsi de suite pour tous les clients,

Donc la feuille ne s'appelle plus "dernière" ou "Feuil1" mais du nom client client concerné.
lionel,
 

ChTi160

XLDnaute Barbatruc
bonsoir lionel
Bonsoir le Fil,le Forum
ne peux tu creer ce nom lors de la procedure qui nomme la nouvelle feuille?
ThisWorkbook.Names.Add Name:="derniere", RefersTo:= NomFeuille
non teste
ne faut il pas effacer les .Names , crees precedemment?
jean marie
 

eriiic

XLDnaute Barbatruc
Oui, tu connais le nom du client à la création de la feuille, c'est ce nom qui doit être mémorisé en plus de l'attribuer à la feuille.
Si vraiment c'est impossible à ce moment il faut mémoriser son codename et boucler sur toutes les feuilles pour le retrouver.

ne faut il pas effacer les .Names , crees precedemment?
J'avais testé, le nouveau écrase l'ancien
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @arthour973, @Roblochon, @patricktoulon, @job75, @ChTi160, @eriiiic,

Une tentative de mapomme:
  • dans le module de code de ThisWorkbook, Il y a une procédure évènementielle Workbook_NewSheet(...) qui s'exécute à la création d'une nouvelle feuille
  • dans le module mod_PlusRecent, il y a une procédure afficherPlusRecente(...) qui affiche la feuille créée le plus récemment

Normalement (à contrôler) :
  • l'ordre des feuilles peut être modifié
  • les noms des feuilles peuvent être modifiés
  • les codename peuvent être modifiés
  • les feuilles peuvent être supprimées
  • s'il ne reste que les feuilles présentes à la création du classeur, alors on affiche la feuille la plus à droite
Merci de bien vouloir le tester et de trouver les erreurs (en général, les autres trouvent l'erreur la plus grosse et la plus évidente qui puisse exister)

code de Workbook_NewSheet :
VB:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim xsh, i&, max&, DerCodeName
   'parcours de tous les item "indice" de chaque feuille de calcul
   'pour déterminer le max des indices et la feuille associée
   'l'item indice est le premier (item numéro 1)
   On Error Resume Next
   For Each xsh In ThisWorkbook.Worksheets
      If LCase(xsh.Name) <> xsh.Name Then
         i = 0: i = CLng(xsh.CustomProperties.Item(1))
         If i > max Then max = i
      End If
   Next xsh
   On Error GoTo 0
   'on ajoute dans CustomProperties de la nouvelle feuille le mouveau max
   Sh.CustomProperties.Add "indice", (max + 1)
End Sub

Code de afficherPlusRecente(...):
VB:
Sub afficherPlusRecente()
Dim xsh, i&, max&, leNom$
   'parcours de tous les item "indice" de chaque feuille de calcul
   'pour déterminer le max des indices et la feuille associée
   'l'item indice est le premier (item numéro 1)
   On Error Resume Next
   For Each xsh In ThisWorkbook.Worksheets
      i = 0: i = CLng(xsh.CustomProperties.Item(1))
      If i > max Then
         max = i
         leNom = xsh.Name
      End If
   Next xsh
   'Si leNom est vide, on active la dernière feuille du classeur
   'sinon on affiche la dernière feuille créée
   If leNom = "" Then
      ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).Select
   Else
      ThisWorkbook.Worksheets(leNom).Select
   End If
End Sub
 

Pièces jointes

  • arthour973- der des der- v1.xlsm
    25.2 KB · Affichages: 8
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Gérard,
Bonjour Patrick,
Bonjour Eric,
Bonjour Jean-Marie,
Bonjour Roblochon ... Le Forum,

@mapomme
Merci pour ce code effectivement super génial :)
Je viens de tester avec le fichier que tu as joint et j'y ai vu, me semble-t-il ,un souci "mineur" et non gênant pour moi.
Je vais tester plus avant dans mon fichier de travail et je reviendrai pour te le dire.
Encore merci à toi :)
lionel,
 

patricktoulon

XLDnaute Barbatruc
Bonjour a tous

cette fonction n'existant pas je vois la une fonction in/out a faire

peut être avec property get/let

ou simplement avec une fonction et l'argument optionel

if ismissing( argument ) then
récupération du custompropertie.item(x)
else
création de la customproperties (add)
end if
 

patricktoulon

XLDnaute Barbatruc
re

bon j'ai testé avec properties get /let ca fonctionne correctement

dans le module thisworkbook
VB:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
LastCreatedSheet = Sh
End Sub

dans un module standard
Code:
Property Let LastCreatedSheet(Sh)
    Dim xsh, i&, max&, DerCodeName
    'parcours de tous les item "indice" de chaque feuille de calcul
    'pour déterminer le max des indices et la feuille associée
    'l'item indice est le premier (item numéro 1)
    On Error Resume Next
    For Each xsh In ThisWorkbook.Worksheets
        If LCase(xsh.Name) <> xsh.Name Then
            i = 0: i = CLng(xsh.CustomProperties.Item(1))
            If i > max Then max = i
        End If
    Next xsh
    On Error GoTo 0
    'on ajoute dans CustomProperties de la nouvelle feuille le nouveau max
    Sh.CustomProperties.Add "indice", (max + 1)
End Property

Property Get LastCreatedSheet()
    Dim xsh, i&, max&, leNom$
    'parcours de tous les item "indice" de chaque feuille de calcul
    'pour déterminer le max des indices et la feuille associée
    'l'item indice est le premier (item numéro 1)
    On Error Resume Next
    For Each xsh In ThisWorkbook.Worksheets
        i = 0: i = CLng(xsh.CustomProperties.Item(1))
        If i > max Then
            max = i
            leNom = xsh.Name
        End If
    Next xsh
    Set LastCreatedSheet = Sheets(leNom)
End Property

sub de test
Code:
Sub test2()
    MsgBox LastCreatedSheet.Name
End Sub

chapo stapple160 :)

quand je pense que pour une incrementation invisible ex:facture,etc ce principe est parfait j'ai honte des procédés que j'utilise :oops:
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 126
Membres
103 127
dernier inscrit
willwebdesign