Affecter une valeur avec deux critères de comparaison
VANTHONY
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
ZBonjour,
Cela fait plusieurs heures que je suis sur un petit problème et j'ai vraiment besoin de vous.
Sur une feuille excel j'ai deux tableaux :
- Dans le tableau 1 j'ai 7 colonnes (d'A à F) mais la 7e colonne ne dispose d'aucune valeur.
- Dans le tableau 2 j'ai 7 colonnes (de I à O) mais sur celui-là la 7e colonne contient des valeurs.
De plus le tableau 1 à prés de 8500 lignes de données, alors le tableau 2 n'en contient que 250 environ.
Mon objectif serait de parcourir tous le tableau (tab 1 ou 2) afin de comparer la colonne B et C avec celle de l'autre tableau J et K.
Si les données de Bx et Cx sont pareilles que Jy et Ky, on copie la donnée de la colonne Oy dans Fx.
J'ai déjà réalisé un code VBA qui marche mais uniquement pour 200-500 lignes. Au delas de cette valeur le traitement est trop long et n'aboutit pas.
Code VBA :
Je voudrais donc avoir de l'aide pour optimiser, modifier mon code ou bien m'aider à trouver une solution afin d'utiliser un autre algorithme plus efficace pour se problème.
Je vous remercie déjà par avance pour votre aide.
Cela fait plusieurs heures que je suis sur un petit problème et j'ai vraiment besoin de vous.
Sur une feuille excel j'ai deux tableaux :
- Dans le tableau 1 j'ai 7 colonnes (d'A à F) mais la 7e colonne ne dispose d'aucune valeur.
- Dans le tableau 2 j'ai 7 colonnes (de I à O) mais sur celui-là la 7e colonne contient des valeurs.
De plus le tableau 1 à prés de 8500 lignes de données, alors le tableau 2 n'en contient que 250 environ.
Mon objectif serait de parcourir tous le tableau (tab 1 ou 2) afin de comparer la colonne B et C avec celle de l'autre tableau J et K.
Si les données de Bx et Cx sont pareilles que Jy et Ky, on copie la donnée de la colonne Oy dans Fx.
J'ai déjà réalisé un code VBA qui marche mais uniquement pour 200-500 lignes. Au delas de cette valeur le traitement est trop long et n'aboutit pas.
Code VBA :
Sub Analyse() Dim cmpa As Integer Dim cmpb As Integer Dim Dern As Long Dern = Range("A" & Rows.Count).End(xlUp).Row 'passez le curseur sur dernièreLigne pour en lire la valeur Application.ScreenUpdating = False For cmpa = 2 To 500 For cmpb = 2 To 500 If Range("J" & cmpa) = Range("B" & cmpb) And Range("K" & cmpa) = Range("C" & cmpb) Then Worksheets(1).Range("F" & cmpa).Value = Worksheets(1).Range("N" & cmpb).Value End If Next cmpb Next cmpa MsgBox "Analyse terminé !" Application.ScreenUpdating = True End Sub
Je voudrais donc avoir de l'aide pour optimiser, modifier mon code ou bien m'aider à trouver une solution afin d'utiliser un autre algorithme plus efficace pour se problème.
Je vous remercie déjà par avance pour votre aide.
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- Affecter une valeur avec deux critères de comparaison
- Comparaison million milliard - Accueil - Technologies
- Nombre de jours entre deux dates excel - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
3 réponses
Bonjour,
"Trop longue et n'aboutit pas"? Ca me paraît étrange...
Est-ce que la ligne de code :
Ne serait pas erronée? En effet, est ce que vos tableaux ont le même nombre de ligne?
De plus, où avez vous utilisé la variable Dern?
Vous auriez dû écrire :
Je vous propose un autre code :
Cordialement.
Edit : Pardon, je n'avais pas vu que vous aviez répondu à la question : Vos tableaux ont-ils le même nombre de lignes...
"Trop longue et n'aboutit pas"? Ca me paraît étrange...
Est-ce que la ligne de code :
Dern = Range("A" & Rows.Count).End(xlUp).Row 'passez le curseur sur dernièreLigne pour en lire la valeur
Ne serait pas erronée? En effet, est ce que vos tableaux ont le même nombre de ligne?
De plus, où avez vous utilisé la variable Dern?
Vous auriez dû écrire :
For cmpa = 2 To Dern For cmpb = 2 To Dern
Je vous propose un autre code :
Sub Analyse() Dim cmpa As Integer Dim cmpb As Integer Dim Dern1 As Long Dim Dern2 As Long Dern1 = Cells(Application.Rows.Count, 1).End(xlUp).Row Dern2 = Cells(Application.Rows.Count, 15).End(xlUp).Row Application.ScreenUpdating = False For cmpa = 2 To Dern2 For cmpb = 2 To Dern1 If Range("J" & cmpa) = Range("B" & cmpb) And Range("K" & cmpa) = Range("C" & cmpb) Then Range("F" & cmpa).Value = Range("N" & cmpb).Value End If Next cmpb Next cmpa MsgBox "Analyse terminé !" End Sub
Cordialement.
Edit : Pardon, je n'avais pas vu que vous aviez répondu à la question : Vos tableaux ont-ils le même nombre de lignes...
Bonjour,
peux tu avoir des doublons dans la concaténation de 2 colonnes
style B & C tableau 1 et J & K ? tableau 2 ?
au besoin
Mettre un extrait du classeur (2000 lignes env.) sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci proposé (clic droit) dans le message de réponse
Dans l'attente
peux tu avoir des doublons dans la concaténation de 2 colonnes
style B & C tableau 1 et J & K ? tableau 2 ?
au besoin
Mettre un extrait du classeur (2000 lignes env.) sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci proposé (clic droit) dans le message de réponse
Dans l'attente
Dans le tableau 1 il peut y avoir des doublons au niveau de la colonne B&C (ex : ligne 20 --> B=2005 et C=2006 //// ligne 350 --> B=2005 et C=2006). Cependant dans le tableau 2, il n'y a pas de doublons.
Puis-je vous envoyer le fichier par mail ou autre chose ?
étant en entreprise l'accès à cjoint.com est bloqué.
Puis-je vous envoyer le fichier par mail ou autre chose ?
étant en entreprise l'accès à cjoint.com est bloqué.
le traitement est trop long et n'aboutit pas
150 lignes dans colonnes JK et 2000 en colonnes BC traitées en 0,06 secondes, ça t'irait ?
ci joint la maquette à étudier à la maison ce soir plutôt que de regarder bêtement le match de foot :o)
http://www.cjoint.com/c/EJinbLZYxFk
Michel
150 lignes dans colonnes JK et 2000 en colonnes BC traitées en 0,06 secondes, ça t'irait ?
Option Explicit
Option Base 1
'----------
Sub affecter_colO_si()
Dim Derlig As Integer, T_tampon
Dim Cptr As Integer, T_colbc(), T_colf
Dim Dico As Object, T_coljk, T_colo, Ref As String
Dim Start As Single
'-----------------------initialisation- mémorisation cellules En RAM
Start = Timer
Application.ScreenUpdating = False
'nettoyage col F
Range("F2:F10000").ClearContents
'mémorisation tableaux BC et F
Derlig = Columns("B").Find(what:="*", searchdirection:=xlPrevious).Row
T_tampon = Range("B2:C" & Derlig)
'concaténation des colonnes B & C
ReDim T_colbc(Derlig - 1)
For Cptr = 1 To UBound(T_tampon)
T_colbc(Cptr) = T_tampon(Cptr, 1) & " " & T_tampon(Cptr, 2)
Next
Set T_tampon = Nothing
'mémorisation colonne F
T_colf = Application.Transpose(Range("F2:F" & Derlig))
'mémorisation tableaux JK et O
Derlig = Columns("J").Find(what:="*", searchdirection:=xlPrevious).Row
T_coljk = Range("J2:K" & Derlig)
T_colo = Application.Transpose(Range("O2:O" & Derlig))
'Creation d'un couple JK concaténées et position dans taleau col O
Set Dico = CreateObject("scripting.dictionary")
For Cptr = 1 To UBound(T_coljk)
Ref = T_coljk(Cptr, 1) & " " & T_coljk(Cptr, 2)
If Not Dico.exists(Ref) Then
Dico.Add Ref, T_colo(Cptr)
End If
Next
'---------------------Recherche des égalités colBC et dico et affectation de O dans F
For Cptr = 1 To UBound(T_colbc)
Ref = T_colbc(Cptr)
If Dico.exists(Ref) Then: T_colf(Cptr) = Dico.Item(Ref)
Next
'---------------------------restitution
Range("F2").Resize(UBound(T_colf), 1) = Application.Transpose(T_colf)
' essai de durée à supprimer après essais
Application.ScreenUpdating = True
MsgBox "recherche effectuée en: " & Timer - Start & " sec."
End Sub
ci joint la maquette à étudier à la maison ce soir plutôt que de regarder bêtement le match de foot :o)
http://www.cjoint.com/c/EJinbLZYxFk
Michel
merci de ta réponse.
La variable Dern je ne l'ai effectivement pas utilisé, car quand je l'utilise le programme a commencer à tourner en rond sans terminer le processus. C'est pour cela que j'ai mis 500 (ça m'a quand même pris prêt de 12s afin de terminer la macro).
J'ai essayer ton code et la effectivement ça marche mieux mais le problème c'est qu'il n'analyse pas tt le tableau. Des qu'il rencontre une similitude il passe à la comparaison suivante.
Y aurait-il moyen de rajouter une boucle qui regarde si il n'ya pas d'autre cas dans tt le tableau avant de passer à la suite ?