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 :

macro si erreur color fond en rouge


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    salarié logistique
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié logistique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut macro si erreur color fond en rouge
    bonjour a tous,

    je me présente je suis arriver dans une petite PME avec beaucoup de possibilité d'amélioration. Mais il faudrait que j'apprenne un peu le langage vba pour cela.

    c'est la que vous intervenez car j'ai besoin d'un petit code pour faire une chose simple. Je m'explique :

    sur le fichier joint j’aimerais une macro qui dans la colonne "I" détecte toute les heure supérieure à 13h00 et qui le mette en couleur de font rouge.

    mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub treizeheure()
        Range("I:I").Activate
            If Time <= 0.541 Then
            Interior.Color = RGB(255, 0, 0)
            End If
    End Sub
    pourriez vous me le corriger svp et si vous avez le temps de me l'expliquer aussi car je débute tout juste

    merci d'avance

    report.xlsx

  2. #2
    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,

    Sauf si c'est pour un besoin d'apprentissage, vous n'avez pas besoin d'une macro pour cela .... Un simple format conditionnel suffit
    Merci d'utiliser les balises pour votre code, ça facilite la vie de ceux qui vous lisent et répondent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub treizeheure()
    Range("I:I").Activate
    If Time <= 0.541 Then
    Interior.Color = RGB(255, 0, 0)
    End If
    End Sub
    => Quelques commentaires:
    - Vous ne précisez pas la feuille, donc c'est la feuille active par défaut: je vous le déconseille
    - Vous avez un range mais vous n'en faites rien, il manque le traitement sur les cellules à l'intérieur du range
    - vous prenez toute la colonne, donc toutes les cellules vides: c'est terrible! et vous ne définissez aucune variable .... risque d'erreur garanti

    Vous pourriez envisager quelquechose comme (non testé), même si il y a 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
    Sub treizeheure
    Dim MyRng As Range, Cl As Range
    Dim RefHeure As Variant
     
    RefHeure = 0.541
     
    Set MyRng = ThisWorkbook.Worksheets(1).Range("I:I").SpecialCells(xlCellTypeConstants) 'Que les cellules non vides
    Debug.Print MyRng.Address
     
    For Each Cl in MyRng.Cells 'Pour chaque cellule dans le range
       If Cl.Value <= RefHeure1 Then
          Cl.Interior.Color = RGB(255, 0, 0)
          Else:  Cl.Interior.Color = RGB(0, 0, 0)
       End If
    Next Cl

  3. #3
    Membre habitué
    Homme Profil pro
    salarié logistique
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié logistique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut
    merci de votre réponse rapide.

    il y a deux chose que je ne comprend pas sur le code.

    pourquoi vous déclaré C1? je ne comprend pas c'est juste un nom au hasard? et à quoi sert le debug.print?

    et aprés l'avoir testé ca ne fonctionne pas toute les case se mettent en noir.

    une autre solution?

  4. #4
    Membre habitué
    Homme Profil pro
    salarié logistique
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié logistique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut
    j'ai trouvé comment faire pour que cela fonctionne mais je doit faire une macro juste avant pour différencier l'heure de la date avec cette macro :

    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
    Option Explicit
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
    ' Touche de raccourci du clavier: Ctrl+a
    '
        Columns("I:I").Select
        Selection.TextToColumns Destination:=Range("I1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)), _
            TrailingMinusNumbers:=True
    End Sub
    le soucis que j'ai c'est comment faire pour lier les deux ?

    et si je fait cette macro

    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
    Sub Macro1()
    '
    ' Macro1 Macro
    '
    ' Touche de raccourci du clavier: Ctrl+m
    '
        Range("I8").Select
        Selection.End(xlDown).Select
        ActiveWindow.SmallScroll Down:=-18
        Range("I8").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.TextToColumns Destination:=Range("I8"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
        Range("J8").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"
     
    Dim MyRng As Range, Cl As Range
    Dim RefHeure As Variant
     
    RefHeure = 0.537
     
    Set MyRng = ThisWorkbook.Worksheets(1).Range("j:j").SpecialCells(xlCellTypeConstants) 'Que les cellules non vides
    Debug.Print MyRng.Address
     
    For Each Cl In MyRng.Cells 'Pour chaque cellule dans le range
       If Cl.Value <= RefHeure Then
          Cl.Interior.Color = RGB(255, 255, 255)
          Else:  Cl.Interior.Color = RGB(255, 0, 0)
       End If
    Next Cl
    End Sub
    cela me met l'heure en AM et en PM et du coup le code ne fonctionne plus

    avez vous des idés?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Consultant comptable
    Inscrit en
    Mai 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant comptable

    Informations forums :
    Inscription : Mai 2011
    Messages : 137
    Par défaut
    Citation Envoyé par richmond26 Voir le message
    merci de votre réponse rapide.

    il y a deux chose que je ne comprend pas sur le code.

    pourquoi vous déclaré C1? je ne comprend pas c'est juste un nom au hasard? et à quoi sert le debug.print?

    et aprés l'avoir testé ca ne fonctionne pas toute les case se mettent en noir.

    une autre solution?
    ce n'est pas C1 mais Cl, il a juste demandé à excel de balayer les cellules (for each) dans la plage indiquée MyRng.

    Le code que vous présenté est fait par l'enregistreur de macro, bien pour commencer, mais beaucoup trop de select et de commande inutile. Etant donné que vous débuté, il vaut mieux essayer de comprendre et d'analyser le code présenté avec les déclarations de variables.
    Si les cellules sont en noir, c'est Le RGB qui doit être faux.

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    au vu du format de tes données, il est donc préférable d'utiliser DatePart.
    Voir l'aide pour comprendre si besoin

    tes données commencent en ligne 8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub iii()
        Dim Cell As Range
        With Feuil1
            For Each Cell In .Cells(8, 9).Resize(.Rows.Count - 7, 1).Cells
                If DatePart("h", Cell.Value) >= 13 Then Cell.Interior.Color = RGB(255, 0, 0)
            Next Cell
        End With
    End Sub

  7. #7
    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,

    J'y vais en résumé, en espérant être clair:

    - Debug.Print: vous permet d'afficher le résultat dans le fenêtre 'immédiate' de l'éditeur VB: bien pratique pour débugger sans ralentir le code en mode normal ... si elle est bien affichée, autrement, la rendre visible
    - Je n'ai jamais vu un enregistreur de macro générer du For Each
    - Vous pouvez extraire facilement le temps sous Excel et sous VBA. Sous Excel (Anglais), en passant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TIMEVALUE(TEXT(I8,"hh:mm"))
    par exemple. Attention, Excel et VBA ne représentent pas les dates et temps de la même manière, donc il faut choisir!
    - La grosse erreur vient du fait que vous ne traitez pas la partie 'temps" de vos données en col I, qui sont des dates
    - Le code ci-dessous marche chez moi avec votre 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub HighlightTime()
     
    Dim MyRng As Range, Cl As Range
    Dim RefHeure As String
     
    RefHeure = "13:00"  'Le temps est en string sous VBA
     
    Set MyRng = ThisWorkbook.Worksheets("Report").Range("I:I").SpecialCells(xlCellTypeConstants) 'Que les cellules non vides
    Debug.Print MyRng.Address
     
    For Each Cl In MyRng.Cells 'Pour chaque cellule dans les cellules appartenant au  range MyRng
     
        If IsDate(Cl.Value) Then    ' On teste que la cellule est bien un format date / time au cas ou
            Debug.Print Cl.Value, TimeValue(Cl.Value)   'Sort dans la fenetre immediate quelquechose comme 7/21/2015 2:05:00 PM        2:05:00 PM
     
            If TimeValue(Cl.Value) <= TimeValue(RefHeure) Then  'On compare le temps uniquement sans se soucier de la date
     
               Cl.Interior.Color = vbRed            'Rouge si <=
               Else:  Cl.Interior.Color = vbGreen   'Autrement vert
     
            End If
     
        End If
     
    Next Cl
     
    End Sub

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Pour répondre à ta petite question du Debug.Print : cela sert uniquement au développeur à vérifier l'état de ses variables.

    Cela écrit la valeur ou le texte demandé dans la zone d'Exécution que tu peux afficher avec Ctrl + G ou Affichage - Fenêtre Exécution.

    Par exemple, Debug.Print "Il est " & Time & " et nous sommes le " & Date
    Ecrira : pour moi maintenant : "Il est 15:15:30 et nous sommes le 22/07/2015"

    L'utilisateur ne le verra jamais et l'utiliser à répétition dans des boucles peut ralentir légèrement l'exécution de la macro, il n'a donc aucun intérêt autre que de permettre à l'utilisateur de vérifier son code.

  9. #9
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Désolé !

    petite coquille dans mon code, la boucle s'effectuait sur le million de cellule (oubli d'un UsedRange)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub iii()
        For Each Cell In Feuil1.Cells(8, 9).Resize(Feuil1.UsedRange.Rows.Count - 7, 1).Cells
            If DatePart("h", Cell.Value) >= 13 Then Cell.Interior.Color = RGB(255, 0, 0)
        Next Cell
    End Sub

  10. #10
    Membre habitué
    Homme Profil pro
    salarié logistique
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié logistique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut
    wow merci pour vos réponse le dernier code est parfait court et efficace merci au autre pour leur code aussi.

    je sais que je vais un peu abuser de votre gentillesse mais serait il possible de mettre 1 condition à tout ca?

    si l'heure est suppérieur à 13h en "I" copier la reference de la meme ligne qui se trouve en F et le mettre sur un autre classeur si en case J = livraison effectuée

    ou alors juste supprimer les ligne qui ne sont pas en erreur ca serait encore plus simple

Discussions similaires

  1. Macro générée & erreur 5992
    Par Khark dans le forum VBA Word
    Réponses: 8
    Dernier message: 20/08/2009, 15h04
  2. Création d'une macro mais erreur
    Par guismoman33 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/06/2007, 18h14
  3. [Macro]Exécution macro, message Erreur 3441
    Par samca dans le forum IHM
    Réponses: 1
    Dernier message: 25/04/2007, 20h17
  4. Réponses: 5
    Dernier message: 18/01/2006, 22h57
  5. Erreur affichage fond d'écran sous fluxbox
    Par Thrystan dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 19/12/2005, 02h35

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