Classer par ordre croissant avec critère texte situés dans 2 colonnes en VBA

Signaler
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
-
Messages postés
11486
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
7 juillet 2020
-
Bonjour le Forum,


J'ai besoin de créer une fonction en VBA qui me permettrait de classer des dates par rapport à un critère texte.
Là ou ça se complique, c'est que le texte est associé forcément à une date mais cela peu être dans 2 tableaux différents.


Je joint un exemple pour détailler mon problème.

https://cjoint.com/c/JFki0lVqHZw


Merci d'avance

Cordialement

21 réponses

Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Re,

Voici un fichier exemple que j'ai mis à jour pour mieux expliquer mon problème et mes besoins.

https://www.cjoint.com/c/JFqnvMaoW4G
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Bonjour

1. Pourquoi ce sujet est il fermé ?
2. Tu n'as pas répondu clairement à mes questions. Est ce que la macro produit le résultat attendu ?

Cdlmnt
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Bonjour,

Je ne sais pas pourquoi il est fermé, j'ai bien répondu à vos questions hier soir à 20h17 et 20h40 mais j'ai répondu en passant par "commenter" au lieu de répondre.

Peu-être le problème vient-il de là?
Je n'ai pas tout vérifier mais ca à l'air de bien fonctionner mais j'aurais besoin de ne pas lancer une macro mais plutôt de créer une fonction d'ou ma nouvelle question de ce matin.

Voila les réponses que je vous avait donné hier soir:
réponse au 1er message (je n'avais pas encore vu le 2 eme avec la macro)
Bonjour ccm81,

Pour le 1er tableau, j'ai concatener dans la colonne A les noms qui se trouvent en C et D pour faire une recherche uniquement dans la colonne A au lieu d'en faire 2 en colonne C et D.
Même raisonnement pour le deuxième tableau, les colonnes H et I sont concatenées en colonne F.

Pour être plus clair, j'ai besoin de classer par ordre croissant les dates concernant les noms en colonne K qu'ils soient en colonne C ou D pour le 1er tableau et en colonne H ou I dans le deuxième tableau.

Pour répondre a ta question,
si on cherche à classer les dates pour Xavier,
il faut effectivement prendre en compte le PascalXavier en A3 (date associée = 17/08/2013) et le XavierPascal en F5 (date associée = 11/08/2013)
Je devrais donc retrouver la date 11/08/2013 en L4 (date la plus petite) et 17/08/2013 en M4 (car deuxième date la plus petite) etc. etc. jusqu’à ce qu'il n'y ai plus de date à classer pour Xavier.

J'espère avoir été plus clair cette fois et merci pour votre aide.

Cordialement,


et la réponse au 2eme message:

Re bonjour ccm81,

Votre solution est déjà très intéressante mais mon réel fichier étant rempli au fur et a mesure du temps, (c'est à dire que des noms déjà existants peuvent être ajoutés dans une des 4 colonnes avec la date correspondante)
Est-il possible de zapper l'étape ctrl+k et de créer une formule du type :
Compter le nombre de fois que le nom apparaît dans les colonnes A et F (ou bien en C D H et I) pour ne rien renvoyer si l'on demande un numéro de rang supérieur au nombre de fois que le nom apparaît.
De cette manière, au fur et à mesure que le tableau ce remplirait, les dates s'ajouteraient directement dans le tableau de classement.

Merci d'avance,

Dites moi si je dois faire quelque chose par rapport au sujet précédent?

Cordialement
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
1. Pour la fermeture, je ne sais pas, as tu créé ce nouveau sujet avant que le précédent soit fermé ?
2. Expliques moi exactement comment ça se passe quand une nouvelle entrée est saisie, (colonnes A à D par exemple) quelle est la colonne remplie en dernier (C puis D puis B )?
3. Quand une nouvelle date est saisie, est elle toujours postérieures aux dates déjà présentes (colonnes C et G) ?
4. J'ai vérifié (du moins le début) pour Leon et Elisabeth, est ce que ça correspond ?
5. Tu n'as pas répondu à ma remarque
RQ. S'il y a 2 dates identiques pour un même nom, je n'en ai retenu qu'une

5. Est-il possible de zapper l'étape ctrl+k
Si ton fichier n'est pas tellement plus gros que ça, l'exécution de ma macro ne prend pas beaucoup de temps
On peut faire en sorte qu'une macro réagisse à un changement (ajout) dans la feuille, mais est ce vraiment nécessaire
et de créer une formule du type :
Compter le nombre de fois que le nom apparaît dans les colonnes A et F (ou bien en C D H et I) pour ne rien renvoyer si l'on demande un numéro de rang supérieur au nombre de fois que le nom apparaît.

Là, j'avoue que je ne comprend pas bien où tu veux en venir
Donnes un exemple
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Bonsoir ccm81,

1.Non j'ai créé ce nouveau sujet en fin de matinée alors que je t'avais répondu hier soir, je ne sais pas du tout à quoi c'est dû.

2.Alors, je n'inscris jamais rien en colonnes A ou F puisqu'il y a la fonction concatener. Je rentre des données en C puis D et après je renseigne la date en B pour le premier tableau. En H et I puis G pour le deuxième tableau.
Par contre les données sont rentrées complètement aléatoirement entre le tableau 1 et 2. il peut m'arriver de remplir 60 lignes d'affilée sur le 1er tableau avant de rentrer des nouvelles données dans le 2eme.

3.Pour les dates, non elle ne sont pas forcément postérieures car il peut m'arriver de rentrer des noms mais de mettre la date bien plus tard, du coup il peut y avoir un trou dans la colonne B, je continue de remplir les noms avec des dates et le trou est rempli ultérieurement.

4.Oui j'ai vérifié également et ça m'a l'air bon.

5.1.J'avais pas fait attention a ta remarque mais c'est impossible dans mon fichier de base.
Pour un nom que ce soit en colonne C ou D pour le tableau 1 (H ou I pour le tableau 2), il ne peut y avoir qu'une seule date. C'est aussi impossible qu'il y ai une date identique dans le tableau 1 et 2 avec le même nom.
Si c'est le cas dans le fichier exemple, c'est une erreur de saisie de ma part.

5.2.Je voulais zappé le ctrl+K car oui mon fichier est assez gros et s'agrandi de jour en jour mais aussi pour éviter de mettre à jour au fur et à mesure. Car j'ai peur de lire le tableau classement qui serait faux si j'avais oublié de relancer la macro.

Actuellement, j'ai une combinaison de fonctions qui me permettent de classer les dates mais dans un seul tableau :

Voici le même fichier exemple mais avec la formule en question pour Elisabeth pour que tu comprennes ce que je veux dire:

https://cjoint.com/c/JFkuReCYoc6


Au final, je n'ai pas réussi à trouver de formule qui me permettrait de classer les dates par rapport au nom qui figurerait dans 2 tableaux différents d'ou mon appel à l'aide.

Merci encore,
Cordialement
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Bonjour ccm81,

Qu en penses tu?
Ca te parait faisable via une fonction créée en vba ?

Cordialement
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Ca te parait faisable via une fonction créée en vba ?
Faut voir

Une autre question : Peut il apparaitre un nouveau nom ?

Cdlmnt
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Un essai, à tester
https://mon-partage.fr/f/7m4Y3q0x/

La procédure Worksheet_Change(ByVal Target As Range) réagit à l'entrée d'une nouvelle date
et OKnom(d, nom) met à jour la liste des dates pour ce nom

Cdlmnt
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Désolé
Tu as du avoir des ennuis, un misérable 5 s'est mystérieusement inséré ici
5 If Not Intersect(Target, Union(Columns(coda1), Columns(coda3))) Is Nothing Then
A corriger comme ceci
If Not Intersect(Target, Union(Columns(coda1), Columns(coda3))) Is Nothing Then

Cdlmnt
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Alors ça a fonctionné correctement quand j'ai mis la date pour ton exemple, par contre en essayant de rajouter 2 noms la ligne en dessous avec une date, la date est apparue dans le tableau classement seulement après avoir lancer la macro.

Pour les noms, les noms sont connus pour chaque fichier (on a plusieurs fichier avec des noms différents) dès le début de création du tableau 1 mais chaque fichier ne comporte pas le même nombre de noms, ça peut varier entre 10 et 30 noms par fichier.
En fait la liste en colonne K de nom est récupérée dans un autre onglet du fichier.
des nouveaux peuvent apparaître dans le tableau 2 mais je n'ai besoin que de créer un classement pour les noms du tableau 1.

Cdlt
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
As tu fait la correction ?
Si tu as rentré la date puis les noms, ça ne va pas fonctionner
  If nom1 <> "" Then Call OKnom(d, nom1)
If nom2 <> "" Then Call OKnom(d, nom2)

Pour les dates, non elle ne sont pas forcément postérieures car il peut m'arriver de rentrer des noms mais de mettre la date bien plus tard,

J'ai testé, en ajoutant deux noms en ligne 137, j'ai bien retrouvé les dates
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Bonjour ccm81,

Tout d'abord, je te remercie beaucoup pour ta solution et le temps que tu y as passé.
Ça m'a l'air de fonctionner correctement...
J'aimerais quand même tester d'une autre manière,

ta réponse hier à 15h24 était :
Ca te parait faisable via une fonction créée en vba ?
Faut voir

Quand tu dis "Faut voir", penses tu que ce soit impossible à faire ou même trop compliqué ou je peux encore espérer que quelqu'un me trouve ce genre de solution (qui me parait plus pratique pour l'utilisation de mon réel fichier car c'est un fichier partagé sur lequel beaucoup de personnes de notre société peu ajouter des données, j'ai donc peur que l'ordre des saisies ne soit pas toujours respecté)

Cordialement,
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Bonjour
RQ1. le Ctrl+k reste valable pour traiter toutes les données en un coup
RQ2. Pour la mise à jour au fur et à mesure des entrées,une solution
La mise à jour peut être lancée lors d'un changement dans l'une des 3 colonnes B,C,D ou G,H,I à condition que les 3 cellules soient renseignées (nom1, nom2, date), il suffit de modifier un peu la procédure Worksheet_Change
RQ3. c'est un fichier partagé sur lequel beaucoup de personnes de notre société peu ajouter des données, j
Tu n'avais pas dit, et ça change beaucoup de choses. Le processus n'est pas du tout sécurisé. Il suffit de se placer dans une cellule déjà remplie, de valider et c'est (mal) parti !
donc RE Faut voir
Bonjour ccm81,

Effectivement je ne l'avais pas précisé car je n'avais pas réalisé que c'était important... et j'en suis désolé !
Est-il donc possible de trouver une solution avec une fonction créée en VBA comme demandé dans l' enoncé ou faut-il reposté la question en donnant plus de précisions pour espérer une solution adaptée a mon besoin?

Cordialement,
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Bonjour

Une façon de sécuriser :
Les cellules qui ont été transférées sont vérouillées par la macro et la feuille est protégée(pas de mot de passe)
https://mon-partage.fr/f/5oK6ewPE/
A tester

Cdlmnt
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Bonjour et merci encore ccm81 mais j'ai vraiment besoin d'une solution avec formule et non pas avec macro... Est-ce possible en créant la formule en VBA ?
Si oui, dois-je créer un nouveau sujet?

Cordialement,
Messages postés
9495
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
6 juillet 2020
1 852
Désolé, je crois qu'on s'est mal compris, je pensais que tu voulais automatiser la mise à jour des dates (colonnes K, L, ...) , et remplacer la formule matricielle que tu as en ligne 13 (au passage, somme.si.ens, n'est pas reconnue par mon vieil excel 2003 et donc difficile pour moi de la reconstituer) par une procedure vba qui ferait le boulot (ce que je t'ai proposé)

Il doit être possible de créer une formule excel ou une fonction personnalisée depuis vba qui réponde exactement à ta question, mais de mon côté je vais arrêter là.

Bonne fin de journée
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Merci quand même pour ton aide.


Bien cordialement,
Messages postés
11486
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
7 juillet 2020
656
bonjour,
1) pourquoi as-tu besoin d'une solution avec formule et non pas avec macro?
2) cherches-tu uniquement à compléter un tableau avec des dates trouvées dans différentes feuilles?
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1
Bonjour Yg_be

Non le but final n'est pas de classer par ordre croissant les dates en question mais c'est une étape indispensable pour exploiter mon fichier par la suite.

Il me faut une formule car mon fichier de base est rempli quasiment tous les jours et par différentes personnes. Avec une formule, j'aurais moins de soucis.

Cordialement
Messages postés
11486
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
7 juillet 2020
656
si c'était une macro qui refaisait le travail automatiquement chaque fois qu'on ouvre le fichier, ne serait-ce pas suffisant?
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020
1 >
Messages postés
11486
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
7 juillet 2020

Non car il est possible que le fichier reste ouvert sur un poste durant un laps de temps assez long et que nous ayons besoin d’interpréter les résultats sans rouvrir le fichier alors que la base de données ai été modifiée.
Il me faut vraiment une solution par formule et non pas par macro
Messages postés
11486
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
7 juillet 2020
656 >
Messages postés
59
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
16 juin 2020

la macro pourrait aussi s'exécuter chaque fois que quelque chose change dans les données qui servent de base au calcul.
par ailleurs, je suggère que tu décrives ce que tu fais ensuite, il y a peut-être une manière plus simple de faire l'ensemble en une seule fois. je me demande, par exemple, pourquoi ce travail ne pourrait pas être fait au moment où les résultats sont interprétés, au lieu de le faire à chaque fois que les données sont modifiées.
de toutes façons, une formule me semble complètement hors de question dans ton contexte.