XL 2013 RESOLU Comparer 2 feuilles et insérer données sous condition

dss

XLDnaute Occasionnel
bonjour,

Je voudrais comparer 2 tableaux feuil1 et feuil2 dont chacun a toujours la même structure mais pas le même nombre de lignes d'un mois sur l'autre. Le tableau feuil1 est celui qui contiendra toujours le plus grand nombre de lignes.
En fait je voudrais pouvoir ajouter en feuil1 colonne H les données qui figurent en feuil2 colonne E si et seulement si la ligne de la feuil1 en colonne C contient 7062??? : 1ere ligne trouvée en colonne C de feuil1 = 1ere donnée de feuil2 colonne E, 2eme ligne trouvée en colonne C de feuil1 = 1ere donnée de feuil2 colonne E et ainsi de suite...
Et copier ces données en colonne H de feuil1 sur chaque ligne qui contient 7062???

Est ce possible?
Merci de votre aide
Cordialement
 

Pièces jointes

  • COMPARE.zip
    66.4 KB · Affichages: 55

Paf

XLDnaute Barbatruc
Bonjour dss,

un essai à tester:

VB:
Sub DSS()
Dim T1, TF, T2, i As Long, dico, w As Long
Set dico = CreateObject("Scripting.Dictionary")

With Worksheets("Feuil2")
T2 = .Range("A1:E" & .Range("A" & Rows.Count).End(xlUp).Row)
End With
With Worksheets("Feuil1")
T1 = .Range("A1:C" & .Range("A" & Rows.Count).End(xlUp).Row)
ReDim TF(1 To UBound(T1, 1))

For i = LBound(T2, 1) To UBound(T2, 1)
    dico(T2(i, 1)) = T2(i, 5)
Next
For i = LBound(T1, 1) To UBound(T1, 1)
    x = x + 1
    If CStr(T1(i, 3)) Like "7062" & "*" Then
        TF(x) = dico(T1(i, 1))
    End If
Next
.Range("H1").Resize(UBound(TF), 1) = Application.Transpose(TF)
End With
End Sub

A+
 

Theze

XLDnaute Occasionnel
Bonjour,

Je suis sur mon iPhone donc je ne peux pas te pondre un code mais regardes avec la fonction Find() !
Tu définis ta plage sur la colonne C et tu boucles à la recherche de ta valeur 7062, une fois trouvé, tu dispatches tes valeurs
 

Jacky67

XLDnaute Barbatruc
bonjour,

Je voudrais comparer 2 tableaux feuil1 et feuil2 dont chacun a toujours la même structure mais pas le même nombre de lignes d'un mois sur l'autre. Le tableau feuil1 est celui qui contiendra toujours le plus grand nombre de lignes.
En fait je voudrais pouvoir ajouter en feuil1 colonne H les données qui figurent en feuil2 colonne E si et seulement si la ligne de la feuil1 en colonne C contient 7062??? : 1ere ligne trouvée en colonne C de feuil1 = 1ere donnée de feuil2 colonne E, 2eme ligne trouvée en colonne C de feuil1 = 1ere donnée de feuil2 colonne E et ainsi de suite...
Et copier ces données en colonne H de feuil1 sur chaque ligne qui contient 7062???

Est ce possible?
Merci de votre aide
Cordialement
Bonjour,
Par formule ??
En H1
Code:
=SI(GAUCHE(Feuil1!C1;4)="7062";INDEX(Feuil2!E:E;EQUIV(A1;Feuil2!A:A;0));"")

Copier/collage spécial==>valeur
 

Paf

XLDnaute Barbatruc
re,

travaillez vous sur MAC ?

si oui, les dictionnaires ne sont pas reconnus; et ce sera moins simple...
si non, je ne vois pas d'où provient l'erreur

A+

Edit : Bonjour Laetitia90
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
bonjour tous :):):):)
si pas trop de lignes pas se prendre la tête;)

VB:
Sub es()
Dim c As Range,x as long
Application.ScreenUpdating = 0
For i = 1 To Feuil1.Cells(Rows.Count, 3).End(3).Row
If Feuil1.Cells(i, 3) Like "7062" & "*" Then
x = x + 1
Feuil1.Cells(i, 8) = Feuil2.Cells(x, 5)
End If
Next i
End Sub


ps:: j'ai teste le code de l'ami Paf :):):):)marche trés bien chez moi
on peut ecrire avec left a la place de like quand c'est possible un peu plus rapide

If Left(Feuil1.Cells(i, 3), 4) = 7062 Then
 
Dernière édition:

dss

XLDnaute Occasionnel
(Re)Bonjour,
Et merci encore à vous trois.
PAF, je me suis précipité dans ma réponse car j'ai essayé ton code sur Mac version 2011 et je pense après recherche que le problème Active X vient de là. Je testerai à nouveau dès que j'aurai mon PC windows avec office 2013. Veuillez m'excuser de cette réponse quelque peu précipitée.
Merci Jacky, la formule fonctionne très bien mais je ne vous cache pas ma préférence pour VBA afin d'automatiser le retraitement.
Theze, j'ai compris le principe mais j'ai beaucoup de difficultés à le mettre en forme. Alors, si vous avez un peu de temps devant vous, n'hésitez pas pour un petit bout de code...
A nouveau, merci pour vos réponses et votre rapidité.
Bien cordialement
 

Jacky67

XLDnaute Barbatruc
Merci Jacky, la formule fonctionne très bien mais je ne vous cache pas ma préférence pour VBA afin d'automatiser le retraitement.
RE..
Une formule étant plus rapide qu'une boucle:D, il y a ceci:
VB:
Sub testJJ()
  Dim Plage As Range
  With Feuil1
  Set Plage = .Range("h1:h" & .Cells(.Rows.Count, "A").End(xlUp).Row)
  Plage.Formula = "=IF(LEFT(Feuil1!C1,4)=""7062"",INDEX(Feuil2!E:E,MATCH(A1,Feuil2!A:A,0)),"""")"
  Plage.Value = Plage.Value
  End With
End Sub
 

Discussions similaires

Réponses
15
Affichages
756