Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 VBA - simplifier macro (bloc IF/End IF)

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

AntoineM

XLDnaute Junior
Bonjour le forum,

J'ai une macro qui supprime des onglets si le noms n'est pas contenu dans une liste.
Cependant, j'ai environ 12 onglets que je ne souhaite pas toucher.

J'ai donc écris comme un mec sans finesse :
VB:
       If Ws.Name <> "Info" Then
         If Ws.Name <> "Data" Then
         If Ws.Name <> "1" Then
     Ws.Delete
     j = j + 1
         End If
         End If
         End If
Je pensais remplacé par If Ws.name <> Array("Info", "Data", "1") mais cela ne fonftionne pas.

Auriez-vous des suggestions ?

Merci d'avance,

Antoine
 
Re : VBA - simplifier macro (bloc IF/End IF)

Des idées pour simplifier :
VB:
   If Ws.Name <> "Info" Or Ws.Name <> "1" Or Ws.Name <> "2" Or Ws.Name <> "3" Or Ws.Name <> "4" Or Ws.Name <> "5" Or Ws.Name <> "6" Or Ws.Name <> "7" Or Ws.Name <> "8" Or Ws.Name <> "9" Or Ws.Name <> "10" Or Ws.Name <> "11" Or Ws.Name <> "12" Or Ws.Name <> "janvier" Or Ws.Name <> "février" Or Ws.Name <> "mars" Or Ws.Name <> "avril" Or Ws.Name <> "mai" Or Ws.Name <> "juin" Or Ws.Name <> "juillet" Or Ws.Name <> "août" Or Ws.Name <> "septembre" Or Ws.Name <> "octobre" Or Ws.Name <> "novembre" Or Ws.Name <> "décembre" Or Ws.Name <> "data" Then
     Ws.Delete
     j = j + 1
         End If

En plus ca me supprime quand même l'onglet info...

🙂
 
Re : VBA - simplifier macro (bloc IF/End IF)

Bonsoir.
Il faut des And pas des Or: même s'il n'y avait que 2 noms à préserver, la feuille aurait toujours un nom différent de l'un ou de l'autre et l'expression serait toujours vraie. S'il n'est pas possible de faire autrement vous pouvez essayer ça :
VB:
If Ws.Name <> "Info" And Not Ws.Name Like "#*" And Not IsDate("1 " & Ws.Name & " 1900") _
   And Ws.Name <> "data" Then Ws.Delete: j = j + 1
 
Re : VBA - simplifier macro (bloc IF/End IF)

Bonjourle forum, bernard, laetitia,

Je test ta solution dans la matinée bernard ! Juste par curiosité, le And Not Ws.Name Like "#*" test le format numérique ?
et And Not Is Date (...) si cela appartient à une date ?

Pour laetitia, je joins un fichier simplifier.
Dans celui-ci, j'ai une macro qui crée des onglets en fonction de ce qu'il y a dans ma colonne A (sheet "Info"). Mais j'aimerais mettre à jour les onglet en supprimant ceux qui ne font plus parti de la colonne à part les premiers onglets ("Info"; "1";"2;"...;"janvier"...).

Merci 🙂

Bien à vous,

Antoine
 

Pièces jointes

Re : VBA - simplifier macro (bloc IF/End IF)

Impossible.
Elle pourrait supprimer une feuille "info" ou "INFO" mais pas "Info"
Remarquez, si vos feuilles sont toujours disposées ainsi pour quoi ne feriez vous pas On Error resume Next: Do While Err = 0: Worksheets(22).Delete: Loop ?
 
Re : VBA - simplifier macro (bloc IF/End IF)

Ah moins de l'avoir intégré au mauvais endroit, la feuille "Info" était bien supprimée. Cela dit, mon erreur est fortement possible, je ne maitrise pas très bien les macro.

En modifiant comme cela fonctionne :
VB:
Sub MAJ_Onglets()
 Dim Sh As Worksheet
 Dim Ws As Worksheet
 Dim LastLig As Long
 Dim i As Integer
 Dim j As Integer
 
j = 2
 
For Each Ws In Application.Worksheets
     If Ws.Name = Sheets("Info").Range("A" & j) Then
     j = j + 1
     Else
     Application.DisplayAlerts = False
         If Ws.Name <> "Info" Then
         If Ws.Name <> "Data" And Not Ws.Name Like "#*" And Not IsDate("1 " & Ws.Name & " 1900") Then
     Ws.Delete
     j = j + 1
         End If
         End If
     Application.DisplayAlerts = True
     End If
 
Next Ws
  
 With Sheets("Info")
     LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
     For i = LastLig To 2 Step -1
         On Error Resume Next
         Set Sh = Sheets(CStr(.Range("A" & i).Value))
         On Error GoTo 0
         If Sh Is Nothing Then
             ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
             ActiveSheet.Name = CStr(.Range("A" & i).Value)
         Else
             Set Sh = Nothing
         End If
     Next i
 End With
 
End Sub

Mes onglets sont toujours disposé de la même façon puisque la macro insère les feuilles en dernière position.
Je ne sais pas faire une boucle While. Je vais chercher sur Internet pour proposer un bout de code.

Merci pour vos réponses,

Bien à vous,

Antoine

Cela fonctionne très bien.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
580
Réponses
8
Affichages
647
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
370
Réponses
7
Affichages
285
Réponses
7
Affichages
702
Réponses
1
Affichages
517
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…