EXCEL Capturer la valeur d'une cellule avant changement

Résolu/Fermé
electron43 - 29 févr. 2016 à 02:56
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 29 févr. 2016 à 08:57
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
A voir également:

2 réponses

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
29 févr. 2016 à 08:57
Bonjour,

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
1
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
29 févr. 2016 à 04:19
Bonjour
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
0