XL 2016 Sélectionner plusieurs Sheets avec Array

R1-

XLDnaute Junior
Bonjour,

Je vous explique mon problème : j'aimerai mettre en forme plusieurs sheets (suppression de colonnes). Dans un souci de lisibilité de code, plutôt que de sectionner les sheets une à une pour supprimer les colonnes, je me suis essayé à l'utilisation de la fonction Array pour sélectionner toutes les sheets, sauf que ça ne marche pas du tout.
Voici le code.
VB:
Sub MEF()

    ThisWorkbook.Sheets(Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")).Range("C:H,A:A,J:P").Select
    
    Selection.Delete Shift:=xlToLeft
    
End Sub

J'ai donc recherché la bonne syntaxe sans succès... Avez vous donc des pistes pour rendre ce code fonctionnel, ou encore mieux mettre cette sélection multiple sous forme de variable ou de constante.

Merci par avance pour le temps que vous m'accorderez.
 

fanch55

XLDnaute Barbatruc
Bonjour,
Il est préférable de faire une boucle ( on suppose que les feuilles existent ... 😩 ) :
Evitez de le faire plusieurs fois .... 🤫
VB:
Sub MEF()

    For Each Feuille In Array("FRANCE", "CORDON", "PORTUGAL", _
                              "BELGIQUE", "ESPAGNE", "HS_ITALIE", _
                              "HS_SUISSE", "HS_CORDON")
        Worksheets(Feuille).Range("C:H,A:A,J:P").Delete Shift:=xlToLeft
    Next
  
  
End Sub
 

job75

XLDnaute Barbatruc
Bonjour R1-, fanch55,

Il faut sélectionner les feuilles ensemble :
VB:
Sub MEF()
    ThisWorkbook.Sheets(Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")).Select
    ThisWorkbook.ActiveSheet.Range("C:H,A:A,J:P").Delete
End Sub
A+
 

fanch55

XLDnaute Barbatruc
Bonjour R1-, fanch55,

Il faut sélectionner les feuilles ensemble :
VB:
Sub MEF()
    ThisWorkbook.Sheets(Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")).Select
    ThisWorkbook.ActiveSheet.Range("C:H,A:A,J:P").Delete
End Sub
A+
Bonjour @job75 ,
Avec cette méthode, seuls les ranges de la première feuille sélectionnée sont détruits ...
 
Dernière édition:

R1-

XLDnaute Junior
Bonjour,
Il est préférable de faire une boucle ( on suppose que les feuilles existent ... 😩 ) :
Evitez de le faire plusieurs fois .... 🤫
VB:
Sub MEF()

    For Each Feuille In Array("FRANCE", "CORDON", "PORTUGAL", _
                              "BELGIQUE", "ESPAGNE", "HS_ITALIE", _
                              "HS_SUISSE", "HS_CORDON")
        Worksheets(Feuille).Range("C:H,A:A,J:P").Delete Shift:=xlToLeft
    Next
 
 
End Sub
Ca marche parfaitement merci beaucoup, mais comme vous l'avez soulevé, réaliser cette opération plusieurs fois sur la même feuille peut poser problème. Y a t'il une façon de contrôler que l'action n'est pas répétée pour les feuilles déjà mises en forme. En contrôlant par exemple que la cellule C1 n'est pas vide(et donc pas encore mise en forme). Je pensais à un if/then/else, mais je ne sais pas comment l'intégrer au seins d'un "for each".
 

job75

XLDnaute Barbatruc
Avec cette méthode, seuls les ranges de la première feuille sélectionnée sont détruits ...
En effet, ici il faut sélectionner la plage, contrairement à ce qu'on fait d'habitude en VBA :
VB:
Sub MEF()
    With ThisWorkbook
        .Activate
        .Sheets(Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")).Select
    End With
    ActiveSheet.Range("C:H,A:A,J:P").Select
    Selection.Delete
    ActiveSheet.[A1].Select
    ActiveSheet.Select
End Sub
 

fanch55

XLDnaute Barbatruc
Ca marche parfaitement merci beaucoup, mais comme vous l'avez soulevé, réaliser cette opération plusieurs fois sur la même feuille peut poser problème. Y a t'il une façon de contrôler que l'action n'est pas répétée pour les feuilles déjà mises en forme. En contrôlant par exemple que la cellule C1 n'est pas vide(et donc pas encore mise en forme). Je pensais à un if/then/else, mais je ne sais pas comment l'intégrer au seins d'un "for each".
Une proposition :
Code:
Sub MEF()
Dim Feuille As Variant, MesFeuilles As Variant

    MesFeuilles = Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", _
                        "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")
    
    For Each Feuille In MesFeuilles
        With Worksheets(Feuille)
            If .[C1] <> vbNullString Then .[A:A,C:H,J:P].Delete
        End With
    Next
  
End Sub
 

job75

XLDnaute Barbatruc
@fanch55 ton code post #7 c'est le même que le mien post #3, sans doute une erreur...

Pour éviter que la macro soit exécutée une 2ème fois on peut utiliser un nom défini (masqué) :
VB:
Sub MEF()
    If TypeName([Fait]) = "Boolean" Then MsgBox "Les colonnes ont déjà été supprimées !", 48: Exit Sub
    With ThisWorkbook
        .Names.Add "Fait", True, Visible:=False 'nom défini masqué
        .Activate
        .Sheets(Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")).Select
    End With
    ActiveSheet.Range("C:H,A:A,J:P").Select
    Selection.Delete
    ActiveSheet.[A1].Select
    ActiveSheet.Select
End Sub
 

R1-

XLDnaute Junior
Une proposition :
Code:
Sub MEF()
Dim Feuille As Variant, MesFeuilles As Variant

    MesFeuilles = Array("FRANCE", "CORDON", "PORTUGAL", "BELGIQUE", _
                        "ESPAGNE", "HS_ITALIE", "HS_SUISSE", "HS_CORDON")
   
    For Each Feuille In MesFeuilles
        With Worksheets(Feuille)
            If .[C1] <> vbNullString Then .[A:A,C:H,J:P].Delete
        End With
    Next
 
End Sub
De la bombe, merci beaucoup !
Bonne fin d'après midi
 

R1-

XLDnaute Junior
Job je n'utilise pas encore les noms définis je n'y comprend donc pas grand chose. Je vais donc privilégier la solution de Fanch. Il s'agit en fait d'une extraction d'un ERP, I1 sera donc toujours vide. Le Array était une première piste que j'avais trouvé, mais l'intégrer dans une variable est en fait plus malin.

Merci beaucoup pour vos réponses toujours au top.
 
Dernière édition:

fanch55

XLDnaute Barbatruc
@fanch55 ton code post #7 c'est le même que le mien post #3, sans doute une erreur...
Erreur de copier/coller c'est vrai, je modifie le post#7 en supprimant le bloc car je ne me rappelle plus ce que j'avais fait ( code jetable ) .

utiliser C1 comme critère me paraît hasardeux.

Tout à fait, je préfère également le nom masqué en posant par exemple une question s'il est égal à true,
mais ce serait à l'encontre d'une différence de niveau entre les feuilles ... ( customer design .... )
 

Discussions similaires

Statistiques des forums

Discussions
314 717
Messages
2 112 169
Membres
111 449
dernier inscrit
jhugot