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 :

Programmer un sytème d'alerte par pop up


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Programmer un sytème d'alerte par pop up
    Bonjour,

    J'ai besoin de créer une macro Excel et je n'ai aucune connaissance en VB .

    Je dois positionner un système d'alerting sous forme de message pop-up sur un fichier Excel de sorte que :

    # Cylce de déclenchement
    - Tous les 3/4 d'heures

    # Balayage
    - Lis la colonne "C"
    - Lis la colonne "F"

    # Triple Condition
    - Si tu Trouves la chaîne de caractères "KO" dans la colonne "C"
    Et que tu Trouves la chaîne de caractères "GISD" dans la colonne "G"
    Et que ces deux chaînes de caractères appartiennent à la même ligne du Fichier Excel

    # La Triple Condition est remplie ==>> Message d'alerte
    - Alors Envoie un pop up d'alerte contenant le texte "blablabla..." ainsi que le ou les numéros de ligne(s) correspondant(s) à ce qui a été trouvé par le blayage.

    # La Triple Condition n'est pas remplie
    - Alors ne fais rien et boucle

    Voilà, je sais faire le truc sous linux mais je ne maîtrise rien au langage objet VB pour l'instant et malheureusement j'ai pas le temps de creuser dans l'immédiat.

    Quelqu'un pourrait-il m'aider ?

    Merci à vous, cdlt,

    Lamadi

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    salut a toi,

    1 ere question, a quoi ça sert de balayer la colonne C et surtout F si tu fais des tests sur C et G ??

    sinon je pense que ça pourrait t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub test()
     
        Range("C2").Select
        Do Until ActiveCell.Value = ""
            If ActiveCell.Value = "KO" And _
               ActiveCell.Offset(0, 4).Value = "GISD" Then
                MsgBox ("BLABLABLA et la ligne est :" & ActiveCell.Row)
            End If
            ActiveCell.Offset(1, 0).Select
        Loop
     
    End Sub
    C'est pas dans les regles de l'art mais ça tourne.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Précisions...
    Bonjour,

    Chapeau pour la réactivité et mille mercis.

    J'ai rédigé trop vite ma requête. En fait je souhaite lire toutes les cellules des colonnes C et G et envoyer un pop up si on a une correspondance "KO" (colonne C) et "GISD" (colonne G) à la même ligne du fichier.

    J'aimerais que cet utilitaire de serveillance tourne tous les 3/4 d'heure en automatique sur mon fichier.

    Voilà...

  4. #4
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut,

    Voici une procédure pour le timer à modifier :

    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
        Dim bTop As Boolean
        bTop = False
     
        'Tant que l'heure <17 soit heure < 17:00:00
        While Hour(Time) < 17
            'Toutes les 12 minutes
            If Minute(Time) Mod 12 = 0 And bTop = False Then
                bTop = True
                'Action à réaliser
            End If
            'bTop à False sinon pendant 1 minute l'action s'exécute
            If Minute(Time) Mod 12 = 1 And bTop = True Then
                bTop = False
            End If
            DoEvents
        Wend
    C'est sans prétention... certainement améliorable : mais ça fonctionne.


  5. #5
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Salut Rémi,

    Citation Envoyé par RemiT Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
        
        Range("C2").Select
        Do Until ActiveCell.Value = ""
            If ActiveCell.Value = "KO" And _
               ActiveCell.Offset(0, 4).Value = "GISD" Then
                MsgBox ("BLABLABLA et la ligne est :" & ActiveCell.Row)
            End If
            ActiveCell.Offset(1, 0).Select
        Loop
                
    End Sub
    Tu tiens à sélectionner les cellules, décidément Non seulement, ce n’est pas nécessaire, mais il n’est même pas utile que la feuille concernée soit la feuille active.

    En outre, pourquoi boucler sur toutes les lignes, tant qu’une cellule vide n’est pas rencontrtée ? Pourquoi s’arrêter d’ailleurs, quand une cellule vide est rencontrée? Cela ne signifie nullement qu’il n’y a pas d’autres cellules plus bas contenant "KO" Si on continue, cela peut être long : je te rappelle qu’avec Excel 2007, une feuille a plus d’un million de lignes.

    Il faut boucler exclusivement sur les cellules situées en colonne C, qui contiennent "KO".

    Le code ci-après est plus long, et plus complexe, mais il sera bien plus rapide à l’exécution.

    Cordialement,

    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
    Option Explicit
    Private Message As String
     
    Sub Alertes()
    Dim f As Worksheet, Ref As Range, LigneRef As Long, NumLigne As Long
        ' Le nom de feuille est à adapter, et le "ThisWorkbook" implique que le
        ' module contenant le code est dans le même classeur que la feuille.
        Set f = ThisWorkbook.Sheets("Feuil1")
        NumLigne = 0
        Message = "La combinaison ""KO"" en colonne C et ""GISD"" en colonne G a été trouvée sur la ou les ligne(s) : " & vbNewLine
            With Range(f.Range("C:C"), f.UsedRange)
                Set Ref = .Find("KO", , xlValues, xlWhole)
                    If Not Ref Is Nothing Then
                            ' On s'assure que la chaine "KO" a été trouvée en colonne C
                            If Ref.Column = 3 Then
                                LigneRef = Ref.Row
                                If Ref.Offset(0, 4) = "GISD" Then MAJMessage LigneRef
                                    Do
                                        Set Ref = .FindNext(Ref.Offset(1))
                                        NumLigne = Ref.Row
                                        ' Lorsque la rechereche ramène à la première cellule trouvée, on sort de la boucle.
                                        If NumLigne = LigneRef Then Exit Do
                                        If Ref.Offset(0, 4) = "GISD" Then MAJMessage NumLigne
                                    Loop
                                MsgBox Message
                            End If
                    End If
            End With
    End Sub
     
    Sub MAJMessage(NumLigne As Long)
        Message = Message & NumLigne & vbNewLine
    End Sub

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Système d'alerte par pop up
    Bonjour,

    Merci pour ces préciseuses réponses...

    Je ne parviens pas à faire fonctionner la macro...

    Comment injecter ce code dans une macro et le faire tourner ?

    Bigalo : quel partie de ton script permet d'éxecuter la macro tous les 3/4 d'heure ?

    Merci de votre aide

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Bigalo Voir le message

    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
     
    Option Explicit
    Private Message As String
     
    Sub Alertes()
    Dim f As Worksheet, Ref As Range, LigneRef As Long, NumLigne As Long
        ' Le nom de feuille est à adapter, et le "ThisWorkbook" implique que le
        ' module contenant le code est dans le même classeur que la feuille.
        Set f = ThisWorkbook.Sheets("Feuil1")
        NumLigne = 0
        Message = "La combinaison ""KO"" en colonne C et ""GISD"" en colonne G a été trouvée sur la ou les ligne(s) : " & vbNewLine
            With Range(f.Range("C:C"), f.UsedRange)
                Set Ref = .Find("KO", , xlValues, xlWhole)
                    If Not Ref Is Nothing Then
                            ' On s'assure que la chaine "KO" a été trouvée en colonne C
                            If Ref.Column = 3 Then
                                LigneRef = Ref.Row
                                If Ref.Offset(0, 4) = "GISD" Then MAJMessage LigneRef
                                    Do
                                        Set Ref = .FindNext(Ref.Offset(1))
                                        NumLigne = Ref.Row
                                        ' Lorsque la rechereche ramène à la première cellule trouvée, on sort de la boucle.
                                        If NumLigne = LigneRef Then Exit Do
                                        If Ref.Offset(0, 4) = "GISD" Then MAJMessage NumLigne
                                    Loop
                                MsgBox Message
                            End If
                    End If
            End With
    End Sub
     
    Sub MAJMessage(NumLigne As Long)
        Message = Message & NumLigne & vbNewLine
    End Sub
    sacré Michel... T'as vu la complexité...

    Concernant Excel 2007, moi je tourne avec Excel 97... ça fini pareil mais bon...

  8. #8
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Citation Envoyé par RemiT Voir le message
    sacré Michel... T'as vu la complexité...
    C'est peut-être un peu + complexe, à peine , mais je te garantis que c'est beaucoup plus efficace !

    Il n'est pas nécessaire que la feuille concernée ni même le classeur auquel elle appartient soient actifs, et on ne boucle qu'à travers les cellules de la colonne C pouvant être concernées par l'anomalie.

    En plus, nous sommes sur un site qui s'adresse en principe à des développeurs, et ce degré de complexité ne devrait donc pas poser de problème.

    Bonne soirée,

  9. #9
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Citation Envoyé par lamadi Voir le message
    Je ne parviens pas à faire fonctionner la macro...
    Quel est le problème ? As-tu tenu compte de ces 3 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        ' Le nom de feuille est à adapter, et le "ThisWorkbook" implique que le
        ' module contenant le code est dans le même classeur que la feuille.
        Set f = ThisWorkbook.Sheets("Feuil1")
    Si tu as entré le code dans un autre classeur que celui où est la feuille à contrôler, il faut le modifier ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Set f = Workbooks("Nom du classeur").Sheets("Feuil1")
    et adapter le nom du classeur et celui de la feuille concernés.

    NB - Je suis à l'extérieur ; je mettrai mon fichier test en pièce jointe quand je serai rentré.

    Citation Envoyé par lamadi Voir le message
    Bigalo : quel partie de ton script permet d'éxecuter la macro tous les 3/4 d'heure ?
    Aucune, Lou Pitchoun t'avait déjà répondu sur cette partie.

  10. #10
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Programmer un système d'alerte par pop up
    Bonjour,

    Bigalo : je viens de tester la macro :

    Elle fonctionne..... Tous le temps c'est à dire même quand aucune correspondance linéaire n'existe entre le KO (colonne C) et GISD (autre colonne), j'ai toujours le pop up...
    De plus quand la correspondance existe, les numéros de ligne ne s'affichent pas ?

    Pour le Timer, je comprends pas trop le fonctionnement : Faut-il créer une autre macro pour le Timer ou copier coller le Timer dans la macro "alertes" ?
    Je ne vois pas comment soumettre l'éxecution de la macro "alertes" au Timer.

    Merci pour vos réponses.

    Lamadi

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Programmer un système d'alerte
    Bonjour Bigalo :

    J'ai un peu creusé et réussi à adapter le truc. Franchement chapeau ça tourne super bien.

    J'aurais encore deux trois ajustements si tu as le temps.
    Si le balayage ne trouve aucune correspondance linéraire KO-GISD me serait-il possible qu'un autre message pop up remonte du style "vous n'avez aucun ticket GISD en KO". Peut être que celà complique trop le script.


    Quant au timer je comprends toujours pas comment ça fonctionne et comment l'adapter pour automatiser le déclenchement de la macro alertes toutes les 45 minutes.

    Je promets de me faire bientôt payer une formation VB par mon employeur mais en attendant au secours aider moi !!!

  12. #12
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Désolé pour le délai. La semaine dernière, j’avais dû prolonger un séjour en montagne, à cause d’un problème de voiture, et j'étais très disponible, ce qui n’est plus le cas cette semaine.

    Pour éviter l’affichage du message quand aucune combinaison "KO" en colonne C et "GISD" en colonne G n’est trouvée, il suffit d’ajouter un booléen, que l’on fait passer à True, lorsu’une combinaison est trouvée.

    On utilise ensuite ce booléen pour afficher ou non le message :

    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
    Sub Alertes()
    Dim f As Worksheet, Ref As Range, LigneRef As Long, NumLigne As Long, Trouve As Boolean
        ' Le nom de feuille est à adapter, et le "ThisWorkbook" implique que le
        ' module contenant le code est dans le même classeur que la feuille.
        Set f = ThisWorkbook.Sheets("Feuil1")
        NumLigne = 0
        Message = "La combinaison ""KO"" en colonne C et ""GISD"" en colonne G a été trouvée sur la ou les ligne(s) : " & vbNewLine
            With Range(f.Range("C:C"), f.UsedRange)
                Set Ref = .Find("KO", , xlValues, xlWhole)
                    If Not Ref Is Nothing Then
                        ' On s'assure que c'est bien en colonne C, que la chaine "KO" a été trouvée
                            If Ref.Column = 3 Then
                                LigneRef = Ref.Row
                                    If Ref.Offset(0, 4) = "GISD" Then
                                        MAJMessage LigneRef
                                        Trouve = True
                                    End If
                                    Do
                                        Set Ref = .FindNext(Ref.Offset(1))
                                        NumLigne = Ref.Row
                                        ' Lorsque la recherche ramène à la première cellule trouvée, on sort de la boucle.
                                        If NumLigne = LigneRef Then Exit Do
                                            If Ref.Offset(0, 4) = "GISD" Then
                                                MAJMessage LigneRef
                                                Trouve = True
                                            End If
                                    Loop
                                If Trouve Then MsgBox Message
                            End If
                    End If
            End With
    End Sub
    Pour le Timer, quel est le probème avec le code de Lou Pitchoun ?

Discussions similaires

  1. alerte par mail
    Par sanhoua dans le forum Modélisation
    Réponses: 2
    Dernier message: 22/10/2007, 14h59
  2. alerte par mail
    Par enkil dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 06/07/2007, 09h15
  3. alerte par envoi de mail
    Par xclear dans le forum ASP
    Réponses: 3
    Dernier message: 16/10/2006, 16h09
  4. alerte par sms oracle
    Par Richard_2 dans le forum Oracle
    Réponses: 1
    Dernier message: 22/02/2006, 14h04
  5. Réponses: 4
    Dernier message: 03/11/2005, 18h02

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