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

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
 

AntoineM

XLDnaute Junior
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...

:)
 

Dranreb

XLDnaute Barbatruc
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
 

AntoineM

XLDnaute Junior
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

  • toto onglet.xlsx
    21.7 KB · Affichages: 29

Dranreb

XLDnaute Barbatruc
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 ?
 

AntoineM

XLDnaute Junior
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:

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal