IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

supprimer certaines colonnes [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut supprimer certaines colonnes
    Bonjour au Forum,

    je recherche une solution pour supprimer certaines colonnes dont je connais le nom des entêtes.
    Puis ne garder que ces colonnes en supprimant les autres


    actuellement j'effectue ceci mais c'est trop long.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    With ActiveSheet
        For i = .UsedRange.Column + .UsedRange.Columns.Count To 1 Step -1
            If Cells(6, i).Value <> "Niveau" And Cells(6, i).Value <> "Version" And Cells(6, i).Value <> "Référence" And Cells(6, i).Value <> "Nom" _
            And Cells(6, i).Value <> "Statut" And Cells(6, i).Value <> "Type" And Cells(6, i).Value <> "huile" And Cells(6, i).Value <> "vente" _
            And Cells(6, i).Value <> "Numr" And Cells(6, i).Value <> "region" _
            And Cells(6, i).Value <> "client" And Cells(6, i).Value <> "mod" And Cells(6, i).Value <> "Stru" _
            And Cells(6, i).Value <> "crochet" Then
            .Columns(i).Delete
            End If
        Next i
    End With
    sachant que mes colonnes commencent en "A3" et se termine parfois pas tout le temps en colonne "JF"

    Quel piste ? si vous avez une idée je suis intéressé.

    merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 641
    Points
    1 641
    Par défaut
    Salut,

    As-tu essayé de désactiver l'affichage ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    Note:
    Ne pas oublier sa contrepartie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    bonjour deedolith,

    oui bien sur cela a été intégré.

    Je me demandais si avec du autofilter ça pouvait passer mais je trouve cela compliqué...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 641
    Points
    1 641
    Par défaut
    Heu non, les filtres n'agissent que sur les lignes, pas sur les colonnes.

    Et, Power Query ?

  5. #5
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    Bonjour, je propose une méthode qui consiste à créer une liste des noms de colonnes que vous souhaitez conserver, puis de supprimer toutes les autres colonnes qui ne figurent pas dans cette liste. Ce code parcourt les colonnes de la droite vers la gauche (pour éviter les problèmes de décalage lors de la suppression des colonnes), vérifie si le nom de la colonne est dans la collection des noms à conserver, et supprime la colonne si ce n’est pas le cas. Je pense que ça devrait être plus rapide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Sub SupprimerColonnes()
        Dim ws As Worksheet
        Dim rng As Range
        Dim cell As Range
        Dim ColToKeep As New Collection
        Dim i As Long
     
        Set ws = ActiveSheet
     
        ' Ajouter les noms des colonnes à conserver à la collection
        ColToKeep.Add "Niveau"
        ColToKeep.Add "Version"
        ColToKeep.Add "Référence"
        ColToKeep.Add "Nom"
        ColToKeep.Add "Statut"
        ColToKeep.Add "Type"
        ColToKeep.Add "huile"
        ColToKeep.Add "vente"
        ColToKeep.Add "Numr"
        ColToKeep.Add "region"
        ColToKeep.Add "client"
        ColToKeep.Add "mod"
        ColToKeep.Add "Stru"
        ColToKeep.Add "crochet"
     
        ' Parcourir les colonnes de la droite vers la gauche
        For i = ws.Cells(6, ws.Columns.Count).End(xlToLeft).Column To 1 Step -1
            ' Vérifier si le nom de la colonne est dans la collection
            On Error Resume Next
            Set rng = ColToKeep(ws.Cells(6, i).Value)
            On Error GoTo 0
     
            ' Si le nom de la colonne n'est pas dans la collection, supprimer la colonne
            If rng Is Nothing Then
                ws.Columns(i).Delete
            End If
     
            ' Réinitialiser la variable pour la prochaine itération
            Set rng = Nothing
        Next i
    End Sub

  6. #6
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour,

    En plus du screenUpdating =False qui va t'économiser la mise à jour de l'écran, il faut réduire le nombre de delete.

    À chaque delete, quoi qu'on fasse, Excel met à jour les formules pour refléter le décalage que tu viens de faire. Si ton classeur est gros, et que tu fais beaucoup de suppressions, ça peut prendre du temps.
    La bonne technique pour gagner en performance, c'est de faire les delete en bloc (supprimer une colonne ou mille colonnes prend le même temps si c'est mille colonnes ensemble.

    Dans ton cas, tu gardes 14 colonnes donc tu devrais pouvoir passer à une quinzaine de delete max au lieu de 250.

    Ça pourrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Dim I As Long, Deb As Long, Fin As Long
    With ActiveSheet
        For I = .UsedRange.Column + .UsedRange.Columns.Count To 1 Step -1
            If .Cells(6, I).Value <> "Niveau" And .Cells(6, I).Value <> "Version" And .Cells(6, I).Value <> "Référence" And .Cells(6, I).Value <> "Nom" _
            And .Cells(6, I).Value <> "Statut" And .Cells(6, I).Value <> "Type" And .Cells(6, I).Value <> "huile" And .Cells(6, I).Value <> "vente" _
            And .Cells(6, I).Value <> "Numr" And .Cells(6, I).Value <> "region" _
            And .Cells(6, I).Value <> "client" And .Cells(6, I).Value <> "mod" And .Cells(6, I).Value <> "Stru" _
            And .Cells(6, I).Value <> "crochet" Then
                If Fin = 0 Then Fin = I ' on débute un nouveau bloc, de droite à gauche donc on a sa dernière colonne
            Else
                ' on est sur une bonne colonne, si un bloc était en cours, la précédente termine le bloc
                ' (donc la première colonne du bloc puisqu'on va de D à G)
                If Fin <> 0 Then Deb = I + 1
            End If
            If Deb <> 0 Then 'on vient de finir de déterminer un bloc
                .Range(.Columns(Deb), .Columns(Fin)).Delete
                ' et on réinitialise en attendant le prochain bloc
                Deb = 0
                Fin = 0
            End If
        Next I
        ' Dernier delete
        If Fin > 0 Then .Range(.Columns(1), .Columns(Fin)).Delete
    End With
    Nb : j'ai mis des "." devant Cells, tant qu'à utiliser un with activesheet autant utiliser les références explicites jusqu'au bout.

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Sauf dans un cas très tordu, Application.ScreenUpdating = True n'est pas utile. L'écran est automatiquement rafraichi lorsque le code repasse la main à Excel.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Tête de chat Voir le message
    [...]
    À chaque delete, quoi qu'on fasse, Excel met à jour les formules pour refléter le décalage que tu viens de faire[...]
    Non pas "quoi qu'on fasse". Normalement, on doit passer en application.Calculation = xlCalculationManual avant de supprimer et restaurer le mode de calcul initial après. Ainsi, il n' a pas de recalcul à chaque Delete.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Re,

    je ne parle pas de recalcul des formules mais de mise à jour des formules. Tu supprimes la colonne B, la formule qui était =E1 devient =D1. Bien sûr ça n'est pas stocké comme ça en mémoire, mais il se passe des choses quand on supprime une ligne ou une colonne qui ne relèvent pas du recalcul, donc pas bloquées par le Calculation = xlCalculationManual, et qui prennent un temps fou.
    Donc je maintiens qu'en faisant les suppressions par bloc, toutes choses égales par ailleurs, on gagne un temps fou.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 641
    Points
    1 641
    Par défaut
    @Tête de chat:
    Sauf erreur de ma part, il est possible de définir une plage sur plusieurs cellules, même non contiguës.
    Exemple:
    Ce qui, une fois les plages indésirables calculées, pourrait réduire les opération de suppression à une seule.

    Y aurait-il un gain ?

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Tête de chat Voir le message
    [...]
    Donc je maintiens qu'en faisant les suppressions par bloc, toutes choses égales par ailleurs, on gagne un temps fou.
    Je n'ai pas dit le contraire 😉
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    Merci à chacun pour vos interventions.

    La méthode de Tête de Chat fonctionne est beaucoup plus rapide que la mienne
    La méthode de Franc est trop longue et boucle à l'infini

    A voir donc
    mais merci

  13. #13
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour,

    Citation Envoyé par deedolith Voir le message
    Ce qui, une fois les plages indésirables calculées, pourrait réduire les opération de suppression à une seule.
    Y aurait-il un gain ?
    Bonne question...

    Parti d'un fichier d'environ 220 colonnes x 3500 lignes, j'a comparé les 3 méthodes : 1 à une, bloc par bloc et en union, pour supprimer 9 colonnes sur 10.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Option Explicit
    Sub test1()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Debug.Print Time
    Dim i As Long
    With ActiveSheet
    For i = 210 To 1 Step -1
        If (i Mod 10) <> 0 Then
            .Columns(i).Delete
        End If
    Next i
    End With
    Debug.Print Time
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
    Sub test2()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Debug.Print Time
    Dim i As Long
    With ActiveSheet
    For i = 210 To 0 Step -1
        If (i Mod 10) = 0 Then
            .Range(.Columns(i + 1), .Columns(i + 9)).Delete
        End If
    Next i
    End With
    Debug.Print Time
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
     
    Sub test3()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Debug.Print Time
    Dim i As Long, MaRange As Range
    With ActiveSheet
    For i = 210 To 1 Step -1
        If (i Mod 10) <> 0 Then
            If MaRange Is Nothing Then
                Set MaRange = .Columns(i)
            Else
                Set MaRange = Union(MaRange, .Columns(i))
            End If
        End If
    Next i
    End With
    MaRange.Delete
    Debug.Print Time
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
    Au départ la première méthode prenait 4s j'ai donc ajouté des formules pour compliquer et ça donne :

    Méthode 1 : 32s
    Méthode 2 : 4s
    Méthode 3 : 4s

    Avec la précision du test, pas de différence ; possible qu'Excel procède par sous-range (le union a bien regroupé des plages de 9 colonnes, comme on peut le vérifier en regardant MaRange.Addresss). La méthode suggérée par deedolith a l'avantage d'être plus simple à coder et maintenir.

    Je laisse à d'autres le soin de pousser les tests plus loin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer Certaines colonnes(non consecutives) d'un tableau
    Par gegila dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/04/2020, 15h32
  2. Réponses: 3
    Dernier message: 21/05/2015, 10h37
  3. Réponses: 2
    Dernier message: 26/05/2014, 13h48
  4. Supprimer les doublons d'un SELECT sur certaines colonnes
    Par Logarithmix dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/10/2012, 10h34
  5. supprimer une colonne sous une certaine condition
    Par hotsauce91 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 13/05/2009, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo