A voir également:
- Vba message box variable
- Message - Guide
- Recuperer message whatsapp supprimé - Guide
- Message d'absence thunderbird - Guide
- Adresse ip box - Guide
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
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
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
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.
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>
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
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.
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
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
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.
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.
f894009
Messages postés
17206
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
22 novembre 2024
1 710
26 août 2013 à 11:27
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
f894009
Messages postés
17206
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
22 novembre 2024
1 710
Modifié par f894009 le 26/08/2013 à 12:06
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+
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+
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
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+
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+
f894009
Messages postés
17206
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
22 novembre 2024
1 710
Modifié par f894009 le 27/08/2013 à 11:07
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
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
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
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 ;)
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 ;)
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.
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.