EXCEL Capturer la valeur d'une cellule avant changement
Résolu
electron43
-
eriiic Messages postés 25847 Statut Contributeur -
eriiic Messages postés 25847 Statut Contributeur -
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
- Excel cellule couleur si condition texte - Guide
- Liste déroulante excel - Guide
- Aller à la ligne dans une cellule excel - Guide
- Proteger 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