Excel: Capturar el valor de una celda antes de un cambio

Resuelto
electron43 -  
eriiic Mensajes publicados 24581 Fecha de registro   Estado Colaborador Última intervención   -
Mi objetivo:
Para historizar el contenido anterior de una celda, antes del cambio, he realizado una macro. Sin embargo, al seleccionar varias celdas, encuentro problemas. La macro parece no funcionar más.

(para info, en el caso de selección múltiple, no quiero archivar los valores; me basta con dejar un mensaje)

El libro:
He creado dos pestañas: una pestaña "datos" y una pestaña "config".
En la pestaña "config" he nombrado una celda "fin_de_liste" para señalar el lugar de almacenamiento de los archivos.

Aquí está la macro para la hoja 1 (datos):

'***********************************************************
' Declaración de variables públicas
'***********************************************************
Public valor_adresse_sélectionnée As String
Public contenu_historisation As String
'
'
'***********************************************************
' Macro disparada tras un cambio en el contenido de una celda
'***********************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
' Desactivación de macros disparadas por eventos para hacer la
' modificación sin interferir con Private Sub Worksheet_Change
Application.EnableEvents = False
' Inserción de una celda al pie de la lista
adresse_stockage_valeur_précédente = Application.Range("fin_de_liste").Address
Application.Range("fin_de_liste").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
' Historización del valor en la pestaña "config"
Sheets("config").Range(adresse_stockage_valeur_précédente).Value = contenu_historisation
' reactivación de los eventos
Application.EnableEvents = True
End Sub
'
'
'*********************************************************
' Macro disparada tras la selección de una nueva celda
'*********************************************************
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' almacenamiento del valor contenido en la nueva celda
' seleccionada. Esta acción permite recordar el contenido
' de una celda antes de realizar un cambio de valor
On Error GoTo sous_macro_01
' el contenido se guarda en la variable pública
' " valeur_adresse_sélectionnée "
valeur_adresse_sélectionnée = Range(Target.Address).Value
contenu_historisation = "Hoja " & ActiveSheet.Name & " " & Target.Address & " : " & valeur_adresse_sélectionnée
GoTo sous_macro_02
'---------------------------------------------------------------
' subprograma para manejar errores y selecciones múltiples
sous_macro_01:
' se guarda un mensaje de error en la variable pública
' " valeur_adresse_sélectionnée "
contenu_historisation = "Erreur ou sélection multiple de cellules"
' fin del subprograma
'---------------------------------------------------------------
sous_macro_02:
End Sub
'
'
Sub débloque()
'**********************************************************
' Macro para reactivar las macros disparadas por eventos
' en caso de fallo
'**********************************************************
Application.EnableEvents = True
End Sub

'
'
Y en ThisWorkBook:

'**********************************************************
' Macro de inicialización
'**********************************************************
' al abrir el libro, la celda A1 de la hoja
' "datos" está seleccionada. El objetivo es capturar
' el valor actual de cada celda recién seleccionada
' Este valor se guarda en la variable pública
' " valeur_adresse_sélectionnée "
'
Private Sub Workbook_Open()
Application.EnableEvents = False
Sheets("données").Select
Range("A1").Select
Application.EnableEvents = True
End Sub

Gracias de antemano a cualquiera que quiera dedicar un poco de tiempo

2 respuestas

  1. eriiic Mensajes publicados 24581 Fecha de registro   Estado Colaborador Última intervención   7 281
     
    Hola,

    incluso guardas aunque no haya cambios.
    Te propongo más bien:
    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 ' tu código de guardado ' ... no_events = True Target = tmp no_events = False End Sub

    Y ya no se desactivan los eventos, ya no hay problemas por caída del programa.
    eric

    --
    Al intentar constantemente, al final se consigue.
    Así que cuanto más falla, más probabilidades tenemos de que funcione. (los Shadoks)
    Además del gracias (¡sí, sí, se puede!!!), recuerda marcar como resuelto. Gracias
    1
  2. Frenchie83 Mensajes publicados 2254 Estado Miembro 339
     
    Hola
    Como esto podría ser:
    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

    Cordialement
    0