Gracias y otra preguntica...(valor anterior de una celda)

06/08/2004 - 16:53 por ivan dario benitez | Informe spam
Hola.

Muchas gracias a Fernando Arroyo y a Hector Miguel por
las repuestas a la preguntica de "Evitar el Supr en una
celda"...
Y aqui va otra:

Como puedo determinar le valor anterior que una celda
tenia antes del que cambie.?


Gracias

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
09/08/2004 - 03:19 | Informe spam
hola, ivan !

... determinar el valor anterior que una celda tenia antes de que cambie?



pues... 'eso' ->implica<- la necesidad de 'ir llevando' un registro/control 'historico' de los cambios efectuados.
podrias lograrlo 'sin macros' pero... 'echando a perder' VARIAS celdas ->por cada celda/nivel<- que quieras 'recordar' :((
o... podrias cambiar las celdas por una 'matriz' [macros] que se 'conserve' durante la sesion de 'ese' documento [libro/hoja] ;)

con el ejemplo que expongo al final, podrias 'llamar al recuerdo' de los [n] cambios de X celda 'controlada' +/- como sigue...
- incluyo 3 procedimientos ['InicializaVA', 'ActualizaVA' e 'InformaVA'] que solo pueden ser 'llamados por codigo'
1.- 'InicializaVA' ->debe ser ejecutado<- desde la apertura del libro [para 'asentar' los valores iniciales]
2.- 'ActualizaVA' ->necesita ejecutarse<- con el evento '_Change' [de la hoja con las celdas 'controladas']
3.- 'InformaVA' es el 'responsable' de 'reportar' los cambios que ha tenido la celda 'solicitada'
- en esta 'propuesta' se 'monitorean' 7 'niveles' de cambios [incluyendo al actual], 6 corresponden a los 'ValoresAnteriores'
-> te recomiendo que 'monitorees' NO MUCHAS celdas, puesto que...
- el rango de celdas que se 'monitorea' esta 'definido' por la constante publica 'Celdas' [en el modulo privado]
- se 'genera' una matriz de [n] filas [# de celdas 'controladas'] × 22 columnas [7 'niveles' × 3 'registros' + la ID de la celda]
[puedes 'ampliarla', pero... no te aseguro que el proceso vaya a resultar... 'rapidin'] ;)
-> col 0 = la ID de la celda [direccion]
-> cols 1,4,7,10,13,16,19 = un texto para cada 'variacion', si 'era' dato/formula/vacia
-> cols 2,5,8,11,14,17,20 = el 'contenido'... el dato o la formula
-> cols 3,6,9,12,15,18,21 = [solo en caso de formula...] el 'resultado' de la formula
- puedes reemplazar la 'construccion' de los MsgBox por 'acciones' necesarias [p.e.] 'dependiendo de...'
- el procedimiento InformaVA 'toma/usa' los siguientes argumentos...
Celda [OBLIGADO] = una referencia como cadena de texto con la direccion de la celda a reportar
Nivel [OPCIONAL] -por 'omision' es 1- = el # de 'nivel del ValorAnterior' que se 'solicita' de la celda [argumento anterior]
Historia [OPCIONAL] = si se especifica como 'True', se 'presenta la historia de cambios' [y se 'omite' el 'reporte anterior']
-> la forma de 'aprovechar' el procedimiento 'que reporta' [InformaVA'] seria +/- como la siguiente... [usado por codigo]
InformaVA Celda:="b15", Nivel:=2 o... InformaVA Celda:="g40", Historia:=True

[creo que...] con estas 'breves' explicaciones, la 'comprension' de los codigos no debiera 'causar' [mucho] problema :D
si cualquier duda... ¿comentas?
saludos,
hector.
en el modulo de codigo de 'la hoja' ==Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(Celdas)) Is Nothing _
Then ActualizaVA Intersect(Target, Range(Celdas)).Address
End Sub
en el modulo de codigo del libro ==Private Sub Workbook_Open()
InicializaVA
End Sub
en un modulo de codigo 'normal' ==Option Private Module
Public Const Celdas As String = "a1,b2:c5,d6,e7:g10", Regs As Integer = 7
Public VA, Moni As Long, Celda As Range, Opc As Integer, Pos As Long, Sig As Integer
Sub InicializaVA(): Moni = Range(Celdas).Count: Pos = 0
ReDim VA(Moni, Regs * 3 + 1)
With Worksheets("Hoja1")
For Each Celda In .Range(Celdas)
If Not IsEmpty(Celda) Then
If Celda.HasFormula Then Opc = 2 Else Opc = 1
End If: Select Case Opc
Case 1: VA(Pos, 0) = Celda.Address: VA(Pos, 1) = "Dato": VA(Pos, 2) = Celda: VA(Pos, 3) = Null
Case 2: VA(Pos, 0) = Celda.Address: VA(Pos, 1) = "Fórmula": VA(Pos, 2) = Celda.Formula: VA(Pos, 3) = Celda
Case Else: VA(Pos, 0) = Celda.Address: VA(Pos, 1) = "Vacía": VA(Pos, 2) = Null: VA(Pos, 3) = Null
End Select: Pos = Pos + 1: Next: End With
End Sub
Sub ActualizaVA(ByVal Actualizar As String)
For Each Celda In Range(Actualizar)
For Sig = 0 To UBound(VA)
If VA(Sig, 0) = Celda.Address Then
Pos = Sig: Exit For
End If: Next
For Sig = Regs * 3 - 2 To 4 Step -3
VA(Pos, Sig) = VA(Pos, Sig - 3): VA(Pos, Sig + 1) = VA(Pos, Sig + 1 - 3): VA(Pos, Sig + 2) = VA(Pos, Sig + 2 - 3)
Next: Opc = 0
If Not IsEmpty(Celda) Then
If Celda.HasFormula Then Opc = 2 Else Opc = 1
End If: Select Case Opc
Case 1: VA(Pos, 1) = "Dato": VA(Pos, 2) = Celda: VA(Pos, 3) = Null
Case 2: VA(Pos, 1) = "Fórmula": VA(Pos, 2) = Celda.Formula: VA(Pos, 3) = Celda
Case Else: VA(Pos, 1) = "Vacía": VA(Pos, 2) = Null: VA(Pos, 3) = Null
End Select: Next
End Sub
Sub InformaVA(ByVal Celda As String, _
Optional ByVal Nivel As Integer = 1, _
Optional ByVal Historia As Boolean = False)
Dim An As Integer, Informe As String: Pos = -1: Celda = Range(Celda).Range("a1").Address
For Sig = 0 To UBound(VA)
If VA(Sig, 0) = Celda Then
Pos = Sig: Exit For
End If: Next
If Pos > -1 Then
If Historia Then
For Sig = 4 To Regs * 3 - 2 Step 3
If VA(Pos, Sig) = "" Then Exit For
If Informe <> "" Then Informe = Informe & vbCr
An = An + 1: Informe = Informe & An & vbTab & VA(Pos, Sig) & vbTab & VA(Pos, Sig + 1) & _
IIf(VA(Pos, Sig + 2) <> "", vbCr & String(2, vbTab) & VA(Pos, Sig + 2), "")
Next
If An > 0 Then
MsgBox "La celda " & Celda & "... ""reporta"" las siguientes modificaciones:" & vbCr & _
"MovAnt" & vbTab & "Tipo" & vbTab & "Contenido / Valor" & vbCr & String(45, "-") & vbCr & Informe & vbCr & _
"Actual" & vbTab & VA(Pos, 1) & vbTab & VA(Pos, 2) & _
IIf(VA(Pos, 3) <> "", vbCr & String(2, vbTab) & VA(Pos, 3), ""), vbInformation
Else: MsgBox "La celda " & Celda & "... NO ha ""reportado"" cambios.", vbInformation: End If
Else
If Nivel < Regs Then
If VA(Pos, Nivel * 3 + 1) <> "" Then
MsgBox "La celda: " & VA(Pos, 0) & vbCr & "en el registro anterior " & Nivel & vbCr & _
"Tenía:" & vbTab & VA(Pos, Nivel * 3 + 1) & vbTab & VA(Pos, Nivel * 3 + 2) & _
IIf(VA(Pos, Nivel * 3 + 3) <> "", vbCr & String(2, vbTab) & VA(Pos, Nivel * 3 + 3), ""), vbInformation
Else: MsgBox "La celda " & Celda & "... NO ""reporta"" cambios en el nivel " & Nivel, vbInformation: End If
Else: MsgBox "Sólo se conservan registros de " & Regs - 1 & " modificaciones.", vbInformation
End If: End If
Else: MsgBox "La celda " & Celda & " ... ¡NO está ""controlada""!!!", vbInformation: End If
End Sub
Respuesta Responder a este mensaje
#2 Jordi
09/08/2004 - 19:05 | Informe spam
Hola,
puedes pegando el código en la hoja que quieras conservar el valor anterior.

Public anterior As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox anterior
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
anterior = Target.Value
End Sub

Creo que es lo que necesitas,
saludos desde barcelona,
Jordi



"ivan dario benitez" escribió en el
mensaje news:168001c47bc5$1c5e1c80$
Hola.

Muchas gracias a Fernando Arroyo y a Hector Miguel por
las repuestas a la preguntica de "Evitar el Supr en una
celda"...
Y aqui va otra:

Como puedo determinar le valor anterior que una celda
tenia antes del que cambie.?


Gracias
Respuesta Responder a este mensaje
#3 Héctor Miguel
09/08/2004 - 20:35 | Informe spam
hola, Jordi ! [solo 'comentarios'] ;)

... en la hoja que quieras conservar el valor anterior.
Public anterior As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox anterior
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
anterior = Target.Value
End Sub



1° esta solucion es ['sencillamente'] ¡perfecta!!! [cuando la seleccion es de una sola celda] ;)
'falla'... cuando el '_selectionchange' corresponde a un rango [mas de una celda] :(
para 'corregirlo' [en el evento '_selectionchange']... p.e.
->anterior = Target.Cells(1,1)<-
2° otra situacion que 'presenta' el evento '_selectionchange' cuando la seleccion es de varias celdas es que...
el evento NO es 'disparado' [nuevamente] 'mientras se navega/cambian' valores 'dentro de la seleccion' :(
el valor de 'anterior' SIEMPRE 'reportara' el de la seleccion 'primera/original'
para 'corregirlo'... [se requiere cambiar el 'comportamiento' de las teclas 'de navegacion']

saludos,
hector.
Respuesta Responder a este mensaje
#4 Jordi
09/08/2004 - 20:50 | Informe spam
Gracias Hector por los comentarios!
Supongo que equivocándose aprende uno!
saludos desde barcelona,
Jordi
"Héctor Miguel" escribió en el mensaje
news:#7g9u#
hola, Jordi ! [solo 'comentarios'] ;)

> ... en la hoja que quieras conservar el valor anterior.
> Public anterior As Variant
> Private Sub Worksheet_Change(ByVal Target As Range)
> MsgBox anterior
> End Sub
> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> anterior = Target.Value
> End Sub

1° esta solucion es ['sencillamente'] ¡perfecta!!! [cuando la seleccion


es de una sola celda] ;)
'falla'... cuando el '_selectionchange' corresponde a un rango [mas de


una celda] :(
para 'corregirlo' [en el evento '_selectionchange']... p.e.
->anterior = Target.Cells(1,1)<-
2° otra situacion que 'presenta' el evento '_selectionchange' cuando la


seleccion es de varias celdas es que...
el evento NO es 'disparado' [nuevamente] 'mientras se navega/cambian'


valores 'dentro de la seleccion' :(
el valor de 'anterior' SIEMPRE 'reportara' el de la seleccion


'primera/original'
para 'corregirlo'... [se requiere cambiar el 'comportamiento' de las


teclas 'de navegacion']

saludos,
hector.

Respuesta Responder a este mensaje
#5 Héctor Miguel
09/08/2004 - 21:10 | Informe spam
hola, Jordi !

Gracias ... por los comentarios! ... Supongo que equivocandose aprende uno!



NO HAY equivocacion en tu propuesta ;)
[aunque... tambien asi 'aprende uno' :( te lo comento por experiencia] ;)

solo fueron comentarios 'ampliando el alcance' de los eventos ;)

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida