Créer 1à1 liste à partir de cellules répondant à des conditions

Résolu/Fermé
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 - 18 juil. 2014 à 12:32
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 - 23 juil. 2014 à 17:03
Bonjour,

Sous excel 2007, je n'arrive pas à créer une liste à partir de cellules qui doivent répondre à certaines conditions.

Voici l'exemple concret :

https://www.cjoint.com/?DGsmFDVfBBM

Les colonnes A, B, C et D font partie d'un tableur de suivi destiné à être actualisé petit à petit.
Le résultat cherché (colonnes F à K dans mon exemple) a pour but d'avoir de manière automatique la liste des clients/raisons concernés par un retard par rapport aux 5 jours à partir de la date de demande.

Merci d'avance pour votre aide !

P.S: recours aux Macros possible ;)
A voir également:

10 réponses

Vaucluse Messages postés 26496 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 1 avril 2022 6 395
18 juil. 2014 à 13:04
Bonjour

En VBA, je ne sais pas, mais ci joint une solution simple avec un codage en colonne E:E
ce système renvoie les valeurs dans les conditions suivantes

__si entre les deux dates il y a plus de cinq jours
__s'il y a une date en B inférieure de plus de 5 jours au jour an cours

Par contre je n'ai pas traité le problème des cellules fusionnées en A car je ne sais pas ce que l'on peut avoir comme info dans les cellules hachurées.(Il y a de toutes façons eu de chance de faire fonctionner le système avec des cellules fusionnées)
https://www.cjoint.com/?DGsneNpdftt

Par ailleurs, bien que je suppose que c'est provisoire, il n'est pas utile de fusionner les cellules à partir de F

crdlmnt

0
WeaponEDGE Messages postés 113 Date d'inscription vendredi 18 juillet 2014 Statut Membre Dernière intervention 21 novembre 2014 9
Modifié par pijaku le 18/07/2014 à 14:40
Bonjour,

Voici une version utilisant le VBA :

Pour allimenter la liste je me suis basé sur le fait qu'il y ai un commentaire ou non.
Mais ça peux très bien se faire en calculant la différence entre les 2 dates.

https://www.cjoint.com/?0GsnUeXuHRh

Petite question : comment vous faites pour mettre votre fichier en lien hypertext.
Moi je me contente de le mettre en gras mais avec le lien c'est encore mieux. ;-)
0
Vaucluse Messages postés 26496 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 1 avril 2022 6 395
Modifié par Vaucluse le 18/07/2014 à 13:59
Salut weapon
lors du dépôt de fichier, clic droit sur le lien affiché, copier le lien et coller ici
en principe ça fonctionne bien (.. mais pas toujours)
crdlmnt
0
WeaponEDGE Messages postés 113 Date d'inscription vendredi 18 juillet 2014 Statut Membre Dernière intervention 21 novembre 2014 9
18 juil. 2014 à 14:01
Ok, Merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
18 juil. 2014 à 14:41
Salut,

Suffit de ne pas le mettre en gras..... Message modifié.

Mes amitiés à Vaucluse
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
Modifié par Theo.R le 18/07/2014 à 14:34
Merci pour vos réponses rapides !

Pour Vaucluse :
les formules semblent ok, par contre je ne veux pas de vides dans ma liste, en plus ça m'oblige à ajouter une colonne (même si je peux contourner ce pb là).

Pour WeaponEDGE :

Qu'entendez-vous par "le fait qu'il y ait un commentaire" ?
Le code fonctionne très bien sur l'exemple, merci ! Néanmoins, je pensais pouvoir l'adapter pour changer le nom des cellules/colonnes mais je n'y comprend rien :/

En bref : serait-il possible d'avoir le même résultat avec les dispositions suivantes :
- l'espace des colonnes à remplir (A à D dans mon exemple) est situé dans une AUTRE feuille que la liste à obtenir, voici les références plus précises :

Les colonnes de saisie des infos (avant A à D) se trouvent dans une feuille nommée "Suivi Offres en attente" avec la répartition suivante :
- La colonne client est la colonne E (et non plus A), commençant en E2 jusqu'à indéterminé (E9000 si besoin de définir une limite)
- La colonne Date de demande est la colonne M (et non plus B), idem M2:... M9000?
- La colonne Date de remise est la colonne N (et non plus C), idem N2:...M9000?
- La colonne Raisons du retard est la colonne O (et non plus D), idem O2:...O9000?

Pour la zone où afficher le résultat (avant F à K), elle est dans une feuille nommée "Traitement des demandes", avec la répartition suivante :
- Le premier nom de client à afficher doit se trouver en B9 (fusionnée avec C9 et D9), les prochains en dessous (B10 ; B11 ; Bk..., toujours fusionnée avec Ck et Dk)
- La Raison correspondant au premier nom doit s'afficher en E9, fusionnée avec F9 et G9. Les prochaines étant en E10 ; E11 ; Ek... fusionnée avec Fk et Gk

Voilà merci d'avance !

P.S: si vous n'avez pas le courage de tout reprendre, pouvez-vous juste m'indiquer comment modifier chaque champ "source" dans le code ?
0
Vaucluse Messages postés 26496 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 1 avril 2022 6 395
Modifié par Vaucluse le 18/07/2014 à 14:42
A noter: il n'y aura pas de vide dans la liste éditée, comme le montre le tableau dans le fichier... mais restez avec Weapon en VBA, c'est sans doute mieux
Bonne route
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
Modifié par Theo.R le 18/07/2014 à 14:56
Ah j'avais mal compris le fonctionnement de votre solution ! En fait elle marche !

Merci ;)

WeaponEDGE je n'ai plus besoin du code adapté du coup :)

Merci encore une fois de votre aide à tous les deux !

Au plaisir
0
WeaponEDGE Messages postés 113 Date d'inscription vendredi 18 juillet 2014 Statut Membre Dernière intervention 21 novembre 2014 9
Modifié par pijaku le 18/07/2014 à 16:07
Theo.R,

Voici le code modifié en fonction des critères que tu m'as donné.
Rajoutes dans ton fichier un onglet nommé "Liste Retard"
Les colonnes 1 et 2 seront alimenté par la macro.

J'ai rajouté des commentaires (il apparaitrons en vert lorsque tu copieras le code) pour t'aider à comprendre le code.

Ce qu'il faut savoir si tu veux toucher aux coordonnées :
Cells(1,1) signifie la cellule A1.
les coordonnée sont les suivante : cells(N° Ligne, N°Colonne)

sheets("Suivi Offres en attente").cells(2,1) fait référence à la cellule A2 de la feuille "Suivi Offres en attente")

Pour plus de facilité dans la modification des Macros je rentre toujours le nom des Feuilles dans des variables, à savoir ShtA et ShtB. Si tu dois modifier le nom tu as juste à modifier le contenu de la variable en début de code et ce sera pris en compte pour tous le reste de la macro.

Sub Recap_CD()
    'Nom de la feuille Source
    ShtA = "Suivi Offres en attente"
    'Nom de la feuille Destination
    ShtB = "Liste Retard"

    
    'Analyse le nombre de ligne occupé dans chaque Tableau
    Nb_LigneA = Sheets(ShtA).Cells(Rows.Count, 5).End(xlUp).Row
    Nb_LigneB = Sheets(ShtB).Cells(Rows.Count, 1).End(xlUp).Row
    
    'Mise à Blanc du Tableau Destination
    For i = 2 To Nb_LigneB
        Sheets(ShtB).Cells(i, 1) = ""
        Sheets(ShtB).Cells(i, 2) = ""
    Next i
    
    'Alimentation du Tableau Destination
    X = 2
    For i = 2 To Nb_LigneA
        Commentaire = Sheets(ShtA).Cells(i, 4)
        
        If Commentaire <> "" Then
            Sheets(ShtB).Cells(X, 1) = Sheets(ShtA).Cells(i, 5)
            Sheets(ShtB).Cells(X, 2) = Sheets(ShtA).Cells(i, 15)
            X = X + 1
        End If
    Next i
    
    MsgBox ("Traitement Terminé")
End Sub


Cette macro est évolutive. Si tu alimentes ton Tableau Source les données seront pris en compte lors du prochain lancement

Et dernière chose. Pour créer un bouton original, télécharge une image n'importe laquelle. Insert là sur ta feuille excel et fais un clique droit dessus puis "Assigner une Macro". clique sur Recap_CD puis OK (LaMacro est maintenant rattaché à l'image). Cliques n'importe où sur ta feuille pour désélectionner l'image et reclique dessus; La Macro se lancera.
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
18 juil. 2014 à 15:39
Merci beaucoup je vais regarder ça :)
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
22 juil. 2014 à 16:46
Je déterre le sujet fraîchement "résolu" car j'ai un double problème :

N.B: par rapport à mon dernier commentaire, j'ai du décaler mes colonnes M, N et O jusqu'à O, P et Q.

1. j'avais d'abord opté pour la solution avec formules de Vaucluse, qui marchait bien SAUF que l'insertion de ligne dans la feuille de saisie "Suivi Offres en attente" fait planter la colonne avec la formule :
=SI('Suivi Offres en attente'!O2=0;"";SI((AUJOURDHUI()-'Suivi Offres en attente'!O2>DelaiAvantRetard)*('Suivi Offres en attente'!A2="OeA");MAX($A$1:A1)+1;""))

J'ai en effet un saut dans la succession A2 ; A3 ; A4 .... au numéro où j'ai inséré une ligne ..

La solution ne me convient donc plus puisque les utilisateurs de mon document ont besoin de pouvoir insérer des lignes..

2. j'ai alors regardé le code proposé par WeaponEDGE : j'ai bien saisi comment marche les références et j'ai mis à jour le tout, mais quand j'exécute la macro ça n'a aucun effet à part m'afficher la fenêtre "Traitement terminé".

Il me faudrait donc :
1. soit un code permettant en VBA d'étirer en 'Gestion des Retards'!A2:A2000 la formule
=SI('Suivi Offres en attente'!O2=0;"";SI((AUJOURDHUI()-'Suivi Offres en attente'!O2>DelaiAvantRetard)*('Suivi Offres en attente'!A2="OeA");MAX($A$1:A1)+1;""))

2. soit un code VBA reprenant tout depuis le début, i.e me permettant d'afficher en liste sans espaces les références des seules lignes d'un tableau qui répondent à la condition suivante (exemple pris pour la ligne 2) :
(AUJOURDHUI()-'Suivi Offres en attente'!O2>DelaiAvantRetard)*('Suivi Offres en attente'!A2="OeA")


Pour la solution 1, j'ai cherché sur plein de sujets déjà traités, mais je n'ai pas réussi à trouver un code qui marche dans mon cas alors que ça a l'air plutôt simple : étirer une formule par VBA...

Merci d'avance !
0
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426
Modifié par Le Pingou le 22/07/2014 à 22:03
Bonjour,
J'ai regardé en diagonal et une première question :
Vous dites : pour les lignes dont la Date de la demande a dépassé le DelaiAvantRetard fixé par rapport à aujourd'hui alors que la date de remise n'est pas renseignée
Ne trouvant pas la date [DelaiAvantRetard], quel critère je prends pour dire que la ligne 2 [Client 1] ne dois pas figurer dans le relevé.... ?

J'ai oublié : la structure de la feuille [Gestion des Retards] pour créer la procédure... !

Salutations.
Le Pingou
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
22 juil. 2014 à 22:43
Le délai est fixé à 5 jours pour l'instant, dsl de l'imprécision
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426
22 juil. 2014 à 22:43
Bonjour,
En attendant, j'ai relu la discussion et je pense que la proposition de Vaucluse ou la procédure de WeaponEDGE répondent à votre demande (sauf si vous avez des cellules fusionnées). Toutefois elles doivent être adaptées à la structure de votre classeur et c'est là que se trouve le problème... !
Sans connaitre la structure de votre application cela va être difficile de vous donner la bonne proposition !

0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
22 juil. 2014 à 22:45
Comme je l'ai précisé dans mon commentaire de relance leurs solutions ne répondent pas totalement à la demande, notamment à cause de l'insertion de ligne (les cellules fusionnées ne posaient pas de pb pour les formules)

--
0
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426
22 juil. 2014 à 23:00
Bonjour,
Merci, mais pas entièrement d'accord avec : notamment à cause de l'insertion de ligne (les cellules fusionnées ne posaient pas de pb pour les formules)
Mais bon, c'est vous qui voyez... !
Dans le message précédent j'ai mentionnée :
.- la structure de la feuille [Gestion des Retards] pour créer la procédure... !
.- Sans connaitre la structure de votre application cela va être difficile de vous donner la bonne proposition !
Question : Est-ce qu'il y a des fonctions dans les lignes (cellules), des lignes vides, des cellules fusionnées (si oui leur position dans la feuille) à traiter... ?

0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
22 juil. 2014 à 23:23
Je vous envoie un aperçu demain mais oui il y a quelques formules donnant des stats sur les retards.

--
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
23 juil. 2014 à 09:11
Voici le document "copie-conforme" du document que j'utilise :

https://www.cjoint.com/?DGxjiMWsRCu

J'ai donc ajouté la feuille "Gestion des retards" sur laquelle doit apparaître le résultat.

En outre, j'ai laissé la solution de Vaucluse que j'avais utilisée au début et qui fonctionne SAUF en cas d'insertion de ligne (et peu importe les fusions de cellules, d'où mon dernier commentaire Le Pingou).

Des idées pour avoir le bon résultat même en cas d'insertion de ligne ?

Merci d'avance :)
0
WeaponEDGE Messages postés 113 Date d'inscription vendredi 18 juillet 2014 Statut Membre Dernière intervention 21 novembre 2014 9
23 juil. 2014 à 11:49
Bonjour Theo.R,

Je te propose une nouvelle version en VBA qui répond normalement à toutes tes exigeances.

https://www.cjoint.com/?0GxlL3QQvIM

Le fichier compare la date du jour avec les date de demande puis si la différence est suppérieur au délai mentionné en feuille2 alors il insère les donné dans le taleau en feuille2.

Tu peux fusionner les cellules de la colonne E quand il s'agit d'un même clients
Tu peux insérer des lignes

La seule contrainte est de laisser le mot FIN DE LISTE à la fin de ton tableau dans la colonne client.

Tu peux changer le délai de retard accordé dans la 2nd feulle.

Pour Généré le tout clique sur le bouton GO vert de la première feuille.

Si tu préfères une version paramétrable facilement je peux te créer une 3ème feuille ou tu pourras modifier les données primordiale pour la macro sans avoir à les changer dans le code lui même.
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
23 juil. 2014 à 14:04
Bonjour WeaponEDGE,

Merci pour ce nouveau code ! Il marche bien ! J'ai juste quelques demandes complémentaires pour qu'il soit parfait :
- j'ai besoin d'ajouter une condition au tri des lignes clients, à savoir : la cellule en A:A doit contenir strictement le texte "OeA", dans le cas contraire, la ligne n'est pas à prendre en compte.
- j'aimerais un saut de ligne plutôt qu'un "&" entre PM et Agent à partir de M5 sur la feuille Gestion des retards


-Bonus : le "fin de la liste" ne m'arrange pas tellement même si je peux faire avec, il n'y a pas de solution pour faire sans ? Le pb est que je l'ai mis pour l'instant en E9000 pour avoir de la marge, mais du coup l'exécution du code met bien plus de temps (30 secondes de freeze).

Voilà merci encore pour votre aide, j'espère qu'on bouclera pour de bon ce dossier ;)
0
WeaponEDGE Messages postés 113 Date d'inscription vendredi 18 juillet 2014 Statut Membre Dernière intervention 21 novembre 2014 9
23 juil. 2014 à 14:30
En fait le mot "FIN DE LA LISTE" doit être positionné juste après le dernier client ?
Quand vous insérez des lignes il descendra naturellement.

Le "FIN DE LA LISTE" peux être surpprimé à condition qu'il y ait une colonne dont les information sont systématiquement rempli (où il n'y a pas de blanc).

En fait pour calculer combien de ligne fait le tableau La macro se positonne sur la dernière ligne de la colonne 5 et effectue l'équivalent CTRL+SHIFT+Flêche du haut.
ce qui à par incidence de remmonter le curseur jusqu'à la première cellule de pleine.
ça fonctionne bien si le dernier client n'est pas une cellule fucionné, mais dans votre exemple il y a 3 cellule fucionné donc pour lui la fin du tableau se situera sur la permière ligne du dernier client au lieu de la 3eme. c'est pour celà que j'ai rajouté le terme (après j'ai mis FIN DE LISTE mais vous pauvez mettre ce que vous voulez, sauf du vide)
Je suppose que la colonne date de demande est forcément remplie, Si vous me confirmez j'axerais le calcul sur cette colonne et le terme pourra disparaitre.

Il n'y a pas de soucis pour ajouter le critère OeA.

A la place du "&" je peux mettre un espace à la place. En revanche je sais pas coder un retour à la ligne en VBA (et oui mes connaisses sont limités :-) ).
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
23 juil. 2014 à 14:49
En fait, les utilisateurs de la feuille "Suivi Offres en attente" remplissent petit à petit les lignes, l'insertion étant utile pour revenir entre des lignes déjà saisies. Donc le "Fin de la liste" n'ira pas de lui même en dessous si les lignes sont simplement remplies petit à petit.

Petite précision : le client dans la colonne E peut être fusionné, mais ce n'est pas le cas des colonnes A, O, P et Q. En clair, si j'ai un même client fusionné sur E1:E10, alors j'aurai des lignes remplies entre E2 et E10, la différence étant que je n'aurai plus "OeA" en A, ni les dates/raisons renseignées en O, P et Q. Mais il y aura d'autres colonne renseignées, comme la L par exemple.

J'attends votre nouveau code avec la condition OeA en colonne A du coup

Pour le saut de ligne ou "&", tant pis, en attendant merci de mettre un "/" plutôt qu'un "&".

Merci d'avance,
0
WeaponEDGE Messages postés 113 Date d'inscription vendredi 18 juillet 2014 Statut Membre Dernière intervention 21 novembre 2014 9
Modifié par WeaponEDGE le 23/07/2014 à 15:40
Bon, J'ai trouvé une solution pour supprimer la FIN DE LISTE:

Contraintes : En ligne 1 il ne doit y avoir que les titres du Tableau il ne faut pas d'autres donnée sur la droite du Tableau.

Logique d'exécution : La macro compte le nombre de colonne que comporte le Tableau par rapport au dernier titre renseigné (Le plus à droite).
A partir de ce moment là, il va calculer le nombre de ligne pour chaque colonne et va utiliser comme référence le plus élevé.

Le condition OeA à été ajouté (ATTENTION les minuscule et majuscule sont pris en compte, "OEA" ne fonctionnera pas)

Le "&" à été remplacé par "/"

Ci joint le Fichier

https://www.cjoint.com/?0GxpNsOKTIL
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
Modifié par Theo.R le 23/07/2014 à 16:11
Super boulot, ça marche à merveille !! Même sans mettre le "Fin de la liste", et je gagne du temps de calcul à ne faire que les lignes non vides !

Qu'appelez-vous "la droite du Tableau" ? mon tableau a des colonnes de A jusqu'à AC, la ligne 1 étant les titres oui.

J'allais cocher résolu, mais je viens de me rendre compte que ce code n'affiche pas avec le nom du client le n° de ligne concernée :/ (j'y arrivais avec les formules..)

Une ultime solution ?

A bientôt
0
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426
23 juil. 2014 à 17:03
Bonjour,
Merci pour le fichier.
Et sans macro......
Dans le sens ou vous insérez des lignes dans le tableau cela modifie les références dans la formule de l'ami Vaucluse (amicales salutations). Je l'ai modifié en utilisant la fonction INDIRECT().
Je vous laisse voir si cela est conforme à vos attentes... !
Le fichier : https://www.cjoint.com/?3Gxra1rGzlX

0