Afficher l'historique des valeurs d'une cellule
Bonjour,
je me permets d'écrire ici, je suis nouvelle sur le forum et après quelques recherches je n'ai pas réussi à trouver une solution à mon "problème".
Je souhaiterais avoir la possibilité dans une cellule d'afficher les valeurs antérieures rentrées dans cette même cellule (un historique), en forme de liste déroulante par exemple, au fur et à mesure des modifications, afin de pouvoir voir les évolutions.
Auriez-vous une solution ?
Merci beaucoup de votre aide
Bonjour,
une proposition de solution,
dans l'exemple l'historique est activé sur toutes les cellules de la feuille sheet1, Les valeurs historisées sont sauvegardés dans la feuille historique.
on accède à l'historique d'une cellule via un double-clic gauche.
Bonjour,
j'ai ouvert votre fichier et cette fonction me plait beaucoup, c'est exactement ce que je cherche pour contrôler les évolution de prix de mes fournisseurs. Par contre, je suis assez novice en VBA et après avoir coller le code dans mon fichiers cela ne marche pas, je pense qu'il n'y a pas que le code à coller. pouvez vous m'aider?
Bonjour,
pour pouvoir déterminer comment l'adapter à ton fichier, j'ai besoin de ton fichier ...
Bonjour,
Voici mon fichier : c'est la liste de mes produits d'achat et pour chaque produit je peux comparer 4 fournisseurs et leurs prix (colonnes O à V), le moins chère des 4 se place automatiquement en colonnes I et J mais celui que je choisi est en colonne G et H. J'aimerais donc conserver l'historique des variation de prix d'achat et fournisseur et de mes choix de fournisseur (c'est à dire appliquer ton code sur ces colonnes: G, H et O à V).
Comme tu verras, il y a déjà quelques macros(enregistrées) dans la feuille. Mais j'aimerais comprendre ton fichier : j'ai bien vu ton code et le userform mais j'ai essayer de créer moi même un nouveau fichier en insérant le code et l userform mais cela ne marche pas. Je vois que tu utilise un onglet "historique" qui est un nom réservé à Excel. j'aimerais comprendre comment tu as créer cela car j'aimerais utiliser ta solution dans d'autres fichiers.
Merci beaucoup pour ton aide.
Bonjour,
Historique semble en effet poser problème pour les versions excel FR (comme j'ai une version UK, je n'ai pas ce problème). Ce nom peut être remplacé par n'importe quel autre nom de feuille (à condition de faire les adaptations dans la macro)
Bonjour,
j'ai fait les adaptations dans la macro de la feuille et du userform : j 'ai changé le nom "historique" par" historiques", mais j ai une erreur à l'exécution sur l userform sur la ligne : "r = .Cells(i, colonne)"
Private Sub UserForm_Initialize()
UserForm1.Caption = "Historique des valeurs de la cellule " & celaddress
With Worksheets("historiques")
For i = 2 To .Cells(Rows.Count, colonne).End(xlUp).Row
r = .Cells(i, colonne)
s = InStr(r, ")")
If s <> 0 Then If Left(r, s - 1) = celaddress Then ListBox1.AddItem Mid(r, s + 1)
Next i
End With
End Sub
Je n'ai pas assez de connaissance en VB (
Bonjour,
la variable colonne ne contient pas de valeur. je pense que tu as oublié de copier les instructions se trouvant de module1.
Public celaddress As String, colonne As IntegerNon, j'ai bien mis le module1 avec les instructions.
Cependant, j'ai trouvé le problème sur internet :
J'ai remplacer le "l" par un "1" dans cette ligne code de l'userform (x1Up) :
For i = 2 To .Cells(Rows.Count, colonne).End(xlUp).Row
Je pense que cela provient de la version excel (français/anglais).
Je voudrais également ajouter la valeur de la cellule de droite dans l'historique de la cellule. C'est à dire :
d11= titi
je saisis par exemple 22 en c11
lorsque je doubleclick sur c11, il appairait dans l'userform : "22 titi"
J'ai rajouter : "& Target.Offset(1, 0).Value" dans le "r=" mais cela ne marche pas comme ci après :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count <> 1 Then Exit Sub
If Target = "" Then Exit Sub
r = Target.Address & ")" & Target.Value & Target.Offset(1, 0).Value
c = Target.Column
With Worksheets("historiques")
dl = .Cells(Rows.Count, c).End(xlUp).Row
If .Cells(dl, c) <> r Then .Cells(dl + 1, c) = r & " le : " & Format(Now, "dd/mmm/YY HH:MM")
End With
End Sub
Mes connaissances en VB sont limitées
je joint mon fichier
Merci de ton aide
Bonjour,
pour avoir la valeur de la cellule à droite de la cellule active c'est .offset(0,1) et non .offset(1,0)
correction dans ton fichier
Merci beaucoup de ton aide, c'est exactement le résultat que je cherchais.
Je vais prendre des cours de VBA car cela deviens indispensable...
Merci encore h2so4 de m'avoir aider si rapidement.
J'ai encore un petit soucis dans mon fichier :
Si je modifie la valeur d'une cellule et termine par la touche entrée : le contenu de userform correspond bien au autre valeur de la ligne
Si je modifie la valeur d'une cellule et termine par la touche de déplacement vers le bas : le contenu de userform correspond au valeur de la ligne d'en dessous.(sauf la valeur "r") voici le code :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
celaddress = Target.Address
colonne = Target.Column
UserForm1.Show
Target.Offset(1, 0).Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count <> 1 Then Exit Sub
If Target = "" Then Exit Sub
r = Target.Address & ")" & Format(Target.Value, "#.### €")
c = Target.Column
fournisseur = Target.Offset(0, 1).Value
Produit = ActiveCell.EntireRow.Cells(6)
Prix1 = Format(ActiveCell.EntireRow.Cells(15), "#.### €")
Frn1 = ActiveCell.EntireRow.Cells(16)
Prix2 = Format(ActiveCell.EntireRow.Cells(17), "#.### €")
Frn2 = ActiveCell.EntireRow.Cells(18)
Prix3 = Format(ActiveCell.EntireRow.Cells(19), "#.### €")
Frn3 = ActiveCell.EntireRow.Cells(20)
Prix4 = Format(ActiveCell.EntireRow.Cells(21), "#.### €")
Frn4 = ActiveCell.EntireRow.Cells(22)
With Worksheets("historiques")
dl = .Cells(Rows.Count, c).End(xlUp).Row
If .Cells(dl, c) <> r Then .Cells(dl + 1, c) = r & " " & Produit & " " & fournisseur & " le : " & Format(Now, "dd/mmm/YY") & " (" & Format(Now, "HH:MM") & ")" _
& " ==== " & Prix1 & " : " & Frn1 & " / " & Prix2 & " : " & Frn2 & " / " & Prix3 & " : " & Frn3 & " / " & Prix4 & " : " & Frn4 & "."
End With
If Intersect(Target, Range("f5")) Is Nothing Then: Exit Sub
Select Case Target.Value
Case "Autres"
MacroAutres
Case "Cuisine"
MacroCuisine
Case "Bar"
MacroBar
Case "Tous"
MacroTotale
Case "Inventaire"
MacroInventaire
End Select
End Sub
Il faut que "Produit, Prix1, Frn1, Prix2, Frn2, etc... renvoie la valeur de la cellule correspondante (colonne 6, 15, 17 etc..) de la même ligne que la cellule sélectionnée que je valide par la touche entrée ou une touche de déplacement.
merci encore de ta précieuse aide
[quote="ColletP28"]J'ai encore un petit soucis dans mon fichier :
Si je modifie la valeur d'une cellule et termine par la touche entrée : le contenu de userform correspond bien au autre valeur de la ligne
Si je modifie la valeur d'une cellule et termine par la touche de déplacement vers le bas : le contenu de userform correspond au valeur de la ligne d'en dessous.(sauf la valeur "r") voici le code :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
celaddress = Target.Address
colonne = Target.Column
UserForm1.Show
Target.Offset(1, 0).Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count <> 1 Then Exit Sub
If Target = "" Then Exit Sub
r = Target.Address & ")" & Format(Target.Value, "#.### €")
c = Target.Column
fournisseur = Target.Offset(0, 1).Value
Produit = ActiveCell.EntireRow.Cells(6)
Prix1 = Format(ActiveCell.EntireRow.Cells(15), "#.### €")
Frn1 = ActiveCell.EntireRow.Cells(16)
Prix2 = Format(ActiveCell.EntireRow.Cells(17), "#.### €")
Frn2 = ActiveCell.EntireRow.Cells(18)
Prix3 = Format(ActiveCell.EntireRow.Cells(19), "#.### €")
Frn3 = ActiveCell.EntireRow.Cells(20)
Prix4 = Format(ActiveCell.EntireRow.Cells(21), "#.### €")
Frn4 = ActiveCell.EntireRow.Cells(22)
With Worksheets("historiques")
dl = .Cells(Rows.Count, c).End(xlUp).Row
If .Cells(dl, c) <> r Then .Cells(dl + 1, c) = r & " " & Produit & " " & fournisseur & " le : " & Format(Now, "dd/mmm/YY") & " (" & Format(Now, "HH:MM") & ")" _
& " ==== " & Prix1 & " : " & Frn1 & " / " & Prix2 & " : " & Frn2 & " / " & Prix3 & " : " & Frn3 & " / " & Prix4 & " : " & Frn4 & "."
End With
If Intersect(Target, Range("f5")) Is Nothing Then: Exit Sub
Select Case Target.Value
Case "Autres"
MacroAutres
Case "Cuisine"
MacroCuisine
Case "Bar"
MacroBar
Case "Tous"
MacroTotale
Case "Inventaire"
MacroInventaire
End Select
End Sub
Il faut que "Produit, Prix1, Frn1, Prix2, Frn2, etc... renvoie la valeur de la cellule correspondante (colonne 6, 15, 17 etc..) de la même ligne que la cellule sélectionnée que je valide par la touche entrée ou une touche de déplacement.
merci encore de ta précieuse aide
Bonjour,
avec le code que j'ai fourni il n'y a pas de différence entre une validation par entrée ou par flèche vers le bas.
je ne parviens pas à reproduire le problème avec ton code sur ton fichier. Donc merci de donner des instructions précises pour reproduire le problème.
Bonjour,
Voici mon fichier pour mieux comprendre car j'ai rajouter des lignes de codes et je pense que cela se passe dans ce que j'ai rajouté :
"Produit, Prix1, Frn1, Prix2, Frn2,etc..."
Pour comprendre :
j'ai modifié le prix de la cellule O306 (2,50€)
puis validation par la touche entrée
puis j'ai remodifié le prix (4,50€)
puis validation avec flèche du bas
puis double click sur la cellule modifiée (O306)
Apparait les 2 lignes modifiés mais dans la seconde elle indique les valeur de la ligne 307 (sauf le contenu de la cellule 306)
De ce que je comprends : la fonction offset marche mais pas la fonction ActiveCell.
J'ai bien penser n'utilisé que la fonction offset mais cela décalera la sélection de ce que je veux comme résultat en double cliquant sur d'autre cellule de la ligne (par exemple Q306,S306, U306) qui doivent me renvoyer les mêmes résultat.
Voici mon fichier.
Merci à toi et bon dimanche
bonjour,
essaie ceci
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
celaddress = Target.Address
colonne = Target.Column
UserForm1.Show
Target.Offset(1, 0).Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count <> 1 Then Exit Sub
If Target = "" Then Exit Sub
r = Target.Address & ")" & Format(Target.Value, "#.### €")
c = Target.Column
fournisseur = Target.Offset(0, 1).Value
Produit = Target.EntireRow.Cells(6)
Prix1 = Format(Target.EntireRow.Cells(15), "#.### €")
Frn1 = Format(Target.EntireRow.Cells(16), "#.### €")
Prix2 = Format(Target.EntireRow.Cells(17), "#.### €")
Frn2 = Format(Target.EntireRow.Cells(18), "#.### €")
Prix3 = Format(Target.EntireRow.Cells(19), "#.### €")
Frn3 = Format(Target.EntireRow.Cells(20), "#.### €")
Prix4 = Format(Target.EntireRow.Cells(21), "#.### €")
Frn4 = Format(Target.EntireRow.Cells(22), "#.### €")
With Worksheets("historiques")
dl = .Cells(Rows.Count, c).End(xlUp).Row
If .Cells(dl, c) <> r Then .Cells(dl + 1, c) = r & " " & Produit & " " & fournisseur & " le : " & Format(Now, "dd/mmm/YY") & " (" & Format(Now, "HH:MM") & ")" _
& " ==== " & Prix1 & " : " & Frn1 & " / " & Prix2 & " : " & Frn2 & " / " & Prix3 & " : " & Frn3 & " / " & Prix4 & " : " & Frn4 & "."
End With
If Intersect(Target, Range("f5")) Is Nothing Then: Exit Sub
Select Case Target.Value
Case "Autres"
MacroAutres
Case "Cuisine"
MacroCuisine
Case "Bar"
MacroBar
Case "Tous"
MacroTotale
Case "Inventaire"
MacroInventaire
End Select
End SubBonsoir
Nickel !!
J'avais essayé de mon coté mais en vain
Un Grand merci
Ps : c'est la première fois que je poste sur le forum et je n'ai pas compris ou il fallait "valider" pour "résolu" ?
Bonne fin de soirée
ColletP28 a écrit :Ps : c'est la première fois que je poste sur le forum et je n'ai pas compris ou il fallait "valider" pour "résolu" ?
tu ne peux pas valider un message déjà validé.
Bonjour,
je n'ai pas pensé à une chose :
Ma feuille étant protégée, si je doubleclick sur une cellule qui ne contient pas de liste ça marche; par contre si la cellule comporte une liste de choix cela ne répond plus (ça "mouline")
Je pense qu'il faudrait que la feuille se déverrouille en lançant le double click puis exécute le userform et se verrouille après la feuille ?
Je ne sais pas si cela est possible ou une autre idée...
Merci de ton aide.
Bonne journée