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 :

Msgbox et comparaison de valeurs [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut Msgbox et comparaison de valeurs
    Bonsoir,

    Je travaille sur un classeur (composé de plusieurs feuilles) dans lequel j'ai une colonne dont les cellules sont remplies de données numériques, une autre avec les seuils fixés pour ces valeurs, et une dernière indiquant les noms des éléments mesurés.

    Je souhaiterais afficher une seule Msgbox à la fin de l'exécution de la macro permettant de récupérer les données, informant l'utilisateur d'éventuels dépassements de seuils, quels éléments ces dépassements concernent, et la quantité mesurée par rapport au seuil fixé.

    Enfin, dans le cas où aucun dépassement n'aurait eu lieu, une autre Msgbox, différente, informant de la conformité globale des valeurs.

    Ci-joint, un exemple de fichier, avec une précision assez importante.

    Pensez-vous ceci possible ? Si tout n'étais pas clair, n'hésitez pas à m'en faire part !

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour m@tix,

    Tu pourrais aussi tout afficher dans une seule msgbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MsgBox "Fin du traitement des données :" & vbCrLf & vbLf & _
        "   - T1 => OK" & vbLf & _
        "   - T2 => Dépassement Seuil " & Range("A1").Value & vbLf & _
        "   - T3 => OK"

  3. #3
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonjour jfontaine,

    Merci pour ta réponse. En fait, mes données se répartissant en réalité sur une dizaine de feuilles, j'en ai un nombre bien trop important pour me permettre de toutes les afficher sur une msgbox. Donc j'insiste, j'aimerais bien, si possible, séparer les deux cas..

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    utilise une variable string dans laquelle tu prépare ton 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
     
    dim stMess as string 
    (...)
    ' Si dépassement :
    stMess = stMess & " Dépassement variable XXXX :   YYYY > ZZZ " & vbCrLf
    '....
     
    (...)
    'Au final
    if stMess = "" then
       msgBox "OK"
    else
       msgBox stMess,VbCritical
    endif

  5. #5
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Ok, ça me semble jouable avec tes indications bbil, merci !
    Par contre, je cale toujours concernant le code pour justement comparer toutes les valeurs aux seuils fixés, de par la mise en forme du fichier.. D'ailleurs, je joins à ce message une mise en forme vraiment fidèle, que le premier fichier ne suivait pas.

    Fichier joint dans vos discussions

  6. #6
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    ce n'est pas se rendre la vie facile que de fusionner des cellules si on veut les utiliser en VBA ensuite

  7. #7
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par m@tix Voir le message
    Ok, ça me semble jouable avec tes indications bbil, merci !
    Par contre, je cale toujours concernant le code pour justement comparer toutes les valeurs aux seuils fixés, ..
    Dis nous comment sont organisé tes données.. tu parle d'une colonne valeur, une colonne seuils une colonne nom ...et de plusieurs feuilles... cela veut dire quoi ..? que les colonnes ne sont pas dans la même feuille .?

  8. #8
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Citation Envoyé par jfontaine Voir le message
    ce n'est pas se rendre la vie facile que de fusionner des cellules si on veut les utiliser en VBA ensuite
    J'y étais obligé pour respecter une certaine mise en forme. C'est un paramètre que je dois absolument conserver, même si je sais que ça ne rend pas les choses aisées en effet..

    Citation Envoyé par bbil Voir le message
    Dis nous comment sont organisé tes données.. tu parle d'une colonne valeur, une colonne seuils une colonne nom ...et de plusieurs feuilles... cela veut dire quoi ..? que les colonnes ne sont pas dans la même feuille .?
    Je viens de joindre un classeur à mon dernier message. Je n'ai mis qu'une seule feuille, car les autres sont du même type, donc si vous me montrez pour une, je pense pouvoir y parvenir avec les autres non ?
    Au passage bbil, si je suis ton code de tout à l'heure, stMess ne sera jamais vide non ? Il y aura toujours au minimum " Dépassement variable XXXX....", et du coup on ne rentrera jamais dans la condition if stMess = "" .

  9. #9
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    un peu d'effort de description ..

    Je n'ouvre pas les fichiers joints..

  10. #10
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Citation Envoyé par bbil Voir le message
    Je n'ouvre pas les fichiers joints..
    Ah... Pourtant là cela aurait été grandement utile.. Difficile de décrire l'organisation de mes données. En gros, disons que les mesures apparaissent sur la colonne G (fusionnée avec H), les seuils colonne C (mais le nombre est ici suivi de l'unité...), et les noms colonne A.

    A titre d'exemple (pour montrer la difficulté de la chose), le premier nom s'étend sur 4 lignes, car on fait 4 mesures distinctes. De plus, les deux premières mesures correspondent au même seuil, mais ce-dernier, affiché en colonne C, se trouve dans deux cellules fusionnées..

    Bref, quel dommage que tu ne puisses ouvrir mon fichier !

    Edit: je viens de retirer mes pièces jointes, à première vue on ne les place qu'en dernier recours !

  11. #11
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    arf... donc comme le dit jfontaine ... l'utilisation de "lignes" fusionnées va compliquer la chose...

    le nombre de ligne est-il variable ?
    y a-t-il une ligne de titre ?

  12. #12
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Malheureusement oui, le nombre de lignes est variable selon l'élément considéré... Mais peut-être qu'en faisant un exemple sur un type de données, je pourrais adapter au reste ?

    On retrouve une ligne de titre en haut de chaque page oui.

  13. #13
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    pour les lignes fusionnées mergeArea semble être la solution :

    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
    Option Explicit
    Sub TestPlageValeurs()
    Const icVAL = 2  'Colonne valeur
    Const icSEUILS = 3  'Colonne Seuils
    Const icNom = 1 'colonne Repére
    Dim iNbLignes As Integer 'Nombre de ligne du fichier
    Dim i As Integer
    Dim stMess As String 'Message final
    Dim sh As Worksheet 'Feuille en cours de traitement
    Dim rVal As Double, rSeuil As Double, stNom As String
    Set sh = ThisWorkbook.Sheets("Feuil3")
    iNbLignes = sh.Range("A1").CurrentRegion.Rows.Count
    For i = 2 To iNbLignes ' 2 car 1° ligne de titre
        stNom = sh.Cells(i, icNom).MergeArea.Cells(1, 1)
        rVal = sh.Cells(i, icVAL).MergeArea.Cells(1, 1)
        rSeuil = sh.Cells(i, icSEUILS).MergeArea.Cells(1, 1)
        If rVal > rSeuil Then stMess = stMess & " Dépassement : " & stNom & " " & rVal & " > " & rSeuil & vbCrLf
    Next
    If stMess = "" Then
        MsgBox "OK"
    Else
       MsgBox stMess, vbCritical
     
    End If
     
    End Sub
    modifie les premières lignes définissant les numéros de colonnes et le nom de fichier ... la cellule A1 doit appartenir à ton tableau ...

  14. #14
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonjour !

    Je suis en train d'essayer d'adapter ton code bbil à mes feuilles, pour l'instant ça m'a l'air super !!

    J'ai cependant deux questions complémentaires:

    1) Peut-on modifier ce code de telle sorte que les valeurs relativement importantes apparaissant dans la msgbox le soient sous forme scientifique (via Selection.NumberFormat = "0.00E+00" peut-être, mais où ?) ?

    2) Je suis parfois amené à avoir dans la colonne des valeurs (pour icVAL = 2 donc) des données sous la forme <0,1, voire à d'autres moments <0.1, <1,0E-1 ou enfin <1.0E-1 (0.1 ou 0,1 est pris à titre d'exemple, mais toujours avec le signe <, jamais >). Serait-il envisageable de traiter de tels cas ? Autrement dit, dans ces cas là, si par exemple le seuil fixé est 5, alors logiquement, pas de dépassement de seuil. Si par contre le seuil était 0,05, dépassement de seuil.

    Je suis conscient que ce dernier point est réellement ennuyeux à gérer/traiter, mais je ne peux malheureusement pas modifier le mise en forme de ces données. Je comprendrais tout à fait si la prise en compte d'un tel traitement était trop compliqué à mettre en place.

    Encore merci !

  15. #15
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    pour le 1)

    c'est dans l'écriture dans stMess :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If rVal > rSeuil Then stMess = stMess & " Dépassement : " & stNom & " " & Format( rVal,"0.00E+00" )  & " > " & rSeuil & vbCrLf

    pour le 2)

    il faut modifier la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rVal = sh.Cells(i, icVAL).MergeArea.Cells(1, 1)
    prendre d'abords la valeur retourner dans une chaine .., contrôler la présence du < (avec InStr) , si pas présent .. affecter cette valeur directement à rVal, si présent avant affectation supprimer le < (avec replace ) et transformer les "," en "." avec replace, puis affecter le résultat à rVal ...

  16. #16
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Ok, merci pour tes conseils !

    La notation scientifique, impeccable.

    Concernant la prise en compte des autres types de données, j'ai fait ainsi en suivant ton algo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    temp = sh.Cells(i, icVAL).MergeArea.Cells(1, 1)
     
        If InStr(1, temp, "<") = 0 Then
     
            rVal = temp
     
        Else
     
            temp = Replace(temp, "<", "")
            temp = Replace(temp, ".", ",")
            temp = CDbl(temp)
            rVal = temp
     
        End If
    Seul problème, lors de l'affichage sur la msgbox en cas de dépassement, on retrouve la valeur sans le signe < affiché dans le cas où il y en a un... Une idée pour pallier ceci ?

    Enfin (je l'espère), quelques petites questions de mise en forme:

    - Je souhaitais rajouté un alinéa devant chaque élément détecté sur la msgbox, mais en rajoutant un espace (" "), seul le premier élément se retrouve décalé...

    - Peut-on augmenter la taille (largeur) de la msgbox ? En effet, parfois les lignes sont un peu longues et on observe alors un retour à la ligne. Je ne pense pas que ce soit faisable, et qu'il faudrait alors passer à une userform si c'était vraiment gênant n'est-ce pas ?

    - Existe-t-il une commande vba pour supprimer un retour à ligne sur une chaîne de caractère récupérée dans une cellule ?

    Voilà... ! Merci d'avance !

  17. #17
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    - Peut-on augmenter la taille (largeur) de la msgbox ? En effet, parfois les lignes sont un peu longues et on observe alors un retour à la ligne. Je ne pense pas que ce soit faisable, et qu'il faudrait alors passer à une userform si c'était vraiment gênant n'est-ce pas ?
    A ma connaissance non, il faudra en effet passer par une userform


    Existe-t-il une commande vba pour supprimer un retour à ligne sur une chaîne de caractère récupérée dans une cellule ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Replace(Range("A1").Value, Chr(10), " ")

  18. #18
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par m@tix Voir le message
    Seul problème, lors de l'affichage sur la msgbox en cas de dépassement, on retrouve la valeur sans le signe < affiché dans le cas où il y en a un... Une idée pour pallier ceci ?
    utilise une variable chaine stVal pour mémoriser la valeur et sont format avant traitement .. et utilise stVal lors de la mise en place dans stMess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim stVal as string
    (...)
        stVal = sh.Cells(i, icVAL).MergeArea.Cells(1, 1)
    (...)
    If rVal > rSeuil Then stMess = stMess & "       Dépassement : " & stNom & " " & stVal & " > " & rSeuil & vbCrLf
    et rajoute aussi l'espace désiré devant le texte dépassement .. pour :
    Citation Envoyé par m@tix Voir le message
    - Je souhaitais rajouté un alinéa devant chaque élément détecté sur la msgbox, mais en rajoutant un espace (" "), seul le premier élément se retrouve décalé...

  19. #19
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    C'est parfait, tout fonctionne bien, un grand merci à vous deux ! En plus, j'ai appris des choses.

    J'en profite pour faire une autre remarque si une tentative de ma part...
    Je voulais récupérer dans une variable l'unité présente dans les cellules correspondant aux différents seuils. De façon générale, c'est de la forme:

    3.0e+7 m3/s, ou encore 3.50 GPa, etc...

    Pour ce faire, j'ai pensé utiliser la fonction mid de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim unite As Variant, unite2 As Variant
     
    unite = sh.Cells(i, icSEUILS).MergeArea.Cells(1, 1)
    unite2 = Val(unite)
    unite = Mid(unite, Len(unite2) + 1)
    Curieusement (du moins pour moi), parfois cela fonctionne (première cellule par exemple), et parfois non (souvent même ), je retrouve plus que nécessaire dans unite. Où est le souci ?

  20. #20
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    si un espace sépare toujours la valeur de l'unité tu peu faire avec un split...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Dim tb
      tb = Split(stVal , " ")
    msg box "unité : " & tb(1)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA] MsgBox pour entrer une valeur
    Par Pitou5464 dans le forum Access
    Réponses: 3
    Dernier message: 22/08/2006, 16h19
  2. GTK+ comparaison entier valeur du pointeur
    Par Emyleet dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 21/07/2006, 15h28
  3. comparaison de valeur sur un résultat de requete
    Par griese dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 15h23
  4. comparaison de valeurs
    Par Flobynaldo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/05/2006, 16h56
  5. Comparaison de valeurs stockees dans un meme champ
    Par Tartenpion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/02/2006, 21h33

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