Suppression sous condition

Bonjour,

Débutant, je ne suis qu'à la leçon 4, sur les conditions, des cours vba du présent site et m'embrouille un peu avec les codes If, Endif, Then et Else.

Mon objectif est de construire une macro permettant de supprimer, dans un classeur excel donné et ouvert, tous les onglets dont la cellule B45 ne comporte pas de date.

J'ai donc en fait 2 types d'onglets :

Ceux dont la cellule B45 comporte une chaîne de caractères suivie d'une date au format xx/xx/xxxx. C'est ceux qu'il faut garder.

Ceux dont la cellule B45 comporte une chaîne de caractères sans aucune date. C'est ceux qu'il faut Supprimer.

Pour ceux qui pourraient me proposer une macro atteignant cet objectif, merci de noter (en verte par convention) ce à quoi correspond chaque ligne afin que je puisse faire un parallèle avec les cours vba que je bosse actuellement.

Encore merci pour votre aide.

Bonjour,

Je ne suis pas hypercalé en VBA, mais je te propose ceci.

Si vous avez des critiques ou observations sur le code, lâchez-vous !

Public Sub suppression()
    Dim s
    'Pour chaque feuille du classeur
    For Each s In ThisWorkbook.Worksheets
        'Si les 10 derniers caractères de la cellules B45 de la feuille ne correspondent pas à une date
        If Not (IsDate(Right(s.Range("B45"), 10))) Then
            'S'il ne reste qu'une seule feuille
            If Worksheets.Count = 1 Then
                'Affichage d'une alerte
                MsgBox "Il ne reste qu'une feuille dans le classeur." & vbCrLf & "Fin de la procédure."
                'On quitte la procédure
                Exit Sub
            'Sinon, suppression de la feuille
            Else
                s.Delete
            End If
        End If
    Next
End Sub

Super et maerci, ça le fait au top.

Sauf qu'avant de supprimer les onglets en question un message d'alerte me prévient que l'onglet contenant des données il faut que je confirme la suppression d'où un clic nécessaire avant la suppression de chaque onglet et il y en a plus de 1000 !

Je pense qu'il faudrait introduire

Application.DisplayAlerts = False et Application.DisplayAlerts = True

pour annuler cette alerte mais je n'en suis pas certain et puis il faudrait savoir ou les placer dans ta macro. Je ne sais pas quel(s) code(s) de ta macro il faudrait encadrer.

Par ailleurs, ta macro m'apprend une commande fort utile. Celle qui consiste à dire : "ouvre chaque onglet du classeur" afin d'appliquer une nouvelle commande mais là encore manifestement je ne suis pas encore au niveau.

En effet, j'ai encadré ma nouvelle commande (simple) par :

Dim s

'Pour chaque feuille du classeur

For Each s In ThisWorkbook.Worksheets

MON CODE

Next

Et cela ne marche pas. Pas de message de débogage et au lieu d'appliquer ma commande sur chaque onglet, un seul onglet est traité et même pas avec ma commande dans la mesure ou il se retrouve vide !!!

T'en penses quoi ?

Oui, tu as raison, tu peux placer Application.DisplayAlerts = False en début de sub. Après, faudrait voir ton code, là, comme ça...

Mon code qui fonctionne onglet par onglet est le suivant :

Sub Macro10()

'

' Macro10 Macro

Rows("1:1").Select

Rows("1:44").Select

Range("1:44,46:50").Select

Range("A46").Activate

Range("1:44,46:50,64:150").Select

Range("A64").Activate

Selection.Delete Shift:=xlUp

Range("A:A,D:G,I:J").Select

Range("I1").Activate

Selection.Delete Shift:=xlToLeft

End Sub

Si je lui associe de quoi exécuter tous les onglets existants comme ci-dessous ça le fait plus :

Sub Macro10()

'

' Macro10 Macro

Dim s

'Pour chaque feuille du classeur

For Each s In ThisWorkbook.Worksheets

Rows("1:1").Select

Rows("1:44").Select

Range("1:44,46:50").Select

Range("A46").Activate

Range("1:44,46:50,64:150").Select

Range("A64").Activate

Selection.Delete Shift:=xlUp

Range("A:A,D:G,I:J").Select

Range("I1").Activate

Selection.Delete Shift:=xlToLeft

Next

End Sub

Quant à la fonction Application.DisplayAlerts = False en début de sub, ça marche nickel

Essaie :

s.Select

avant d'accéder aux plages de cellules pour te placer sur la feuille en question.

Ça équivaudrait à :

s.Rows("1:1").Select
...

avec les s. à chaque fois.

Ou juste avant l'accès aux plages :

With s
 .Rows("1:1").Select
 ...
End With

Yoooooooo, ça marche au top.

Pour quelqu'un qui prétend ne pas être "hypercalé" en VBA, je trouve que t'arrives à faire ce que tu veux et me languis d'arriver à ce niveau...

Je continue à intégrer les cours un par un même si je ne vois pas l'utilité immédiate de ce que j'apprends (du moins pour mon projet en cours). Et il est vrai qu'en apprenant, en parallèle, des commandes qui ne sont pas encore à mon programme d'apprentissage mais qui servent directement à l'élaboration de mon projet, je pense qu'à terme ma progression sera plus rapide.

Tous les codes que tu m'as communiqué sont définitivement intégrés, c'est de l'acquis, lol et t'en remercie infiniment.

Après, sans vouloir abuser de ton temps j'aimerais pouvoir te soumettre d'autres manip.

Dis-moi donc si je peux me permettre.

En tous les cas un grand grand merci pour tes réponses.

Cordialement.

Rechercher des sujets similaires à "suppression condition"