MSGBOX d'alerte sur condition avec contenu variable

Fermé
JL2r - 22 août 2013 à 15:35
 JL2r - 27 août 2013 à 15:54
Bonjour !!

Je m'échine depuis 2 semaines sur un cas qui doit pourtant être très simple, j'en suis sur...

l'état des lieux :

J'ai un tableau de suivi des affaires avec en Colonne E le nom du client, en F la reférence du chantier et, en CN un état ( "a relancer" ou non) défini par une fonction.

Mon souhait :
Afficher à l'ouverture du classeur, une msgbox qui reprendrait le contenu des colonnes E et F (nom et ref chantier), pour chaque ligne à partir de la 5eme et donc la valeur de la cellule CN = A RELANCER

J'arrive à imaginer fugacement le code mais impossible de l'écrire.

Je remercie et m'incline devant toutes les personnes qui, dans leur grande bonté, m'offrirons leur aide!





4 réponses

philmtjn Messages postés 59 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 26 juillet 2017 4
22 août 2013 à 16:01
bonjour, je veux bien t'aider. Mais, pourrais-tu mettre un extrait de ton fichier pour voir ce que je peux faire ?

Comme ca, sans extrait... je ferais une boucle do_loop pour mettre dans une variable le contenu des cellules des colonnes E et F non-vide et je ferais un msgbox de la variable... avec un séparateur a chaque ligne pour que la msgbox ne dépasse pas l'ecran.

J'attend ton extrait, je te repondrai avec la macro.

a bientot
0
Merci beaucoup ! sympa de te pencher sur mon cas. je te file un suivi factice. c'est exactement le même tableau que j'utilise tout les jours, c'est juste des données fausses.

tu remarquera en CN les mentions " A RELANCER". je voudrais que les noms de clients et les chantiers respectifs s'affichent dans la même msgbox à la ligne des un des autres. comme ça quoi :


Client a - Chantier a
Client b - Chantier b
Client c - Chantier c

Si et seulement si CN = A RELANCER.

précisions :
Le vrai fichier va faire dans les 300 lignes environs mais une 20aines de cas sont et seront à relancer.

Encore un grand merci.

https://docs.google.com/file/d/0B13NnRQ_tyrlOFRFUWVhcGxnMTg/edit?usp=sharing</code>
                
                
0
philmtjn Messages postés 59 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 26 juillet 2017 4
24 août 2013 à 19:09
Bonjour,
N'arrivant pas à mettre le fichier en partage .... je vous met ici le code à mettre dans le "Thisworkbook" en VBA.
il vous suffira de coller le code dans la fenetre. Si vous ne savez pas où... je vous l'indiquerai, sinon.... allez-y et dites-moi si ca marche.
Le "scan" des lignes part de la ligne 5 et s'arrête si le client (colonne 5) est vide.
J'ai mis un peu de commentaires dans le code... s'il en faut plus, dites-le moi.

Private Sub Workbook_Open()
    Dim Chaine As String        'Variable qui recoit la chaine a afficher a l'ouverture
    Dim I As Long               'Variable de boucle
    
    'état     est en colonne : CN soit 3*26+14=78+14=92
    'Client   est en colonne : E soit 5
    'Chantier est en colonne : F soit 6
    
    'l'onglet se trouve dans le classeur courant dans le premier onglet
    
    I = 5 ' la premiere ligne a traiter est 5
    Chaine = "Relancer les clients suivants :" + Chr(13) + Chr(10)
    Do Until Sheets(1).Cells(I, 5) = "" 'on admettra qu'un client est TOUJOURS renseigné
        'Donc, on s'arrete sur un client vide
        If Sheets(1).Cells(I, 92) = "A RELANCER" Then
            Chaine = Chaine + Sheets(1).Cells(I, 5) + "-" + Sheets(1).Cells(I, 6) + Chr(13) + Chr(10)
        End If
        I = I + 1
    Loop
    MsgBox Chaine
End Sub

0
Super je test ça demain et te dit ce que ça donne.

Merci beaucoup pour ton aide! !
0
AAAAAHHHHH ça fonctionne !!!! Je me prosterne humblement....

mais... ( eh bah ouai...) si un jour je rajoute une feuille dans mon classeur? ça fout tout par terre non?
0
je précise, parce que dans la bataille je me suis emballé!
Si j'ajoute une deuxième feuille avec le même tableau ( genre un 2012 et un 2013) est ce que le code va tourner sur
a) les deux feuilles?
b) la première feuille?
c) aucune des deux?
d) 42?

Merci beaucoup encore.
0
philmtjn Messages postés 59 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 26 juillet 2017 4
27 août 2013 à 10:13
il faudra rajouter un parcours des onglets car le code ne marche que sur le premier onglet { sheets(1) }

tu devras encadrer le DO..... LOOP par un truc du style :

Chaine=""
for J=1 to sheets.count
I=5

DO....LOOP

next

et biensur, dans la DO...LOOP, il faudra remplacer sheets(1) par sheets(J)

Attention : si tu mets le Chaine="" dans la boucle FOR, tu n'auras le résultat que de la dernière feuille... ce que tu ne veux pas ;)

Si tu ne veux pas toutes les feuilles, j'ai une astuce aussi... un truc qui dit si l'onglet est de couleur rouge, tu l'ignores.... ou si le nom de l'onglet commence par le caractère _ (ou un autre) tu l'ignores ....
Tu dis si tu as besoin de ce genre d'astuces. Si c'est tous les onglets qui existent dans le classeur.... c'est plus simple.
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 702
26 août 2013 à 11:27
Bonjour a vous deux

'code de base de philmtjn - 24 août 2013 à 19:09
Private Sub Workbook_Open()
    Dim Chaine As String        'Variable qui recoit la chaine a afficher a l'ouverture
    Dim I As Long                   'Variable de boucle
    
    'état     est en colonne : CN soit 3*26+14=78+14=92
    'Client   est en colonne : E soit 5
    'Chantier est en colonne : F soit 6
    
    'l'onglet se trouve dans le classeur courant dans le premier onglet
    
    I = 5 ' la premiere ligne a traiter est 5
    Chaine = "Relancer les clients suivants :" & vbCrLf
    For x = 1 To Sheets.Count
        Do Until Sheets(x).Cells(I, "E") = "" 'on admettra qu'un client est TOUJOURS renseigné
            'Donc, on s'arrete sur un client vide
            If Sheets(x).Cells(I, "CN") = "A RELANCER" Then
                Chaine = Chaine + Sheets(x).Cells(I, "E") + "-" + Sheets(x).Cells(I, "F") & vbCrLf
            End If
            I = I + 1
        Loop
    Next x
    MsgBox Chaine
End Sub


'legere optimisation: ne pas parcourir toutes les cellules d'un onglet, tous les onglets si pas de relance

Private Sub Workbook_Open()
    Dim Chaine As String        'Variable qui recoit la chaine a afficher a l'ouverture
    Dim plage As Range, x As Byte, cmp As Byte
    Dim Nom_Onglet As String, Cas_Rech
    
    Cas_Rech = "A RELANCER"
    Chaine = "Relancer les clients suivants :" & vbCrLf
    'boucle des onglets
    For x = 1 To Sheets.Count
        'Nom_Onglet au cas ou il y aurait a tester le nom
        Nom_Onglet = Worksheets(x).Name
        With Worksheets(Nom_Onglet)
            'Recherche derniere ligne colonne E Client
            derlig = Range("E" & Rows.Count).End(xlUp).Row
            'au moins une ligne de Client
            If derlig > 4 Then
                'Definition Plage de cellule pour recherche colonne CN
                Set plage = .Range("CN5:CN" & derlig)
                'Recherche du nombre de fois "a relancer"
                Nb_fois = Application.CountIf(plage, Cas_Rech)
                'si au moins une fois
                If Nb_fois > 0 Then
                    'ligne de depart
                    Lig = 5
                    'boucle de recherche
                    For cmp = 1 To Nb_fois
                        'Recherche de la ligne colonne CN
                        Lig = .Columns("CN").Find(Cas_Rech, .Cells(Lig, "CN"), , xlWhole).Row
                        'Ecriture
                        Chaine = Chaine + .Cells(Lig, "E") + "-" + .Cells(Lig, "F") & vbCrLf
                    Next cmp
                End If
            End If
        End With
    Next x
    MsgBox Chaine
End Sub
0
Hello Hello.

Perso, ça fonctionne pas.

Erreur d'exécution '91':
Variable objet ou variable de bloc With non définie.

le débogage me montre cette ligne mais moi et mon niveau de VBA, on y pige rien. :

Lig = .Columns("CN").Find(Cas_Rech, .Cells(Lig, "CN"), , xlWhole).Row
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 702
Modifié par f894009 le 26/08/2013 à 12:06
Re,

quand vous avez l'erreur, click sur debugage, placez le curseur souris sur lig pour voir le contenu de cette variable.

fichier test:

https://www.cjoint.com/c/CHAmgHCFvMF

A+
0
philmtjn Messages postés 59 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 26 juillet 2017 4
27 août 2013 à 10:21
Bonjour,
Personnellement, je n'aime pas les RANGE en VBA. Faut calculer les lettres si on veut faire qqchose qui marche dans tous les cas et c'est plus long en temps d'exécution.
Et que croyez-vous que fait la fonction Find ?? Elle repasse la main à Excel pour rechercher parmi toutes les cellules le contenu serait la chaine recherchée ...
Il vaut mieux éviter le plus possible les aller-retour entre Excel et VBA.

Il y a toujours moyen de bloquer le calcul automatique et le rafraichissement de l'affichage pour accroitre la vitesse d'exécution si la recherche doit avoir lieu sur plus de 30000 (trente milles lignes). Attention au changement d'onglet si on désactive le rafraichissement... les recherches et autres parcours de cellules (que ce soit RANGE ou CELLS) il y aura des effets indésirables...

A+
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 702
Modifié par f894009 le 27/08/2013 à 11:07
Bonjour philmtjn

Personnellement, je n'aime pas les RANGE en VBA. Faut calculer les lettres si on veut faire qqchose qui marche dans tous les cas et c'est plus long en temps d'exécution. Il y a la solution de mettre toutes les donnees en tableaux et travailler en memoire, dans le cas present ce n'est peut-etre pas justifie.

Et que croyez-vous que fait la fonction Find ?? Elle repasse la main à Excel pour rechercher parmi toutes les cellules le contenu serait la chaine recherchée . Regardez un peu mieux

Il vaut mieux éviter le plus possible les aller-retour entre Excel et VBA. Oui, dans votre exemple, c'est pas le cas

Il y a toujours moyen de bloquer le calcul automatique et le rafraichissement de l'affichage pour accroitre la vitesse d'exécution Oui, mais peut-etre que la personne qui a demande va trouver, sinon que lui reste-t-elle a chercher !!!!

Bye
0
philmtjn Messages postés 59 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 26 juillet 2017 4
27 août 2013 à 12:49
re bonjour,
oui, faire tout ce n'est peut-être pas très constructif ... mais faire chercher avec des erreurs, je ne trouve pas cela très judicieux.

Je ne met pas de script que je n'ai pas testé sans erreur. Et, j'aime bien donner des pistes pour améliorer.

bye ;)
0
Bonjour Messieurs.

Au final j'ai réadapté mon tableau et son utilisation et j'ai donc modifié une partie des codes que vous m'avez si généreusement donné.

Le tout fonctionne. je m'en sors donc avec un fichier qui tourne rond et répond à ce que je veux et une connaissance approfondi des méandres du VBA ( même si je me gratte souvent la tête en regardant les lignes).

Je vous remercie donc et m'en vais de ce pas allumer une bougie en l'honneur de votre génie et générosité. ( sors de la pièce en se prosternant 3 fois)

A bientôt peut être.
0