Effacer feuilles en fonction de nom dans tableau

bonsoir

j'aimerais que a la fermeture d'un classeur Excel (beforclose) les feuilles dont les nom ne sont pas ceux déclarés dans ce tableau soit supprimé mais je ne sais pas comment faire ?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim feuilles As Worksheet
    Dim SHT()
    SHT(0) = "Acceuil"
    SHT(1) = "Manager"
    SHT(2) = "Brouillons"
    SHT(3) = "Mots de passe autorisés"
        For i = 4 To 23
            SHT(i) = "utilisateur" & i - 3
        Next
        For x = 24 To 43
            SHT(x) = "Brouillons" & x - 3
        Next
    For Each feuilles In Sheets
        If feuilles <> SHT Then feuilles.Delete
    Next
End Sub

qu'est ce que je dois modifier SVP ?

PS: "utilisateur" & i-3 parce que la première feuille se nomme utilisateur1 jusqu'a utilisateur 20

de même pour les feuilles brouillons

Bonjour,

Une proposition à étudier.

Cdlt.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
    Application.DisplayAlerts = False
    For Each ws In ThisWorkbook.Worksheets
        Select Case ws.Name
            Case "Accueil", "Manager", "Brouillons", "Mots de passe autorisés":
            Case Else: ws.Delete
        End Select
    Next ws
End Sub

Bonjour addou,

Dans ton code VBA, pour ta 2ème boucle For, c'est inutile d'utiliser la variable x :

tu peux tout simplement réutiliser la même variable i ; de plus, si tu mets Next i

plutôt que Next, ça accélère l'utilisation du code car VBA n'a pas à rechercher

quelle variable il doit incrémenter :

  For i = 4 To 23
    SHT(i) = "utilisateur" & i - 3
  Next i
  For i = 24 To 43
    SHT(i) = "Brouillons" & i - 3
  Next i

comme tu as oublié de déclarer i, complète ton 2ème Dim : Dim SHT(), i As Byte ; cela aussi accélère

l'exécution du code, car sans avoir déclaré i, il est de type Variant par défaut ➯ ce type occupe plus de

place en mémoire qu'un autre type de variable, un entier prend donc moins de place, et les calculs sur

des entiers sont bien plus rapides !


Pour toutes les feuilles que tu as indiquées dans ton tableau : si elles sont toujours au début de ton classeur

et que leur nombre ne change pas, tu as donc 44 feuilles puisque tu pars de SHT(0) et tu vas jusqu'à SHT(43)

et tu pourrais alors supprimer toutes les feuilles supplémentaires :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim n As Byte, i As Byte
  n = Worksheets.Count: If n <= 44 Then Exit Sub
  Application.DisplayAlerts = False
  For i = 45 To n: Worksheets(45).Delete: Next i
  Application.DisplayAlerts = True
End Sub

NB : le <= plutôt que = est une sûreté, si un utilisateur supprime une (ou plus) des 44 feuilles de base ; ATTENTION :

dans la boucle For, le 45 de Worksheets(45).Delete n'est pas une erreur ! à toi de comprendre pourquoi...

Cordialement

Merci de vous intéresser a ma question

l’objectif de cette procédure et de supprimé les feuilles dont les noms ne sont pas préalablement défini a la fermeture du classeur afin d'éviter qu'il devienne plus volumineux.

le truc c'est que le classeur n'est pas a l’abri d'insertion de feuilles au milieu donc je peut garantir que les 44 feuilles reste toujours en première position

PS: oui dhany j'ai compris le 45 car après chaque changement de valeur de i la feuille 45 est supprimée et donc la feuille 46 devient 45 et on recommence et merci pour le i j'ai juste changé un truc

      For i = 4 To 23
        SHT(i) = "utilisateur" & i - 3
      Next i
      For i = 24 To 43
        SHT(i) = "Brouillons" & i - 23
      Next i

Bonsoir,

Quid de ma proposition ?

Cdlt.

merci Jean-Eric

mais si je ne me trompe pas (je suis un novice après tout donc c'est possible que je me trompe) ta méthode ne prend pas en compte les 40 feuilles de utilisateur1 a utilisateur20, et de Brouillons1 a Brouillons20 , non?

Bravo pour avoir compris, pour le 45 : c'est exactement ça !!!

Tu as bien fait de mettre i - 23, comme ça : à partir de "Brouillons 1" (mais ça s'rait p't'être mieux

au singulier) ➯ SHT(i) = "Brouillon" & i - 23 (sans le s)

D'après le contexte de ta phrase « le truc... », je pense qu'il faut la lire ainsi :

Tu a écrit :

le classeur n'est pas à l’abri d'insertion de feuilles au milieu donc je ne peux pas

garantir que les 44 feuilles restent toujours en première position

Si c'est bien comme ça qu'il faut le comprendre, la solution que j'ai proposée n'est plus valable.

Cordialement

Re,

Ma proposition fait ce que tu as demandé.

A savoir, supprimer toutes les feuilles sauf les feuilles Accueil, Manager, Brouillons et Mots de passe autorisés.

Cdlt.

Nota : fais attention à l'orthographe du mot accueil;

ooops ! merci Jean-Eric pour le accueil

mais comme j'ai dis il y a en tout 44 feuilles dont 4 sont celle que tu a mis dans ton code

les autres feuilles sont utilisateur1, utilisateur2,..........utilisteur20, Brouillons1, Brouillons2, Brouillons3,..............Brouillons20

la variable i est juste afin d’éviter de récrire les 40 noms de feuilles

Tu as raison à propos des autres feuilles, et je te propose d'essayer ce code VBA :

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim FX As Worksheet, chn As String
  Application.DisplayAlerts = False
  For Each FX In Worksheets
    chn = FX.Name
    If chn <> "Accueil" And chn <> "Manager" _
      And chn <> "Mots de passe autorisés" _
      And Left$(chn, 9) <> "Brouillon" _
      And Left$(chn, 11) <> "utilisateur" _
      Then FX.Delete
  Next FX
End Sub

Merci de me donner ton avis.

Cordialement,

dhany

RE,

J'ai lu entre les lignes et oublié le principal.

Cdlt

Merci quand même Jean-Eric

dhany je m’apprêtais a écrire PARFAIT , car l'idée du LEFT est excellente je n'y aurais jamais penser même si cela m'aurais prix 10 an

sauf que y'a un seul petit hic la dedans : si quelqu'un ajoute des feuilles Brouillons21.........Brouillons1501 elle ne seront pas supprimer , de même pour utilisateur non ???

Oui, tu as raison ; dans ce cas je te propose ce nouveau code VBA :

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim FX As Worksheet, chn As String, k As Integer
  Application.DisplayAlerts = False
  For Each FX In Worksheets
    chn = FX.Name
    If Left$(chn, 12) = "Brouillons" Then
      k = Val(Right$(chn, Len(chn) - 12))
      If k > 20 Then FX.Delete
    ElseIf Left$(chn, 11) = "utilisateur" Then
      k = Val(Right$(chn, Len(chn) - 11))
      If k > 20 Then FX.Delete
    ElseIf chn <> "Accueil" And chn <> "Manager" _
      And chn <> "Mots de passe autorisés" _
      Then FX.Delete
    End If
  Next FX
End Sub

À te lire.

on y été presque dhany merci beaucoup et désolé de vous casser ainsi la tête.

j'ai retiré cette ligne en bas de code (elle est répété) mais le code m'a supprimé toutes les feuilles Brouillons

mais il ne l'a pas fait pour les utilisateurs =>> je pense que le problème vient du fait que y'a une feuille nommé Brouillons non numéroté et pas d’utilisateur non numéroté ce qui fait le le nombre de caractère de la condition était erroné , suis je dans le vrai ?

And Left$(chn, 11) <> "utilisateur" _

Pour la ligne de code répétée, j'm'en suis aperçu juste après avoir validé mon post et j'ai corrigé aussitôt après ;

pour les feuilles Brouillons, celle non numérotée "Brouillons" ne devrait pas être supprimée et tu dis qu'elle

est supprimée, c'est ça ? si oui, ça me paraît bizarre pour cette raison :

Le nom est "Brouillons" soit exactement 11 caractères ; si on enlève les 11 caractères de gauche, il reste rien,

c'est-à-dire une chaîne de caractères vide de longueur 0 caractère ; pour k, la valeur d'une chaîne vide est 0

donc comme ça supprime une feuille seulement si k > 20, le test est négatif et la feuille non supprimée.


Si tu as des feuilles "utilisateurs" et pas "utilisateur" :

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim FX As Worksheet, chn$, chn2$, k%
  Application.DisplayAlerts = False
  For Each FX In Worksheets
    chn = FX.Name: chn2 = Left$(chn, 12)
    If chn2 = "Brouillons" Or chn2 = "utilisateurs" Then
      k = Val(Right$(chn, Len(chn) - 12))
      If k > 20 Then FX.Delete
    ElseIf chn <> "Accueil" And chn <> "Manager" _
      And chn <> "Mots de passe autorisés" _
      Then FX.Delete
    End If
  Next FX
End Sub

Qu'en penses-tu ?

Bonsoir,

Avant tout je tiens a te remercie infiniment pour le fait de t’intéresser a mon poste , puis :

en ce qui concerne les feuilles utilisateur (non utilisateur"s" car j'ai pas de "s" a la fin) le code précédant ce derniers posté marche impeccablement

en revanche il supprime toutes les feuilles Brouillons et c'est ce qui me semble illogique !!!

Bonsoir addou,

J'ai été très occupé aujourd'hui, c'est pourquoi je viens tout juste de lire ton dernier message ;

j'ai bien compris que c'était déjà bon avant pour les feuilles "utilisateur" (sans s final), donc

je suis d'accord avec toi que c'est mieux de reprendre à partir de mon code VBA précédent !

Je devais être fatigué hier, car j'ai fait une erreur d'étourderie vraiment stupide !!!

le problème venait tout simplement du fait que le mot "Brouillons" a 10 caractères et pas 12 !

donc le mot "Brouillons" n'était jamais reconnu ➯ 2ème partie ElseIf ignorée car ce n'est pas

"utilisateur" ; puis pour la 3ème partie ElseIf : différent de "Accueil", différent de "Manager",

et différent de "Mots de passe autorisés" ➯ on supprime la feuille !

La cause et l'explication étant trouvées, le remède est hyper simple : changer 12 en 10 ;

mais attention : cette modif est à faire en 2 endroits différents :

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim FX As Worksheet, chn As String, k As Integer
  Application.DisplayAlerts = False
  For Each FX In Worksheets
    chn = FX.Name
    If Left$(chn, 10) = "Brouillons" Then
      k = Val(Right$(chn, Len(chn) - 10))
      If k > 20 Then FX.Delete
    ElseIf Left$(chn, 11) = "utilisateur" Then
      k = Val(Right$(chn, Len(chn) - 11))
      If k > 20 Then FX.Delete
    ElseIf chn <> "Accueil" And chn <> "Manager" _
      And chn <> "Mots de passe autorisés" _
      Then FX.Delete
    End If
  Next FX
End Sub

Je crois que ça devrait aller, cette fois ! (sinon je mange mon chapeau)

Cordialement

Bonsoir dhany,

La c'est PARFAIT , je tien a vous remercie infiniment pour vous avoir intéresser a mon sujet aussi d'y avoir consacré de votre temps.

de même je vous informe que vous m'avez été d'une grande aide et surtout j'ai beaucoup appris grâce a vous.

merci! et je coche sur la réponse

Rechercher des sujets similaires à "effacer feuilles fonction nom tableau"