MACRO Excel: Suppr feuille / Name list

bthenault -  
 ed -
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
Configuration: Windows XP
Firefox 3.0.14

6 réponses

  1. bthenault
     
    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
    1. bthenault
       
      semaine précépdente pardon
      0
  2. ed
     
    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
    1. bthenault
       
      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
      1. bthenault > bthenault
         
        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
  3. bthenault Messages postés 58 Statut Membre 1
     
    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
  4. ed
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ed
     
    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
  7. ed
     
    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