MACRO Excel: Suppr feuille / Name list

Fermé
bthenault - 25 sept. 2009 à 14:49
 ed - 5 mai 2011 à 17:12
Bonjour,
Je souhaiterai créer une macro, mais j'avoues que là je cale. J'ai essayé d'évoluer en prenant soit une macro en "Boucle" soit en commençant par "pour chaque feuille"... mais je cale.

Alors ce que je souhaiterai, c'est supprimer toute les feuilles dont le nom correspondent à une liste dans un tableau de la feuille Date (correspondant aux cellules C13 à C16)
J'ai essayé ça :
Dim Sheet As Worksheet
For Each Sheet In ThisWorkbook.Worksheets
Name = Sheets("Date").Cells("C13:c16")
If Sheet.Name = Sheet("Name") Then Sheet.Delete
Application.DisplayAlerts = True
Next Sheet
Mais il met une erreur
Et avec la boucle, je m'y perds!:!!

Merci d'avance pour votre aide et vos conseils
A voir également:

6 réponses

Bien sûre les données du tableau évoluent...

En fait, le tableau ressort les noms des onglets à supprimer. Les onglets sont issus d'une mise à jour qui crée une nouvelle feuille et nomme la feuille à la date de jour. Pour éviter de me retrouver avec 500 feuilles, je veux supprimer les feuilles de la semaine suivante (sauf le vendredi). j'ai donc créé un tableau dans exel, qui me donne les dates (et donc les nom des feuilles) que je ne dois pas garder.
0
semaine précépdente pardon
0
salut !

je te réponds rapidement avant de sortir (pas le temps de tester la solution) mais sur le principe il faut que tu changes l'ordre des boucles ou que simplement tu n'en fasses qu'une seule. Je m'explique : si j'ai bien compris ton problème, tu possèdes le nom des onglets à supprimer sur une feuille excel. il faut donc regarder tous ces noms l'un à la suite de l'autre et en conséquence supprimer l'onglet correspondant.

de tête ça donne du code comme ça :

Dim plageNoms as Range
set plageNoms = Range("ta plage qui contient les noms des onglets à supprimer")
Dim Name as String

For Each cell In plageNoms
' là on affecte le contenu de la cellule à ta variable Name
Name = cell.Value
' et on supprime l'onglet correspondant
Sheets("Name").Delete
Application.DisplayAlerts = True

Next cell

bon courage (et bonne soirée !)
ed
0
Merci Ed
C'est presque ça. La solution n'est pas loin, j'avais fait plus compliqué lol !
Le soucis est qu'en effet l'onglet est à la date du jour, mais c'est fait par macro, et la macro nomme le jour de cette manière "2392009" pour une date du 23/09/2009. Forcément le nom de la feuille ne correspond par textuellement à la date. C'est pourkoi j'avais créé un tableau à part sur une autre feuille pour faire les recherches. J'ai indiqué sur chaque page dans la cellule G3 la date de mise à jour.

Le soucis que j'ai c'est de dire "Supprimer la feuilles dont la cellule G3 est dans PlageNoms"

Dim plageNoms As Range
Set plageNoms = Range("c13:c16")
Dim Sac As Range
Set Sac = Range("G3")
Dim Name As String
For Each Sac In plageNoms

Sheet.Delete ====>>>> Ne marche pas, il faut nommer la feuille mais comment faire car cela dépend si la cell G3 contient la date...

Application.DisplayAlerts = True

Je ne sais pas comment dire cela...
0
bthenault > bthenault
28 sept. 2009 à 17:12
j'ai essayé ça

Sub dernierjmois()


Application.DisplayAlerts = False
For Each Sheet In ThisWorkbook.Worksheets
If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 2 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 3 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 4 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 5 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 6 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 7 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 8 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 9 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 10 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 11 + 1, 0) Then If Not Sheet.Range("G3") = DateSerial(2009, 12 + 1, 0) Then If Not Weekday(Sheet.Range("G3")) = 6 Then If Sheet.Range("G3") < Date - 8 Then Sheet.Delete
Next Sheet


Application.DisplayAlerts = True




End Sub

La première partie me permet de dire que si la date, n'est pas l'un des dernier jours de chaque mois, si ce n'est pas un vendredi, et enfin si elle n'est pas inférieure à 8 jours, alors la feuille sdoit être supprimée. Mais je conserve le même problème, il me supprime la feuille active, et pas la feuille contenant la date concernée...
0
bthenault Messages postés 55 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 8 juin 2011 1
5 mai 2011 à 13:43
Je cherche à simplifier ce que j'avais créé :
Application.DisplayAlerts = False
For Each Sheet In Workbooks("1er Trimestre 2011.xls").Worksheets
If Sheet.Range("G3") < Date - 8 Then
If Not Weekday(Sheet.Range("G3")) = 2 Then
If Not Sheet.Range("G3") = DateSerial(2011, 1 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 2 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 3 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 4 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 5 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 6 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 7 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 8 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 9 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 10 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 11 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2011, 12 + 1, 0) Then Sheet.Delete
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If
Else
End If


Next Sheet


Application.DisplayAlerts = True


je ne sais pas comment imbriquer cela. je réexplique, j'ai une date dans une cellule que chaque feuille. Je dois supprimer les onglets dont la date est supérieure à 8 jours, sauf si c'est le dernier jour du mois ou un lundi...
0
salut bthenault !

si je récapitule, tes onglets sont toujours nommés avec "23092009" ou similaire ?
et dans chaque onglet tu as une case qui contient la date de l'onglet ?

je suis en train d'essayer quelque chose, je te tiens au jus !

à bientôt,
ed
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
essaie ça :
(regarde bien le code : à un moment j'insère




Sub suppr_feuilles()

Application.DisplayAlerts = False

Dim fin_janv As Date
Dim fin_fév As Date
Dim fin_mar As Date
Dim fin_avr As Date
Dim fin_mai As Date
Dim fin_juin As Date
Dim fin_juil As Date
Dim fin_aou As Date
Dim fin_sep As Date
Dim fin_oct As Date
Dim fin_nov As Date
Dim fin_déc As Date

aujourdhui = Date
année = "2011" 'à changer l'année prochaine !
fin_janv = "31/01/" & année
fin_fév = "28/02/" & année
fin_mar = "31/03/" & année
fin_avr = "30/04/" & année
fin_mai = "31/05/" & année
fin_juin = "30/06/" & année
fin_juil = "31/07/" & année
fin_aou = "31/08/" & année
fin_sep = "30/09/" & année
fin_oct = "31/10/" & année
fin_nov = "30/11/" & année
fin_déc = "31/12/" & année

'Détermination du jour (donne 1 à 7 sachant que dimanche = 1 et samedi = 7)
For i = 1 To Sheets.Count
Sheets(i).Range("G4").FormulaR1C1 = "=WEEKDAY(R[-1]C)"
Next 'j'ai supposé que ta case G4 est libre (direct en dessous de G3)



'Boucle décroissante (pour éviter les erreurs lorsqu'on supprime les feuilles)
For i = Sheets.Count To 1 Step -1

jour = Sheets(i).Range("G4").Value

'Contrôle si plus de 8 jours
If Sheets(i).Range("G3").Value > aujourdhui + 8 Then
Sheets(i).Delete
'Contrôle si fin de mois
ElseIf Sheets(i).Range("G4").Value = fin_janv Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_fév Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_mar Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_avr Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_mai Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_juin Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_juil Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_aou Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_sep Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_oct Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_nov Then
Sheets(i).Delete
ElseIf Sheets(i).Range("G4").Value = fin_déc Then
Sheets(i).Delete
'Contrôle si c'est un lundi - si pas on supprime
ElseIf jour <> 2 Then
Sheets(i).Delete
End If

Next

Application.DisplayAlerts = True

End Sub





est ce que c'est ce qu'il te fallait ?
ed
0
ah, le début a été coupé.
je disais : j'insère une fonction qui détermine le jour de la date en question dans la case G4 de chaque feuille.

ensuite on compare la date qui est dans G3 aux fins de mois (déclarées en variable type date) dans une boucle for décroissante (afin de ne pas faire d'erreur : si tu supprime on onglet et qu'on compte en croissant, il finit par y avoir une erreur).

enfin on compare la valeur de "jour" à 2 (dimanche=1, lundi=2) et on supprime si nécessaire.

voilà !
0