rechercher et modifier une cellule en fonction de valeur autre cellule

benjy555

XLDnaute Junior
Bonjour

Désolé pour ce titre farfelu ! je ne trouve pas mieux.

Alors, imaginons un fichier avec 2 onglets.
l'onglet 1 contient une base de donnée de type :
Colis|Emplacement|Palette
l'onglet 2 est une base vide qui vient s’incrémenter petit à petit lorsqu'on veut déplacer des colis qui étaient rangés à un endroit spécifique :
Colis|Emplacement départ|Palette départ|Emplacement arrivée|Palette arrivée

Le but est que des qu'on rentre sur l'onglet 2 un Colis avec son emplacement et palette de départ puis son emplacement et palette d'arrivée, une macro vienne chercher dans l'onglet 1 la ligne de la colonne "Colis" qui comporte ce fameux colis et aille une cellule à droite pour modifier le contenu du champs "emplacement" par l'information présente dans l'onglet 2 "emplacement arrivée" idem pour l'information "palette" (2 cellule à droite) à remplacer par l'information de l'onglet 2 "palette arrivée".
On pourra parfois rentrer plusieurs colis d'un coup sur l'onglet 2 et il faudra que les remplacements se fassent pour toutes les nouvelles lignes (pas seulement le premier colis)

Autre point : suivant la même logique,
on va parfois changer de place une palette entière (et plus seulement un colis) donc dans un 3ieme onglet j'aurais une base qui est du type : Palette|Emplacement départ|Emplacement arrivée

Dans ce cas la macro devra aller chercher dans l'onglet 1 la valeur dans la colonne "palette" (soit la 2ieme colonne) qui correspond à celle dans l'onglet 3 et modifier "emplacement" par la valeur présente dans l'onglet 3 "emplacement arrivée"
Ici la différence c'est qu'il y aura 1 ou plusieurs ligne dans l'onglet un qui ont la même valeur pour "palette" . Or par ex une recherchev va juste trouver la première et faire la modif alors que la il faut trouver la première puis toutes les suivantes qui sont identique et changer la valeur de la cellule de droite. (il faut donc un système de loop je crois ?)


important : il faut que cette recherche se fasse à la suite d'une macro que j'ai déjà a peu prés mise au point donc cela ne doit pas se déclencher à n'importe quel moment. et à la fin de la macro les valeurs de l'onglet 2 et 3 sont effacées donc toutes les modifications sur l'onglet 1 doivent être figées.


Merci beaucoup pour votre aide
 

benjy555

XLDnaute Junior
bon
après une petite heure passée pour reproduire l’équivalent sur l'onglet 3 , je n'avance pas car je n'arrive pas à comprendre les impacts de chaque fonction je suis désolé.

(pour simplifier j'ai supprimé le passage qui sert de rétrocontrôle mais il faudra le rétablir bien sur c’était une excellente idée)

voilà ou j'en suis, j'ai placé ce code dans l'objet de la feuil3 mais ou sont mes erreurs ?

merci

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [A2:C100000]) Is Nothing Then
If WorksheetFunction.CountA(Range("A" & Target.Row & ":C" & Target.Row)) = 3 Then
For i = 1 To Sheets("1").Range("C100000").End(xlUp).Row
If Sheets("1").Cells(i, 1) = Range("C" & Target.Row) And Sheets("1").Cells(i, -1) = Range("B" & Target.Row) _
And Sheets("1").Cells(i, -2) = Range("C" & Target.Row) Then
Sheets("1").Range("B" & i & ":C" & i) = Range(Cells(Target.Row, 3), Cells(Target.Row, 2)).Value
Exit For
End If
Next
End If

End If
End Sub
 

Fred0o

XLDnaute Barbatruc
Bonjour benjy555

Je suppose que ma proposition te convient.
Correction faite suivant le code ci-dessous :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Trouve As Boolean
  Trouve = False
  If Not Intersect(Target, [A2:C100000]) Is Nothing Then
  If WorksheetFunction.CountA(Range("A" & Target.Row & ":C" & Target.Row)) = 3 Then
  For i = 2 To Sheets("1").Range("C100000").End(xlUp).Row
  If Sheets("1").Cells(i, 3) = Range("A" & Target.Row) And Sheets("1").Cells(i, 2) = Range("B" & Target.Row) Then
  Sheets("1").Range("B" & i) = Cells(Target.Row, 3)
  Trouve = True
  End If
  Next
  If Not Trouve Then MsgBox "Palette " & _
  Cells(Target.Row, 1) & ", emplacement " & Cells(Target.Row, 2) & " non trouve"
  End If
  End If
End Sub

Je joins le fichier

A+, Fred
 

Pièces jointes

  • macro_v2.xlsm
    24.3 KB · Affichages: 50

benjy555

XLDnaute Junior
super

bon j'avou la je ne comprends rien mais j'applique bête et méchant et ça ira.
Du coup lorsque je bascule sur mon vrai fichier (que je ne peux malheureusement communiquer) je rencontre un pb car je pensais facilement adapter et ce n'est pas le cas.

En fait dans mon fichier l’équivalent de la feuille 1 est composé de bien plus de colonne (quand il n'y en a que 3 dans l'exemple). pour moi la colonne Colis est bien en A mais la colonne Emplacement est en H et Palette en I.

J'aurais bien aimé comprendre le code pour faire les adaptations moi meme...

merci
 

Fred0o

XLDnaute Barbatruc
Re-bonsoir

Voici mon code de la feuille "3" commente. Meme principe pour la feuille "2". Si tu as d'autres questions, n'hesites pas.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  ' La variable Trouve de typre Booleen (vrai / faux) permet de savoir si la valeur cherchee a ete trouvee
  Dim Trouve As Boolean
  ' On initialise la variable a faux au debut, car on n'a pas encore trouve la valeur
  Trouve = False
  'Ici, on specifie la plage de cellules dans laquelle la macro evenementielle sera active - a adapter
  If Not Intersect(Target, [A2:C100000]) Is Nothing Then
  ' On verifie que dans la feuille active (3), toutes les cellules servant a la recheche sont remplies, avant de poursuivre
  ' la macro evenementielle, sinon, elle va se declencher trop souvent et planter.
  If WorksheetFunction.CountA(Range("A" & Target.Row & ":C" & Target.Row)) = 3 Then
  ' On demarre la boucle de recherche sur la colonne A (a adapter dans ton fichier reel) a partir de la ligne 2,
  ' jusqu'a la derniere ligne de la colonne A utilisee.
  ' A adpter si ton fichier reel fait plus de 100000 lignes.
  For i = 2 To Sheets("1").Range("C100000").End(xlUp).Row
  ' On recherche dans la feuille "1" ligne i (voir boucle ci-dessus) colonne "C" (correspond au 3 dans Cells(i, 3))
  ' les valeurs correspondant la colonne A de la ligne selectionne dans la feuille "3"
  ' et onrecherche dans la feuille "1" ligne i (voir boucle ci-dessus) colonne "B" (correspond au 2 dans Cells(i, 2))
  ' les valeurs correspondant la colonne B de la ligne selectionne dans la feuille "3"
  If Sheets("1").Cells(i, 3) = Range("A" & Target.Row) And Sheets("1").Cells(i, 2) = Range("B" & Target.Row) Then
  ' Quand on a trouve une ligne qui correspond, on change dans la feuille "1", la valeurs emplacement par
  ' la valeur de colonne "C" dans la feuille "3" Cells(Target.Row, 3)
  Sheets("1").Range("B" & i) = Cells(Target.Row, 3)
  ' Comme on a trouve au moins 1 ligne correspondant, on metr la variable a vrai
  Trouve = True
  End If
  ' On continue de partirir la liste jusqu'a la fin pour changer l'emplacement de cette palette partout
  Next
  ' Si on n'a pas mis a Vrai la valeur d ecette variable (Trouve), c'est que les renseignements donnes dans la feuille "3"
  ' ne correspondent a rien de ce qui se trouve en feuille "1". On envoie donc un petit message
  If Not Trouve Then MsgBox "Palette " & Cells(Target.Row, 1) & ", emplacement " & Cells(Target.Row, 2) & " non trouve"
  End If
  End If
End Sub
 

Discussions similaires

Réponses
6
Affichages
233

Statistiques des forums

Discussions
312 111
Messages
2 085 395
Membres
102 882
dernier inscrit
Sultan94