EXCEL Capturer la valeur d'une cellule avant changement
Résolu
electron43
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
Mon objectif :
Afin d'historiser le contenu précédent d'une cellule, avant changement, j'ai réalisé une macro. Cependant, lors de sélection multiple de cellule, je rencontre des problèmes. La macro semble ne plus fonctionner.
(pour info, dans le cas de sélection multiple, je ne souhaite pas archiver les valeur ; je me contente de laisser un message)
Le Classeur :
J'ai créé deux onglets : un onglet " données " et un onglet " config ".
Dans l'onglet " config " j'ai nommé une cellule " fin_de_liste " pour pointer le lieu de stockage des archives.
Voici le macro pour la feuille 1 (données) :
'***********************************************************
' Déclaration des variables publiques
'***********************************************************
Public valeur_adresse_sélectionnée As String
Public contenu_historisation As String
'
'
'***********************************************************
' Macro déclenchée suite à un changement du contenu d'une cellule
'***********************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
' Désactivation des macro déclenchées sur évènements afin de faire la
' modification sans interférer avec Private Sub Worksheet_Change
Application.EnableEvents = False
' Insertion d'une cellule en pied de liste
adresse_stockage_valeur_précédente = Application.Range("fin_de_liste").Address
Application.Range("fin_de_liste").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
' Historisation de la valeur dans l'onglet " config "
Sheets("config").Range(adresse_stockage_valeur_précédente).Value = contenu_historisation
' réactivation des macros déclenchées sur évènements
Application.EnableEvents = True
End Sub
'
'
'*********************************************************
' Macro déclenchée suite à la sélection d'une nouvelle cellule
'*********************************************************
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' stockage de la valeur contenue dans la nouvelle cellule
' sélectionnée. Cette action permet de mémoriser le contenu
' d'une cellule avant d'efectuer un changement de valeur
On Error GoTo sous_macro_01
' le contenu est stocké dans la variable publique
' " valeur_adresse_sélectionnée "
valeur_adresse_sélectionnée = Range(Target.Address).Value
contenu_historisation = "Onglet " & ActiveSheet.Name & " " & Target.Address & " : " & valeur_adresse_sélectionnée
GoTo sous_macro_02
'---------------------------------------------------------------
' sous-programme pour traiter les erreurs et sélections multiples
sous_macro_01:
' un message d'erreur est stocké dans la variable publique
' " valeur_adresse_sélectionnée "
contenu_historisation = "Erreur ou sélection multiple de cellules"
' fin du sous-programme
'---------------------------------------------------------------
sous_macro_02:
End Sub
'
'
Sub débloque()
'**********************************************************
' Macro pour réactiver les macros déclenchées sur évènements
' en cas de plantage
'**********************************************************
Application.EnableEvents = True
End Sub
'
'
Et dans ThisWorkBook :
'**********************************************************
' Macro d'initialisation
'**********************************************************
' à l'ouverture du classeur, le cellule A1 de la feuille
' " données " est sélecionnée. L'objectif est de capturer
' la valeur courante de chaque cellule nouvellement sélectionnée
' Cette valeur est stockée dans la variable publique
' " valeur_adresse_sélectionnée "
'
Private Sub Workbook_Open()
Application.EnableEvents = False
Sheets("données").Select
Range("A1").Select
Application.EnableEvents = True
End Sub
Merci d'avance à elle ou celui qui veut bien me consacrer un peu de temps
Afin d'historiser le contenu précédent d'une cellule, avant changement, j'ai réalisé une macro. Cependant, lors de sélection multiple de cellule, je rencontre des problèmes. La macro semble ne plus fonctionner.
(pour info, dans le cas de sélection multiple, je ne souhaite pas archiver les valeur ; je me contente de laisser un message)
Le Classeur :
J'ai créé deux onglets : un onglet " données " et un onglet " config ".
Dans l'onglet " config " j'ai nommé une cellule " fin_de_liste " pour pointer le lieu de stockage des archives.
Voici le macro pour la feuille 1 (données) :
'***********************************************************
' Déclaration des variables publiques
'***********************************************************
Public valeur_adresse_sélectionnée As String
Public contenu_historisation As String
'
'
'***********************************************************
' Macro déclenchée suite à un changement du contenu d'une cellule
'***********************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
' Désactivation des macro déclenchées sur évènements afin de faire la
' modification sans interférer avec Private Sub Worksheet_Change
Application.EnableEvents = False
' Insertion d'une cellule en pied de liste
adresse_stockage_valeur_précédente = Application.Range("fin_de_liste").Address
Application.Range("fin_de_liste").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
' Historisation de la valeur dans l'onglet " config "
Sheets("config").Range(adresse_stockage_valeur_précédente).Value = contenu_historisation
' réactivation des macros déclenchées sur évènements
Application.EnableEvents = True
End Sub
'
'
'*********************************************************
' Macro déclenchée suite à la sélection d'une nouvelle cellule
'*********************************************************
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' stockage de la valeur contenue dans la nouvelle cellule
' sélectionnée. Cette action permet de mémoriser le contenu
' d'une cellule avant d'efectuer un changement de valeur
On Error GoTo sous_macro_01
' le contenu est stocké dans la variable publique
' " valeur_adresse_sélectionnée "
valeur_adresse_sélectionnée = Range(Target.Address).Value
contenu_historisation = "Onglet " & ActiveSheet.Name & " " & Target.Address & " : " & valeur_adresse_sélectionnée
GoTo sous_macro_02
'---------------------------------------------------------------
' sous-programme pour traiter les erreurs et sélections multiples
sous_macro_01:
' un message d'erreur est stocké dans la variable publique
' " valeur_adresse_sélectionnée "
contenu_historisation = "Erreur ou sélection multiple de cellules"
' fin du sous-programme
'---------------------------------------------------------------
sous_macro_02:
End Sub
'
'
Sub débloque()
'**********************************************************
' Macro pour réactiver les macros déclenchées sur évènements
' en cas de plantage
'**********************************************************
Application.EnableEvents = True
End Sub
'
'
Et dans ThisWorkBook :
'**********************************************************
' Macro d'initialisation
'**********************************************************
' à l'ouverture du classeur, le cellule A1 de la feuille
' " données " est sélecionnée. L'objectif est de capturer
' la valeur courante de chaque cellule nouvellement sélectionnée
' Cette valeur est stockée dans la variable publique
' " valeur_adresse_sélectionnée "
'
Private Sub Workbook_Open()
Application.EnableEvents = False
Sheets("données").Select
Range("A1").Select
Application.EnableEvents = True
End Sub
Merci d'avance à elle ou celui qui veut bien me consacrer un peu de temps
A voir également:
- EXCEL Capturer la valeur d'une cellule avant changement
- Liste déroulante excel - Guide
- Excel cellule couleur si condition texte - Guide
- Proteger cellule excel - Guide
- Aller à la ligne dans une cellule excel - Guide
- Déplacer une colonne excel - Guide
2 réponses
Bonjour,
tu sauvegardes même si pas de changement.
Je te propose plutôt :
Et les évènements ne sont plus désactivés, plus de pb de ce coté en cas de plantage.
eric
tu sauvegardes même si pas de changement.
Je te propose plutôt :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tmp
Static no_events As Boolean
If no_events Then Exit Sub
If Target.Count > 1 Then Exit Sub
tmp = Target
no_events = True
Application.Undo
no_events = False
' ton code de sauvegarde
' ...
no_events = True
Target = tmp
no_events = False
End Sub
Et les évènements ne sont plus désactivés, plus de pb de ce coté en cas de plantage.
eric
Bonjour
Comme ceci peut-être:
Cdlt
Comme ceci peut-être:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Cells.Count > 1 Then MsgBox "Erreur ou sélection multiple de cellules"
' le contenu est stocké dans la variable publique " valeur_adresse_sélectionnée "
valeur_adresse_sélectionnée = Range(Target.Address).Value
contenu_historisation = "Onglet " & ActiveSheet.Name & " " & Target.Address & " : " & valeur_adresse_sélectionnée
End Sub
Cdlt