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 :

Suppression de données inf a un certaine date ou vides par macro VBA [XL-2013]


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
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut Suppression de données inf a un certaine date ou vides par macro VBA
    Bonjour à Tous,

    j'ai un fichier de données que vous trouverez en pieces jointes.
    le but cherché est de supprimer par macro les lignes dont la date en colonne D est vide ou inferieure à la date d'aujourd'hui
    pour cela j'ai écrit ceci en VBA :
    le filtre personalisé :date vide est bien pris en compte mais pas le deuxième critère (inf à la date d'aujourd'hui).
    j'ai essayé d'inverser les deux criteres, le problème est le même. il ne prends en compte que le critère 2

    Quelqu'un peut il m'aider à résoudre ce problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub SupprDonnéesInutiles()
        ActiveSheet.Cells.AutoFilter Field:=4, Criteria1:="<" & Date, Operator:=xlOr, Criteria2:="="
        For Each c In [_filterdatabase].Offset(1).Resize(, 1).SpecialCells(xlCellTypeVisible)
            LigFiltrée = c.Row: Exit For
        Next c
        ActiveSheet.Rows("" & LigFiltrée & ":" & LigFiltrée & "").Select
        ActiveSheet.Range(Selection, Selection.End(xlDown)).Delete Shift:=xlUp
        ActiveSheet.Cells.AutoFilter Field:=4
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonsoir
    je suis débutant en VBA et j'ai lu sur ce forum que c'est mieux d'utiliser les filtres élaborés
    mais à mon niveau de débutant je travaille avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub SupprDonnéesInutiles()
    Dim plage As Range
    Dim DernLigne As Long
    DernLigne = Sheets("feuil1").Range("A" & Rows.Count).End(xlUp).Row
    Set plage = Sheets("feuil1").Range("D2:D" & DernLigne)
    With Sheets("feuil1")
    For Each cell In plage
    If cell.Value < Date or cell.Value="" Then
    cell.Select
    Selection.EntireRow.Delete
       End If
       Next cell
       End With
    End Sub

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par BENNASR Voir le message
    bonsoir
    je suis débutant en VBA et j'ai lu sur ce forum que c'est mieux d'utiliser les filtres élaborés
    mais à mon niveau de débutant je travaille ...
    Quand tu supprimes des cellules dans une boucle, il faut toujours partir de la fin vers le début.
    Par exemple :
    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
    Option Explicit
    Sub SupprDonnéesInutiles()
    Dim cel As Range
      Set cel = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Offset(0, 3)
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      Do While cel.Row > 1
        If cel.Value < Date Or cel.Value = "" Then
          Set cel = cel.Offset(-1)
          cel.Offset(1).EntireRow.Delete
        Else
          Set cel = cel.Offset(-1)
        End If
      Loop
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
    End Sub
    Re,

    Ou bien, avec un filtre élaboré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub SupprDonnéesFiltrées()
    Dim rngDonnees As Range
    Dim rngCritere As Range
     
      Set rngDonnees = Worksheets("Feuil1").Range("a1").CurrentRegion
      Set rngCritere = Worksheets("Critères").Range("a1").CurrentRegion
      rngDonnees.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rngCritere
      rngDonnees.Offset(1).SpecialCells(xlCellTypeVisible).Delete (xlUp)
      If Worksheets("Feuil1").FilterMode Then Worksheets("Feuil1").ShowAllData
     
    End Sub

    Ton fichier avec l'exemple précédent et avec un filtre élaboré ci-dessus (au choix) :
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Je fais une petite suggestion: c'est vraiment dommage de basser par un filtre (très bien) pour avoir une boucle super lente après sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Do While cel.Row > 1
        If cel.Value < Date Or cel.Value = "" Then
          Set cel = cel.Offset(-1)
          cel.Offset(1).EntireRow.Delete
        Else
          Set cel = cel.Offset(-1)
        End If
    => Donc l'approche peut être bien plus rapide:

    1. Vous filtrez (en une ou deux fois)
    2. Vous supprimer le réultat du filtre en passant par les .SpecialCells(xlCellTypeVisible), en une passe


    Voir exemple ci-dessous, à adapter (ou faire une fonction)
    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
    Sub Delete_DateRecords()
     
    Dim Wsh As Worksheet
    Dim SrcRng As Range, DataRng As Range
     
    'Initialisation
        Set Wsh = ActiveSheet 'A adapter
     
        With Application
            .ScreenUpdating = False
            .DisplayAlerts = True   'A adapter
        End With
        Set SrcRng = Wsh.Range("A1").CurrentRegion   'à adapter
     
    ' On filtre sur les valeurs dupliquées
        SrcRng.AutoFilter Field:=4, Criteria1:="TRUE"     '4 = Columne filtrée (à adapter)
     
    ' On ne prend que les data affichées après le filtre
        Set DataRng = SrcRng.Offset(1, 0).Resize(SrcRng.Rows.Count - 2, SrcRng.Columns.Count).SpecialCells(xlCellTypeVisible) 'On ne garde que la partie résultat du filtre, en enlevant le header
        Debug.Print DataRng.Address
     
     
    ' Et on efface
        DataRng.Rows.Delete
        SrcRng.AutoFilter Field:=4      ' On reset les filtres
     
    End Sub

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    Merci pour ta solution. je voulais absolument passer par le filtre personnalisé. Ta solution est beaucoup plus simple. Tu as raison
    merci encore

    Citation Envoyé par Patrice740 Voir le message
    Quand tu supprimes des cellules dans une boucle, il faut toujours partir de la fin vers le début.
    Par exemple :
    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
    Option Explicit
    Sub SupprDonnéesInutiles()
    Dim cel As Range
      Set cel = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Offset(0, 3)
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      Do While cel.Row > 1
        If cel.Value < Date Or cel.Value = "" Then
          Set cel = cel.Offset(-1)
          cel.Offset(1).EntireRow.Delete
        Else
          Set cel = cel.Offset(-1)
        End If
      Loop
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
    End Sub

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour vinc_bilb
    Avec une réserve en ce qui concerne l'aptitude de Specialcells de "construire" nativement une plage discontinue dont le nombre d'aires dépasse la moitié de la limite d'un integer.
    Mais le cas est rare (un très grand nombre de cellules concernées et réparties de telle manière que le nombre d'aires est alors élevé).

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

Discussions similaires

  1. [XL-2007] Suivi d'effectif - suppressions de lignes sélectionnées par macro VBA
    Par mich2p1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/06/2014, 20h00
  2. [XL-2013] Suppression de doublons dans un classeur Excel avec utilisation d'une macro VBA
    Par gblassel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/06/2014, 16h18
  3. [XL-2010] Inversion date FR/US avec macro VBA
    Par freakhit dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2014, 13h31
  4. [AC-2007] suppression de données en fonction de la date
    Par kimai dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/03/2011, 14h09
  5. Date après passage par macro
    Par lhoste dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/07/2008, 13h48

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