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 :

Effacer colonne si plage de cellules vide [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Responsable Analyses
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Analyses
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Par défaut Effacer colonne si plage de cellules vide
    Bonjour

    Je cherche à construire une macro qui effacerait les colonnes seulement si une plage de cellules appartenant à cette même colonne, est vide :

    ex : effacer la colonne i si cellules i21 à i26 sont vides, puis effacer la colonne J si cellules J21 à J26 sont vides, et ainsi de suite jusqu'à la colonne GW

    Merci d'avance pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Un exemple fonctionnel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Private Sub Effacement()
    Dim intCol As Long
    Dim rngRange As Range
     
        For intCol = 9 To 205
            Set rngRange = Range(Cells(21, intCol), Cells(26, intCol))
            If rngRange.Cells.Count = WorksheetFunction.CountBlank(rngRange) Then
                Columns(intCol).ClearContents
            End If
        Next intCol
     
    End Sub
    Dernière modification par Invité ; 27/05/2013 à 11h24.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub EffacementColonneSiAbsenceValeurs(AireATester As Range)
     
        If AireATester.Columns.Count > 1 Then Exit Sub
     
        If Application.WorksheetFunction.CountA(AireATester) = 0 Then
            AireATester.EntireColumn.ClearContents
        End If
     
    End Sub
    Et pour tester


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub TestEffacementColonneSiAbsenceValeurs()
            Call EffacementColonneSiAbsenceValeurs(Range("I21:I25"))
    End Sub
    Cordialement.

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour elo4486,

    une autre voie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Demo()
        Application.ScreenUpdating = False
     
        For C = 9 To 205
            With ActiveWorkbook.ActiveSheet.Columns(C)
                If Application.CountA(.Cells(21).Resize(6)) = 0 Then .ClearContents
            End With
        Next
     
        Application.ScreenUpdating = True
    End Sub
    En fait, tout dépend ce que tu entends précisément par vide …

    _______________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour le Forum,

    A priori, pour ma part, je partirais de la dernière colonne jusqu'à la première en utilisant le nombre de colonnes contenues dans la feuille, et en effectuant pour la boucle un pas négatif de -1.

    Bonjour à nouveau,

    Une possibilité.
    (Même si, comme je dis toujours "J'aime paaaaas les balayages!")

    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
    Public Sub supprsivides()
     
    Dim derc As Long
    Dim i As Integer, L As Long
    Dim suppr As Boolean
     
    Application.ScreenUpdating = False
     
    With Sheets(1)
            derc = .Cells(1, .Columns.Count).End(xlToLeft).Column
            For i = derc To 1 Step -1
                    suppr = True
                    For j = 21 To 26
                            With .Cells(j, i)
                                    If .Value <> "" Then
                                            suppr = False
                                            Exit For
                                            GoTo suivant
                                    End If
                            End With
                    Next j
                    If suppr = True Then .Cells(1, i).EntireColumn.Delete
    suivant:
            Next i
    End With
     
    End Sub

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Responsable Analyses
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Analyses
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Par défaut
    Bonjour

    Merci à tous pour vos réponses.
    Je me suis aperçue que je n'avais pas employé le bon terme, et je m'en excuse :

    Je souhaitais supprimer (et non pas effacer) les colonnes seulement si une plage de cellules appartenant à cette même colonne, est vide (ex : supprimer la colonne i si cellules i21 à i26 sont vides, puis supprimer la colonne J si cellules J21 à J26 sont vides, et ainsi de suite jusqu'à la colonne GW).

    J'ai donc remplacé .ClearContents par .Delete

    Cependant aucun des codes n'a marché, ou plutôt pas entièrement : seulement certaines colonnes ont été supprimées. Comme je débute j'ai peut-être raté quelque chose.

    Pour que ce soit plus concret je joins à ce message le fichier excel (xlsx).

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    He oui comme quoi un sujet bien exposé ‼ …

    Et c'est juste une question de pure logique quant à ton assertion seulement certaines colonnes ont été supprimées;
    je te laisse donc le soin d'observer ce qu'il se passe lorsqu'une colonne est supprimée en tenant bien compte du compteur d'une boucle …

    Sinon voici un exemple à jour des dernières informations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Demo2()
        Application.ScreenUpdating = False
     
        For C = 205 To 9 Step -1
            With ActiveWorkbook.ActiveSheet.Columns(C)
                If Application.CountA(.Cells(21).Resize(6)) = 0 Then .Delete
            End With
        Next
     
        Application.ScreenUpdating = True
    End Sub

    _______________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …


    _______________________________________
    Dieu ordonna à Hélène de bien suivre la carte mais Hélène Ségara !

  8. #8
    Invité
    Invité(e)
    Par défaut
    Essaie avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Private Sub Effacement()
    Dim intCol As Long
    Dim rngRange As Range
     
        For intCol = 205 To 9 Step -1
            Set rngRange = Range(Cells(21, intCol), Cells(26, intCol))
            If Application.WorksheetFunction.CountA(rngRange) = 0 Then
                Columns(intCol).Delete
            End If
        Next intCol
     
    End Sub
    A mon avis tu as oublié d'inverser le parcours des colonnes. Il faut en effet commencer par la dernière colonne jusqu'à la première.

  9. #9
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à tous,

    Vincent, Ton code est le plus performant (plus court et moins de balayages).
    Si je peux me permettre, 2 remarques:
    - Il est prudent de mentionner dans le code la feuille sur laquellle la procédure s'exerce; autrement dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     With Sheets("Base complète")
    - D'autre part, il vaut mieux, à mon avis, calculer la dernière colonne plutôt que l'écrire "en dur"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derc = .Cells(20, .Columns.Count).End(xlToLeft).Column
    "derc" remplaçant 205

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

Discussions similaires

  1. [XL-2007] Recopie de colonne onglet différent sans cellules vides
    Par FlorianB01 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 20/03/2015, 15h59
  2. [XL-2010] Filtre sur plusieurs colonnes / filtre impossible si cellule vide !!!
    Par le-guedin dans le forum Macros et VBA Excel
    Réponses: 41
    Dernier message: 15/02/2013, 10h29
  3. [XL-2003] Effacer colonne en fonction d'une plage de cellule
    Par stressman dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/12/2009, 12h52
  4. combobox sans doublon (colonne de reference avec cellule vide)
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/04/2008, 17h08
  5. Effacer TOTALEMENT une plage de cellule
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/05/2007, 11h19

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