Mise a jour valeurs identiques
bonjour,
je suis en train de comparer 2 colonnes dans 2 feuilles différentes et copier le résultat dans une 3e feuille si valeurs identiques.
jusque là , pas de problème. en revanche, une fois ces valeurs identiques copiées, je n'arrive pas à les mettre à jour ligne par ligne
dans ce fichier 3. ma macro ne met à jour que la 1ere ligne...
comment je peux faire pour mettre à jour les valeurs présentes dans la feuil3 à chaque fois qu'une valeur identique est présente dans la feuil 1 ?
Merci
voici ma macro
Sub CompareBD() ' FILM
col_ref = "A"
col_ref2 = "B"
Set f1 = Sheets("Feuil1") 'saisie formulaire par l'utilisateur
Set f2 = Sheets("Base").Range("A1:A5") ' base produits
Set f3 = Sheets("LastOrder") 'resultats comparaison
ligne = 2 ' commence ici , sous les intitulés de chaque colonne
largeurBD = 4
'---communs
For i = 2 To f1.Range(col_ref2 & "65000").End(xlUp).Row
temp = f1.Cells(i, col_ref2)
p = Application.Match(temp, f2.Range(col_ref & ":" & col_ref), 0)
If Not IsError(p) Then
f1.Cells(i, 2).Resize(, 4).Copy f3.Cells(ligne, 1)
ligne = ligne + 1
End If
Next i
End Sub
Bonsoir,
Et un petit fichier, un...
Cdlt
Bonsoir,
Sub test()
Dim Rg, Cel As Range, Sh1, Sh2, Sh3 As Worksheet, lRow%, Flag As Boolean
Set Sh1 = Sheets("Feuil1"): Set Sh2 = Sheets("Base"): Set Sh3 = Sheets("LastOrder")
lRow = Sh3.Range("A" & Rows.Count).End(xlUp).Row + 1
Application.ScreenUpdating = 0
For Each Cel In Sh1.Range("A2:A" & Sh1.Range("A1").End(xlDown).Row)
Set Rg = Sh3.[aLast].Find(Cel.Value)
If Not Rg Is Nothing Then Flag = True
Set Rg = Sh2.[aBase].Find(Cel.Value)
If Not Rg Is Nothing And Flag = False Then
Sh3.Range("A" & lRow).Resize(1, 3) = Cel.Resize(1, 3).Value
lRow = lRow + 1
End If
Set Rg = Nothing: Flag = False
Next Cel
Set Sh1 = Nothing: Set Sh2 = Nothing: Set Sh3 = Nothing
End SubPas lu le post en entier donc pas vu non plus qu'il fallait juste ajuster le code...
Cdt,
Darzou
Merci Beaucou Darzou,
cependant, une fois les valeurs copiés dans la 3e feuille, ligne après ligne, on ne peut plus les mettre à jour et c'est précisemment ce je voudrais. il faut que quand l'une de ces valeurs est présente une nouvelle fois dans la feuille 1 , avec une quantité et un conditionnement différent parfois, elle soit mise jour dans la feuille 3. vous auriez une idée pour cela ?
NB : quand la feuille 1 est vide et je lance la macro, cela plante et suis obligé de faire crtl+pause : le message de débogage indique alors la ligne " If Not Rg Is Nothing Then Flag = True"
Option Explicit
Sub test()
Dim Rg, Cel As Range, Sh1, Sh2, Sh3 As Worksheet, lRow%, Flag As Boolean
Set Sh1 = Sheets("Feuil1"): Set Sh2 = Sheets("Base"): Set Sh3 = Sheets("LastOrder")
lRow = Sh3.Range("A" & Rows.Count).End(xlUp).Row + 1
Application.ScreenUpdating = 0
For Each Cel In Sh1.[aSh1]
Set Rg = Sh3.[aLast].Find(Cel.Value)
If Not Rg Is Nothing Then
Rg.Resize(1, 3) = Cel.Resize(1, 3).Value: Flag = 1
End If
Set Rg = Sh2.[aBase].Find(Cel.Value)
If Not Rg Is Nothing And Flag = 0 Then
Sh3.Range("A" & lRow).Resize(1, 3) = Cel.Resize(1, 3).Value: lRow = lRow + 1
End If
Set Rg = Nothing: Flag = 0
Next Cel
Set Sh1 = Nothing: Set Sh2 = Nothing: Set Sh3 = Nothing
End SubPrendre le fichier joint, j'y ai modifié une cellule nommée.
En cas de doublon en Column A, le dernier sera reporté en Sheet 3
Cdt,
Darzou
Bravo Darzou !! j'ai adapté la cellule nommée pour chaque article dans la base et j'obtiens exactement ce que je veux. Merci mille fois d'avoir pris la peine d'étudier cela. Une excellente soirée à vous !
Re bonjour Darzou,
je souhaite rajouter de nouvelles données et je bloque sur le code, tout ce que j'ai essayé n'est pas concluant :
comment updater la nouvelle rangée "Palettes" qui se trouve à côté de la plage " Films" ?
je joins le fichier, j'ai ajouté un 2e bouton test pour une nouvelle macro test2'() , votre aide serait vraiment appréciée,
merci par avance
Pas compris...
Le code commenté pourra peut être vous aider:
Option Explicit
Sub test()
Dim Rg, Cel As Range, Sh1, Sh2, Sh3 As Worksheet, lRow%, Flag As Boolean
Set Sh1 = Sheets("Feuil1"): Set Sh2 = Sheets("Base"): Set Sh3 = Sheets("LastOrder")
lRow = Sh3.Range("A" & Rows.Count).End(xlUp).Row + 1 'Première ligne vide ds Sh LastOrder
Application.ScreenUpdating = 0
For Each Cel In Sh1.[aSh1] 'Pour chaque cellule des données saisies en Feuil1
Set Rg = Sh3.[aLast].Find(Cel.Value)
If Not Rg Is Nothing Then 'On check si la référence est déjà dans la Sh LastOrder
Rg.Resize(1, 3) = Cel.Resize(1, 3).Value: Flag = True 'si oui on y remplace les données
End If
Set Rg = Sh2.[aBase].Find(Cel.Value) 'On check maintenant si la référence est présente ds la Sh Base
If Not Rg Is Nothing And Flag = False Then
Sh3.Range("A" & lRow).Resize(1, 3) = Cel.Resize(1, 3).Value: lRow = lRow + 1 'si oui on l'inscrit en Sh LastOrder
End If
Set Rg = Nothing: Flag = False
Next Cel
Set Sh1 = Nothing: Set Sh2 = Nothing: Set Sh3 = Nothing
End SubSi ça ne suffit pas il va falloir reformuler la question avec une phrase de la forme "J'ai ça, je souhaite ça ici de telle manière lorsque je fais ça.".
Cdt,
Darzou
En fait, je souhaite juste DECALER la recherche dans Feuille "Base" : ne plus parcourir la colonne A de la base, mais la colone D.
J'ai essayé avec Set Rg = Sh2.Cells(1, 4)(5, 4).Find(Cel.Value) ' recheche dans la colonne D1:D4 mais pas de résultat
Onglet formules/gestionnaire des noms:
Pour aBase, changer
=DECALER(Base!$A$1;1;;NBVAL(Base!$A:$A)-1;)en
=DECALER(Base!$D$1;1;;NBVAL(Base!$D:$D)-1;)Cdt,
Darzou
excellent, en fait je ne savais pas à quoi faisait référence Sh2.[aBase], il fallait regarder dans l'onglet Formules - du coup, j'ai créé autant de nouvelles références que je voulais et ça fonctionne parfaitement .
Merci beaucoup pour votre éclairage.
vous savez si ce type de référence "[aBase]" fonctionne avec la version Excel 2003 ? et le cas échéant, par quoi il faudrait passer pour obtenir le même résultat ?
cdlt