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 :

Balayage d'une plage et vérification de conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut Balayage d'une plage et vérification de conditions
    Bonjour,

    Je reviens sur ce forum car j'y trouve souvent ma solution

    Mon souci actuel est le suivant :

    Dans un tableau de suivi de tâches, j'ai une colonne indiquant une échéance et une colonne juste à sa droite indiquant si la tâche est soldée ou non (OK / NOK). Jusqu'ici, tout va bien

    Je souhaiterai à l'ouverture du classeur que toutes les tâches soient balayées et que celles non soldées et dont l'échéance est passée soient mises en évidence (couleur rouge en fond de cellule).

    J'ai le code suivant dans la macro Auto_Open
    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
     
    Application.ScreenUpdating = False
     
    Dim vCell As Object
    Dim EcheancePrevi As Date
    Dim sel As Variant
     
    'sélection de la 1ère cellule où se trouve une échéance
    Sheets(1).Range("G4").Select
     
    'sélection de toute la colonne 'Echeance'
    Range(Selection, Selection.End(xlDown)).Select
        For Each vCell In Selection
        EcheancePrevi = Format(vCell.Value, "dd/mm/yyyy")
        'la ligne ci-dessous me sert à sélectionner l'adresse de toute la ligne
        sel = vCell.Offset(0, -7).Address & ":" & vCell.Offset(0, 2).Address
            '1ère condition de mon test : la date prévisionnelle est dépassée
            If EcheancePrevi < DateValue(Now) Then
                '2nde condition : la tâche n'est pas validée (le UCase est là pour éviter les pb de casse)
                If UCase(vCell.Offset(0, 1).Value) <> "OK" Then
                   Range(sel).Interior.ColorIndex = 3
                End If
            End If
        Next
    A l’exécution l'erreur « '424' Objet requis » apparaît et pointe la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        sel = vCell.Offset(0, -7).Address & ":" & vCell.Offset(0, 2).Address
    Avez-vous une idée de mon erreur car j’ai beau prendre le code dans tous les sens mais je ne la trouve pas :/ ?

  2. #2
    Membre Expert
    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
    Par défaut
    Salut bbdz13
    Avant de la testée en Auto_Open (version 97 ou avant ? ), teste-la avec une simple macro
    Mais avec une simple MFC, je pense que ce serait mieux
    T'es un adepte des PowerRanger et les transformations te manquent ?
    EcheancePrevi = Format(vCell.Value, "dd/mm/yyyy")
    tu transformes une date qu'excel reconnaît en du texte et tu veux la comparer avec "une date" :
    If EcheancePrevi < DateValue(Now) Then
    Pas glop, pas glop

    vCell.Offset(0, -7).Address on a posé : Vcel appartient à la colonne G(numéro de colonne 7) donc on cherche la cellule de la même ligne, mais 7 colonnes avant : donc la colonne avant A. Tu peux tester
    vCell.Offset(0, -6).Address

    La macro un peu corrigée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim vCell As Range
    Application.ScreenUpdating = False
    Sheets(1).Activate     'le nom serait mieux
    For Each vCell In Range([G4], [G4].End(xlDown))
        If IsDate(vCell) Then
            If vcel < Date And UCase(vCell.Offset(0, 1)) <> "OK" _
                Then Range(vCell.Offset(0, -6), _
                vCell.Offset(0, 2)).Interior.ColorIndex = 3
        End If
    Next vCell
    Application.ScreenUpdating = True
    J'aurais presque fait celle-la, mais comme j'ai des instruction qui concerne Application (tous les fichiers ouverts sous excel), je gère systèmatiquement les erreurs.
    Et je n'utilise jamais End(xlDown), les résultats donnant des types de réponses différentes suivant le remplissage ou non des 2 premières cellules.
    ATTENTION : vu que c'est que sur le principe et qu'elle est simple, j'ai la flemme de tester la macro.

    Si tu déclarais tes variables non pas en variant, mais dans le type attendu, tu aurais plus de problèmes dès le lancement, mais ça te donnerait des indication sur l'erreur (remarque, c'est déjà pas mal de les déclarer )
    A+

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/07/2013, 16h06
  2. Réponses: 6
    Dernier message: 23/11/2012, 10h06
  3. Condition sur une plage de donnes pas tjs renseignée
    Par stof dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/06/2010, 17h13
  4. Somme avec condition et affectation de valeur sur une plage
    Par thierryakaguy dans le forum Excel
    Réponses: 12
    Dernier message: 31/07/2009, 16h07
  5. [XL-2003] Calcul de moyenne dans une plage avec condition
    Par flo21000 dans le forum Excel
    Réponses: 7
    Dernier message: 24/07/2009, 20h31

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