Acumulador recursivo

09/06/2006 - 20:09 por Hernandez, Roberto | Informe spam
Saludos al foro:
Quisiera preguntar, aprovechandome de su sabiduría, si existe alguna forma
de aprovechar el evento Onchange de una hoja para crear una celda que
acumule el valor tecleado en si misma, digamos, 'recursivamente'.?
Es decir que si la celda A1 contiene un 5, y yo tecleo en A1 otro 5, la
celda muestre 10.

Agradezco de antemano su atención al presente

Preguntas similare

Leer las respuestas

#1 Vinchenzo vinç
09/06/2006 - 21:08 | Informe spam
"Hernandez, Roberto" escribió en el mensaje news:
Saludos al foro:
Quisiera preguntar, aprovechandome de su sabiduría, si existe alguna forma de aprovechar el evento Onchange de una hoja para crear
una celda que acumule el valor tecleado en si misma, digamos, 'recursivamente'.?
Es decir que si la celda A1 contiene un 5, y yo tecleo en A1 otro 5, la celda muestre 10.




Hola Roberto,

desconozco si Excel posee de forma intrínseca alguna opción, método, funcionalidad, o lo que fuere.
La forma que se me ocurre, es interceptando el cambio de valor en la celda, del evento 'Worksheet_Change' de la hoja en
cuestión.
Aunque no me convence mucho. Se basa en, primero identificar si está cambiando la celda que quieres. Almacenar el valor actual
(si es numérico), ejecutar un 'Deshacer' en la aplicación, y sumar el valor almacenado con el valor actual (es decir, el valor
anterior).

'***********
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Cells(1, 1).Address Then
Static blnEsUndo As Boolean
Static blnEsCambio As Boolean
Dim dblValue As Double

If blnEsUndo Or blnEsCambio Then Exit Sub

If Not IsNumeric(Target.Value) Then
Application.Undo
Exit Sub
End If
dblValue = CDbl(Target.Value)
blnEsUndo = True
Application.Undo
blnEsUndo = False
blnEsCambio = True
If Not IsNumeric(Target.Value) Then
Target.Value = CDbl(dblValue)
Else
Target.Value = Target.Value + CDbl(dblValue)
End If
blnEsCambio = False
End If
End Sub
'***********

Presupone que la celda 'acumuladora' es la "A1", cada vez que introduzcas un valor numérico, se le sumará. En caso necesario,
para decrementarlo, basta con introducir un valor negativo (evidente, suma la resta), o puedes 'bloquear' la introducción de valores
negativos en el mismo procedimiento (If Target.Value < 0 Exit Sub).

Y, tal vez necesite alguna depuración, no he hecho un test exhaustivo...


Saludos
( ! ) Respuestas precedentes en Google:
http://tinyurl.com/rkce5
( i ) Temperancia en el foro:
http://tinyurl.com/mawnn
Respuesta Responder a este mensaje
#2 Vinchenzo vinç
09/06/2006 - 21:16 | Informe spam
"Vinchenzo vinç" escribió en el mensaje news:ue$0ag$
"Hernandez, Roberto" escribió en el mensaje news:
Target.Value = Target.Value + CDbl(dblValue)



Al revés!. Es incoherente ;-)

Target.Value = CDbl(Target.Value) + dblValue





Saludos
( ! ) Respuestas precedentes en Google:
http://tinyurl.com/rkce5
( i ) Temperancia en el foro:
http://tinyurl.com/mawnn
Respuesta Responder a este mensaje
#3 Héctor Miguel
09/06/2006 - 22:53 | Informe spam
hola, Roberto !

... existe alguna forma de aprovechar el evento Onchange de una hoja
para crear una celda que acumule el valor tecleado en si misma, digamos, 'recursivamente'.?
Es decir que si la celda A1 contiene un 5, y yo tecleo en A1 otro 5, la celda muestre 10.



1) ya tienes una propuesta de parte de Vinchenzo ;)

2) te paso otra -posible- alternativa al final del presente [tambien usando codigo] ;)

3) toma en cuenta que ambas propuestas van a dejarte 'imposibilitado' para hacer uso del deshacer, undo, ctrl+Z :-((
ademas de que 'controlar' varias celdas 'auto-acumuladoras' resultaria en codigos 'menos' ligeros :)
a menos que te fuera de utilidad que la celda 'acumuladora' fuera distinta de la que 'recibe' los valores
[p.e.] acumular en 'B1' las entradas que hagas en 'A1' [incluso a y de hojas diferentes] ;)
definiendo una funcion personalizada NO por vba ??? [sino usando las macrofunciones del 'viejo' excel4] ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

1) para la 'segunda' alternativa, copia las siguientes lineas en el modulo de codigo de 'esa' hoja...
Dim Anterior As Double
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then Anterior = Val([a1])
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Val([a1]) = 0 Then Exit Sub
Application.EnableEvents = False
[a1] = Val([a1]) + Anterior
Application.EnableEvents = True
End Sub

2) para la 'alternativa diferente'... sigue los pasos siguientes:
1.- 'click-derecho' en la pestaña de [alg]una hoja en el libro y selecciona -> 'insertar...'
2.- de la pesta#a general [en el dialogo siguiente]... elegir...
o... 'macro de microsoft excel 4' [EN TU IDIOMA]
u... 'hoja internacional de macros' ['igual'... pero... 'diferente'... es decir... =>en ingles<=] :))
3.- [en la recien-creada hoja de macros] escribe las siguientes instrucciones para =>cada celda<=...
[A1] AcumulaCambios
[B1] =Argumento("Rango",8)
[B2] =Volatil(Falso)
[B3] =Volver(Llamador()+Rango)
=> o... si 'piensas' en acumular la suma de varias celdas... [B3] =Volver(Llamador()+Suma(Rango))
escribelas 'tal-como-puse', si son 'reconocidas' por la aplicacion, seran 'convertidas' a mayusculas
[solo las instrucciones, que 'inician' con el signo '=' y exceptuando los argumentos 'definidos', p.e "Rango"]
3a- si tu idioma es ingles [o la hoja de macros 'fue' del tipo 'internacional']... las instrucciones en ingles...
[B1] =Argument("Rango",8)
[B2] =Volatile(False)
[B3] =Return(Caller()+Rango)
=> o... si 'piensas' en acumular la suma de varias celdas... [B3] =Return(Caller()+Sum(Rango))
4.- selecciona [en la hoja de macros] la celda 'B1' y...
[menu] insertar / nombre / definir... [en este paso, 'tomara' el nombre que 'pusiste' en 'A1', o el que 'le digas']
[en la seccion 'macro] selecciona el 'tipo' de macro... =>funcion< [opcionalmente]... puedes 'decidir' en cual 'categoria' de funciones sera 'agregada' [por omision... def. por el usuario]
=>ACEPTAR<5.- 'regresa' a la hoja, y en [alg]una celda [p.e. en 'B1'] 'llama' a la funcion [p.e.]
=AcumulaCambios(A1)
=AcumulaCambios(A1:A10)
=AcumulaCambios(Hoja5!A1)
'repite' la llamada a la funcion en tantas celdas como sea necesario ;)

notas:
- en ambas 'formas' puedes hacer uso del 'des-hacer' [undo... ctrl+z] 'pero'...
'el regreso' [que ES UN CAMBIO] ->tambien 'se acumula'<- [en el resultado del procedimiento/funcion] <= OJO
- la instruccion 'Volatil(Falso)' =>evita<= que la funcion se 'auto-actualice' en cada 're-calculo' del modelo
solo se 'actualiza' =>SI CAMBIAN<= [o se modifican] los valores del 'Rango' en el argumento de la funcion.
- por lo anterior... si el cambio 'deja' =>el mismo<= valor que 'antes'... NO se 'actualiza' [NO 'hubo cambios']
'a menos que'... 'el cambio' ocurra =>por codigo<= [no importa que 'quede el mismo'] ;)
Respuesta Responder a este mensaje
#4 Hernandez, Roberto
10/06/2006 - 22:45 | Informe spam
Funcionan perfecto las tres.
Muchas gracias a ambos por su atención.


"Hernandez, Roberto" escribió en el mensaje
news:
Saludos al foro:
Quisiera preguntar, aprovechandome de su sabiduría, si existe alguna forma
de aprovechar el evento Onchange de una hoja para crear una celda que
acumule el valor tecleado en si misma, digamos, 'recursivamente'.?
Es decir que si la celda A1 contiene un 5, y yo tecleo en A1 otro 5, la
celda muestre 10.

Agradezco de antemano su atención al presente

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