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
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
A voir également:
- Importation de données d'une colonne suivant plusieurs critères
- Déplacer une colonne excel - Guide
- Formule somme excel colonne - Guide
- Trier colonne excel - Guide
- Colonne word - Guide
- Formule moyenne excel plusieurs colonnes - Guide
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
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
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+
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+
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
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+
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+
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
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.
@+
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.
@+
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
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 :
NB : dans l'onglet Suivi D2 la colonne 27 devrait être AA
Puis dans ta boucle sur j :
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+
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+
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
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
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
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
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.
@+
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.
@+
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
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 ??
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 ??
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
30 juil. 2013 à 20:23
bien vu...
J'avais oublié de supprimer les 1ères injections.
Merci et bonne soirée.
J'avais oublié de supprimer les 1ères injections.
Merci et bonne soirée.