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 -
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
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
Enlaces relacionados:
- EXCEL copiar valor de combobox en una celda
- fórmula para copiar el valor de una celda
- Copiar automáticamente el valor de una celda
- colorear una celda en función del valor de otra celda
- Cambiar el valor de una celda en función de otra.
- Limitar el valor de una celda entre un valor alto y un valor bajo
2 respuestas
-
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 -
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