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 des cellules en fonction de la date


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 38
    Points
    38
    Par défaut Effacer des cellules en fonction de la date
    Bonjour,

    Je dois réaliser pour demain soir une macro conditionnelle, les données sont les suivantes
    Dans la case I1 se strouve la date du jour.
    Dans la plage A2:H151 se trouve les données à effacer
    Dans la plage B2:B151 se touve les dates qui servent de référence.
    La macro doit effacer la ligne si la date est <= I1+1 (soit la date de demain),
    si c'est le cas pour la première ligne, les cellules de B2 à H2 devront être éffacées, sinon la ligne reste intacte et on passe à la ligne suivante.
    Si l'on pouvait effacer la ligne entière j'aurais assez facilement trouvé la solution mais comme il existe à partir de la colonne I des données qu'il ne faut pas toucher cela devient plus compliquer pour moi.

    Je suppose qu'il faut affecter une variable au numéro de ligne et utiliser celle-ci pour effectuer la macro, malheureusement je manque de temps et 24 heures sera trop court pour y arriver tout seul.

    Merci par avance de votre aide.

    Jarault

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Je suis vraiment pas doué, mais au moins j'essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Effacer_Tout2()
     
    'Efface Les Achats
     
        For Each Cell In Range("B2:B151")
            Cell.Select
            If Cell <= Range("I1") +1 Then Application.Run "Effacer_Achats"
        Next Cell
     
        Application.ScreenUpdating = True
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Effacer_Achats()
    ActiveCell.ClearContents
    ActiveCell.Offset(0, -1).ClearContents
    ActiveCell.Offset(0, 1).ClearContents
    ActiveCell.Offset(0, 2).ClearContents
    ActiveCell.Offset(0, 3).ClearContents
    ActiveCell.Offset(0, 4).ClearContents
    ActiveCell.Offset(0, 5).ClearContents
    ActiveCell.Offset(0, 6).ClearContents
    End Sub
    C'est nul mais çà marche, si quelqun à quelquechose de plus propre, je suis preneur

    Jarault

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut jarault et le forum
    Dans la case I1 se strouve la date du jour.
    Dans la plage A2:H151 se trouve les données à effacer
    Dans la plage B2:B151 se touve les dates qui servent de référence.
    La macro doit effacer la ligne si la date est <= I1+1 (soit la date de demain),
    si c'est le cas pour la première ligne, les cellules de B2 à H2 devront être éffacées, sinon la ligne reste intacte
    Ce que je comprends : Dans le tableau A2:H151, si la cellule de la colonne B est inférieure ou égale à la valeur de I1+1, effacer les cellules de la ligne correspondante dans les colonnes A à H, sans supprimer les cellules.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim Cel As Range
    For Each Cel In Range("B2:B151")
        If Int(Cel) <= Int(Range("I1"))+ 1 Then _
          Range(Cel.Offset(0, -1), Cel.Offset(0, 6)).ClearContents
    Next Cel
    End Sub
    A+
    EDIT : ATTENTION les critères du descriptif (I1+1) et de l'exemple (I1) sont différents.
    Si on peut, il vaut mieux éviter de faire des appels macros : ça ralentit et le gain est minime.
    Call Nom_de_la_Macro me semble plus indiqué, mais chacun sa méthode.
    Tu as un ScreenUpdating = True, mais j'ai pas vu le false . Pour toutes les instruction qui modifient le fonctionnement d'excel, je gère systématiquement les erreurs, juste pour être sur que la macro remettra Excel dans la bonne configuration, même en cas d'erreur.
    Il faut éviter l'usage des SELECT, qui sont bouffeurs de temps, et donc trouver un substitut à ActiveCell.

  4. #4
    Membre actif
    Inscrit en
    Février 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 208
    Points : 246
    Points
    246
    Par défaut
    bonjour

    essaye ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Macro1()
        DateAeffacer = Cells(1, 9).Value
        Derligne = Range("A2").End(xlDown).Row
        For Lig = Derligne To 2 Step -1
            If DateAeffacer < Cells(Lig, 1).Value Then
                Range("A" & Lig & ":H" & Lig).Select
                Selection.Delete Shift:=xlUp
            End If
        Next Lig
    End Sub
    il va supprimer les cellules des colonnes A à H pour chaque ligne dont la date est supérieure à la date du jour.
    à plus

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim Cel As Range
    For Each Cel In Range("B2:B151")
        If Int(Cel) <= Int(Range("I1"))+ 1 Then _
          Range(Cel.Offset(0, -1), Cel.Offset(0, 6)).ClearContents
    Next Cel
    End Sub
    Super çà marche super bien, par contre la macro pourrait être plus rapide en utilisant le principe de "Le Pierre", c'est à dire en partant du bas pour remonter car il arrive que je n'ai que quelques lignes de remplies et dans tous les cas il n'y a pas de lignes vides (les données viennent d'une requête access et sont regroupées les unes après les autres).

    Jarault

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Le Pierre Voir le message
    bonjour

    essaye ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Macro1()
        DateAeffacer = Cells(1, 9).Value
        Derligne = Range("A2").End(xlDown).Row
        For Lig = Derligne To 2 Step -1
            If DateAeffacer < Cells(Lig, 1).Value Then
                Range("A" & Lig & ":H" & Lig).Select
                Selection.Delete Shift:=xlUp
            End If
        Next Lig
    End Sub
    il va supprimer les cellules des colonnes A à H pour chaque ligne dont la date est supérieure à la date du jour.
    à plus

    La macro ne tiend pas compte de la date et efface toutes les lignes, par contre le fait de partir du bas pour remonter accélère la macro dans ce cas précis.

  7. #7
    Membre actif
    Inscrit en
    Février 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 208
    Points : 246
    Points
    246
    Par défaut
    s'il n'y a pas de date dans la cellule I1 ou si la condition n'est pas remplie (date en A..>date inscrite en I1), effectivement toutes les lignes seront effacées

    voici mon fichier de test : http://cjoint.com/?eotjzq5MZR

    à plus

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut jarault
    par contre la macro pourrait être plus rapide en utilisant le principe de "Le Pierre", c'est à dire en partant du bas pour remonter
    Le sens importe peu, dans le cas de ma nacro, puisqu'on ne supprime pas les cellules, on se contente de les effacer. la rapidité vient uniquement du nombre de cellules à contrôler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim Cel As Range
    For Each Cel In Range([B2],[B2].End(xlDown))
        If Int(Cel) <= Int(Range("I1"))+ 1 Then _
          Range(Cel.Offset(0, -1), Cel.Offset(0, 6)).ClearContents
    Next Cel
    End Sub
    C'est la même, sauf qu'on limite le nombre de cellules par le même type d'instruction que celui de Le Pierre.
    Je n'utilise pratiquement jamais le "XlDown", son comportement dépendant de trop de facteur (état vide 1re et 2me cellule, cellules vides au milieu).
    D'habitude, j'utilise : Range([B2],[B65536].End(xlup)), mais ne connaissant pas la structures des données, et ne sachant pas si B150 et B151 sont vides ou non, je me suis contenté d'utiliser la limite définie.
    On pourrait rajouter le test d'une date en Cel :
    If Int(Cel) <= Int(Range("I1"))+ 1 And isDate(cel) then
    Mais pour moi, les cellules B2:B151 contenaient toutes des dates
    A+

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Le Pierre Voir le message
    s'il n'y a pas de date dans la cellule I1 ou si la condition n'est pas remplie (date en A..>date inscrite en I1), effectivement toutes les lignes seront effacées

    voici mon fichier de test : http://cjoint.com/?eotjzq5MZR

    à plus
    Ok je viens de comprendre pourquoi çà ne marchait pas, juste un problème de choix de date et de colonne (ton code cherche la date dans la colonne A, chez moi celle-ci est dans la colonne B)

    J'en apprends tous les jours merci pour votre aide si précieuse.

    Jarault

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Gorfael Voir le message
    Salut jarault
    Le sens importe peu, dans le cas de ma nacro, puisqu'on ne supprime pas les cellules, on se contente de les effacer. la rapidité vient uniquement du nombre de cellules à contrôler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim Cel As Range
    For Each Cel In Range([B2],[B2].End(xlDown))
        If Int(Cel) <= Int(Range("I1"))+ 1 Then _
          Range(Cel.Offset(0, -1), Cel.Offset(0, 6)).ClearContents
    Next Cel
    End Sub
    C'est la même, sauf qu'on limite le nombre de cellules par le même type d'instruction que celui de Le Pierre.
    Je n'utilise pratiquement jamais le "XlDown", son comportement dépendant de trop de facteur (état vide 1re et 2me cellule, cellules vides au milieu).
    D'habitude, j'utilise : Range([B2],[B65536].End(xlup)), mais ne connaissant pas la structures des données, et ne sachant pas si B150 et B151 sont vides ou non, je me suis contenté d'utiliser la limite définie.
    On pourrait rajouter le test d'une date en Cel :
    If Int(Cel) <= Int(Range("I1"))+ 1 And isDate(cel) then
    Mais pour moi, les cellules B2:B151 contenaient toutes des dates
    A+
    Ca marche du tonnerre merci beaucoup pour votre aide.

    Jarault

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

Discussions similaires

  1. [XL-2010] Effacer des cellules en fonction de la valeur d'un autre cellule
    Par aalex85 dans le forum Excel
    Réponses: 9
    Dernier message: 02/02/2015, 08h42
  2. Colorer des cellules en fonction de la date qu'elles contiennent
    Par Rahanin dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/12/2011, 14h28
  3. Sommer des cellules en fonction du contenu d'autres cellules
    Par jnmab dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/12/2007, 22h05
  4. affichage des saisons en fonction de la date
    Par marlene.ln dans le forum Access
    Réponses: 4
    Dernier message: 26/02/2007, 16h51
  5. Réponses: 10
    Dernier message: 03/05/2006, 11h34

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