Importation de données d'une colonne suivant plusieurs critères

Résolu/Fermé
Tom 44 Messages postés 47 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 11 mars 2014 - 30 juil. 2013 à 13:57
Tom 44 Messages postés 47 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 11 mars 2014 - 30 juil. 2013 à 20:23
Bonjour à toute la communauté,

Je suis actuellement bloqué par un souci de programmation qui je pense pourrait se résoudre aisément, mais je n'y parviens pas...

Je possède un tableau de saisie dont plusieurs colonnes (onglet principal) se mettent à jour par macro par rapport à un autre onglet du classeur (que je nommerai "export").
Jusqu'ici pas de souci majeur.

J'ai par la suite plusieurs colonnes à mettre à jour avec une date (toujours par rapport à "export"), seulement voilà la colonne de recherche (dans "export") possède plusieurs critères qui évoluent en fonction de l'avancé du/des projets; ce qui sous-entend que je peux me retrouver avec les mêmes données sur plusieurs critères en même temps.
Sachant qu'en fonction du critère la date doit se mettre à jour dans une certaine colonne de l'onglet principal.

J'ai pensé qu'en passant par la fonction "case/case else..." je serais parvenu à mes fin, mais rien...
Sans doute un problème de synthaxe ou de logique...
N'étant pas un professionnel de la programmation....pourriez vous me filer un petit coup de pouce afin que je puisse terminer ce projet ?

Vous remerciant par avance.

6 réponses

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
30 juil. 2013 à 19:11
Le principe de ton code est parfait, le problème est qu'après plusieurs tests, la macro me remplie bien les bonnes colonnes mais sans faire correspondre les dates avec les codes IMB.
Déplace ce code
            
If col_L <> 0 Then
   Worksheets("Suivi D2").Cells(j, col_L) = date_fin
End If

au-dessus, juste après le If/EndIf du syndic. Ainsi, on doit bien avoir la correspondance avec l'IMB (on est dans la boucle correspondant au IMB).

[...]1ère cellule vide de l'onglet suivi, puisque le nombre de ligne évoluera dans le temps; qu'en penses tu ?

Je l'ai déjà fait en boucle While. Mais les puristes n'aiment pas car à chaque changement de ligne, la macro vérifie
cf. https://forums.commentcamarche.net/forum/affich-37622001-vba-detection-de-cellule-vide-ligne-colonnne

De plus, pour ton idée de couleur, j'y ai déjà songé, mais au final risquera de se trouver en conflit avec les formes conditionnelles de mes cellules.
A moins que tu aies une autre solution ?

Je n'ai pas accès à tes mises en forme conditionnelles là ; c'est vrai que ça complique peut-être un peu la chose mais sans doute pas insurmontable. Ex. en 1è ligne de chaque colonne modifiée mettre une valeur et faire une MEFC basée sur cette valeur.

A+
1
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
30 juil. 2013 à 15:57
Bonjour,

Pas évident de comprendre où tu veux en venir, mais si j'ai bien compris tu cherches la dernière date parmi celles qui ressortent lors de ta sélection de critères.
Initialise la date avec la première valeur :
date_a_exporter = Cells(i,j).Value
puis scanne les autres
For i=....
If Cells(i,j).Value > date_a_exporter Then
date_a_exporter=Cells(i,j).Value
Endif
Next i
Ou alors utilise la fonction maximum (Application.Max()) si tu arrives à constituer la liste des dates.
Sinon, si tu pouvais fournir le fichier à la communauté pour appuyer ton propos, ça serait plus simple.

A+
0
Tom 44 Messages postés 47 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 11 mars 2014
30 juil. 2013 à 16:40
Bonjour Zoul67,

Comme demandé voilà le fichier concerné :
https://www.cjoint.com/?0GEqD7QAbZ3

Par contre je dois te fournir un peu plus d'explications quant au résultat souhaité :

La macro existante ne dois pas bouger (sauf optimisations), mais dois être complétée par ce qui suit,
_ Dans mon onglet "Extract OPUS" je viens coller chaque semaine la mise à jour du fichier. Cet onglet me donne les différentes infos que je dois injecter sur mon onglet "Suivi D2" en fonction des infos de la colonne "I"

Le problème que je rencontre est le suivant :
Je dois récupérer les dates présentes dans la colonne "U" de l'onglet "Export OPUS" et les dispatcher sur les colonnes "AA / AN / AY / CE" de l'onglet "Suivi D2" en fonction des critères de la colonne "L" de l'onglet "Export" tel que :

critère colonne de destination
AO26 AA
AO13 AN
A013 AY
A043 CE

Merci.
@+
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
30 juil. 2013 à 17:45
Re,

Effectivement, il y a de quoi optimiser un peu :
- pas besoin d'aller jusqu'à la 1000è ligne dans les deux fichiers, initialise une variable correspondant aux dernières lignes de chaque onglet en début de code ;
- par construction, apparemment, les lignes (de l'onglet Extract OPUS) sont complètes => couplée avec la première mesure, tu peux t'abstenir des tests sur le contenu des cellules (vides ou non) ;
- un tri par ordre alphabétique sur les IMB devrait te permettre de passer en revue beaucoup plus rapidement les lignes de chaque onglet.

Pour être constructif par rapport à ton besoin, ajoute dans ta boucle sur i :
valeur_L=Worksheets("Extract OPUS").Cells(i, 12).Value
date_fin=Worksheets("Extract OPUS").Cells(i, 21).Value
If valeur_L="AO26" Then
   col_L=27   'AA
ElseIf valeur_L="AO13" Then
   col_L=40   'AN
ElseIf valeur_L="A013" Then
   col_L=51   'AY
ElseIf valeur_L="A043" Then
   col_L=83   'CE
Else
   col_L=0
EndIf

NB : dans l'onglet Suivi D2 la colonne 27 devrait être AA

Puis dans ta boucle sur j :
If col_L<>0 Then
   Worksheets("Suivi D2").Cells(j, col_L) = date_fin
EndIf


Avec un Select Case, ça doit marcher aussi.
Dans mon métier, on écrirait les nouveautés en rouge dans l'onglet Suivi_D2 ; peut-être serait-ce utile ?

A+
0

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

Posez votre question
Tom 44 Messages postés 47 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 11 mars 2014
30 juil. 2013 à 18:44
Re,

Tout d'abord, merci à toi pour la tentative.
Le principe de ton code est parfait, le problème est qu'après plusieurs tests, la macro me remplie bien les bonnes colonnes mais sans faire correspondre les dates avec les codes IMB.

Par contre pour ton idée d'initialiser une variable correspondant aux dernières lignes de chaque onglet en début de code, je pensais essayer d'arrêter la boucle une fois qu'elle "analysera" la 1ère cellule vide de l'onglet suivi, puisque le nombre de ligne évoluera dans le temps; qu'en penses tu ?

De plus, pour ton idée de couleur, j'y ai déjà songé, mais au final risquera de se trouver en conflit avec les formes conditionnelles de mes cellules.
A moins que tu aies une autre solution ?

Merci pour ton aide.
@+

P.S. : ci-joint le code avec ta proposition : https://www.cjoint.com/c/CGEsRzYSP78
0
Tom 44 Messages postés 47 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 11 mars 2014
30 juil. 2013 à 19:25
C'est tout simplement parfait, merci beaucoup !!!

Par contre, est-ce normal qu'elle inscrive des dates lorsqu'elle ne trouve pas de correspondance ? (elle = la macro)
J'ai du coup, un peu peur qu'avec une nouvelle importation de valeur sur l'onglet "extract", elle me supprime les valeurs de la semaine précédente...étant donné que les codes IMB vont et viennent au gré de l'évolution du projet.

Sinon c'est exactement ce que je cherchais.

Encore merci.
@+
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
30 juil. 2013 à 19:39
est-ce normal [...]
Non, ce n'est pas normal. Tu es sûr que c'est la macro qui ajoute ces dates ? Elles ne seraient pas présentes à la base ??
0
Tom 44 Messages postés 47 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 11 mars 2014
30 juil. 2013 à 20:23
bien vu...
J'avais oublié de supprimer les 1ères injections.

Merci et bonne soirée.
0