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.