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

job75

XLDnaute Barbatruc
Bonjour Lionel, le fil,

Bien que la solution de mon post #27 soit de loin la solution la plus simple je reviens avec une autre solution via le CodeName.

Placez ce code dans ThisWorkbook :
VB:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim a, vbc As Object, i%
a = [Liste]
If Not IsArray(a) Then ReDim a(1 To 100) As String '100 modifiable
For Each vbc In Me.VBProject.VBComponents
    If vbc.Name = Sh.CodeName Then
        For i = UBound(a) - 1 To 1 Step -1
            a(i + 1) = a(i) 'décale chaque item d'un cran vers la fin de liste
        Next i
        a(1) = vbc.Name 'toujours en tête de liste
        Me.Names.Add "Liste", a ', Visible:=False 'nom défini, éventuellement masqué
    End If
Next
End Sub

Sub derniere_feuille()
Dim a, i%, x$, s As Object
a = [Liste]
If IsArray(a) Then
    For i = 1 To UBound(a)
        x = a(i)
        For Each s In Sheets
            If s.CodeName = x Then s.Select: Exit Sub
    Next s, i
End If
MsgBox "Créez de nouvelles feuilles..."
End Sub
Les CodeNames sont stockés (dans le bon ordre) dans le nom défini Liste éventuellement masqué.

Comme toutes les formules sa formule ne doit pas dépasser 8192 caractères, ce qui sera le cas avec 100 CodeNames.

Bien noter que dans la 1ère macro je passe par le VBAProject car sans cela Sh.CodeName peut renvoyer le texte vide "".

Pour que l'accès au VBAProject soit possible par macro il faut avoir coché l'option :

- sur Excel 2003 et versions antérieures Faire confiance au projet Visual Basic (menu Outils-Macro-Sécurité-Editeurs approuvés)

- sur Excel 2007 et versions suivantes Accès approuvé au modèle d'objet du projet VBA (onglet Fichier-Options-Centre de gestion de la confidentialité-Paramètres...-Paramètres des macros).

A+
 

Valtrase

XLDnaute Occasionnel
Bonjour valtrase
Un grand merci pour ce code :)
Je testerai et je reviendrai te dire,
Amicalement,
lionel,
Je ne sais pourquoi si la clé n'est pas crée avant ce code bugge
VB:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
SetParam "LastSheetCreated", Sh.Name
End Sub
Je vais regarder ça de plus près.

Je suis une truffe....
si je crée une feuille alors qu'une autre se crée c'est normal que notre pauvre excel se plante.
Donc pour que cela fonctionne la feuille paramètre doit être crée avant.
Ensuite pour la clé c'est bon.
 

Valtrase

XLDnaute Occasionnel
Bonjpur Arthour973
Bonjour valtrase
Bonjour le Fil ,le forum
Ne manque t'il pas la fonction SheetExist ?
VB:
SheetExist[/B](shParam)
jean marie

Possible ....:rolleyes:
VB:
' Procedure : SheetExist
' Date      : 15/12/2016
' Auteur    : JeanPaul
' Objectif  : Tester si une feuille existe
' Entrée    :
' Sortie    : True ou False
' Note      :
' Exemple   :       Retour :
Public Function SheetExist(ByVal stFeuille) As Boolean
    On Error Resume Next
    SheetExist = Not (ThisWorkbook.Sheets(stFeuille) Is Nothing)
End Function

De plus pour ne pas avoir de problèmes lors d'un renommage de feuille il vaut mieux utiliser le CodeName de la feuille.
Code:
Private Sub Workbook_NewSheet(ByVal sh As Object)
SetParam "LastSheetCreated", sh.CodeName
End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bon ça devient un délire la maintenant ,nous voila avec un sheets supplémentaire

Ok je peux rigoler moi aussi???
d'accords la blague de chez blague

dans le module thisxworkbook on va mettre ceci
VB:
Option Explicit
'ligne2 a ne ps supprimer
Property Get LastCreatedSheet()

End Property

et la vous êtes dans une attitude interrogative qui en général amuse tout le monde

et on rajoute ceci dans le thisworkbook
Code:
'ligne a ne ps supprimer
'ligne a ne ps supprimer
Private Sub Workbook_NewSheet(ByVal Sh As Object)
With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
      .DeleteLines 3, 3
        .insertlines 3, "Property Get LastCreatedSheet()" & vbCrLf & "LastCreatedSheet=""" & Sh.Name & """" & vbCrLf & "End Property"
End With
End Sub
la déjà on rigole moins

mais après avoir ajouté un sheet et que l'on test ceci n importe ou dans n'importe quel module du classeur y compris le thisworkbook
la ça rigole encore moins
Code:
Sub test()
MsgBox ThisWorkbook.LastCreatedSheet
End Sub
on rigole on rigole ;)

demo3.gif


vous prefereriez peut etre en object ?? ;)
 
Dernière édition:

Valtrase

XLDnaute Occasionnel
J'espère que c'est bon là
VB:
Public Function FormatParamKeyText(Text As String, Optional Format As VbStrConv = vbProperCase) As String
    Dim tabTemp, i As Integer
    tabTemp = Split(Text, ".", , vbTextCompare)
    For i = LBound(tabTemp) To UBound(tabTemp)
        tabTemp(i) = StrConv(tabTemp(i), Format)
    Next
    FormatParamKeyText = Join(tabTemp, ".")
End Function

et si quelqu'un supprime une feuille....
Pour info tout mon code n'est pas testé.
 

Discussions similaires