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
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