domingo, 5 de mayo de 2013

Excel: sumador acumulador



¿Podemos cargar valores sucesivos en una misma celda y que ésta vaya acumulando los valores?





Tarde o temprano, las referencias circu­lares causan problemas. 
En cambio, pro­ponemos hacer la acumulación mediante una macro automática:
El problema de acumular valores en una celda suele 
resolverse con “referen­cias circulares”. Son fórmulas que inclu­yen en su expresión
 la propia celda en la que están escritas. 
Por ejemplo, cuando escribimos =A1+A2 en la celda[A1].
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = (“$A$1”) Then
Range(“B1”) = Range(“B1”) + Range(“A1”)
End If
End Sub
Esta macro se escribe en la ventana de código de la hoja 
donde vamos a hacer la acumulación y, por tener el nombre
 especial Worksheet_Change, se ejecuta automáticamente
 cada vez que cambia algún dato en la hoja. La macro verifica que 
la celda modificada sea [A1]. En ese caso, suma el nuevo valor
 en la celda [B1]. Tras cada modificación, la celda [B1] 
va acumulando el valor escrito en [A1].
Sin embargo, esto no resuelve el problema planteado, 
porque la acu­mulación no se hace en la misma celda donde 
se escriben los datos. Para satis­facer esta condición
 podríamos transferir el valor de [B1][A1]
Pero, como esto modifica la celda [A1], se dispara nue­vamente
 la macro y se entra en un ciclo infinito. 
La solución es usar una segunda celda auxiliar (por ejemplo, [C1]
para diferenciar la modificación de la celda por 
carga de un dato de la modificación por la propia macro. Algo así:
Private Sub Worksheet_Change(ByVal Target As Range)
If [C1] = 0 Then
If Target.Address = (“$A$1”) Then
Range(“B1”) = Range(“B1”) + Range(“A1”)
[C1] = 1
[A1] = [B1]
[C1] = 0
End If
End If
End Sub
Antes de proceder a la acumulación, esta macro comprueba
 el estado de la celda [C1]. Si su valor es cero, procede con la
 acumulación en [B1]. Pero antes de transferir el acumulado a [A1]
cambia el estado de [C1]. De esta manera, este segundo cambio en el valor
 de [A1] no dispara la ejecución de la macro 
(es decir, sí la dispara, pero la macro no hace nada). 
Antes de terminar, la macro vuelve a poner en cero la celda [C1]
Para abrir la ventana de código de la hoja, seleccionamos
 la hoja en el explo­rador de proyectos del editor de Visual Basic 
y luego tomamos las opciones [Ver/Código].
Esta macro acumula los sucesivos valores que se escriban en la celda [A1].
Con esta opción obtenemos la primera instrucción y la última de la macro que se ejecutará automáticamente al modificar algún valor de la hoja.

No hay comentarios:

Publicar un comentario

Deja todo lo que quieras decirnos, somos mentes abiertas y leemos de todo y para todos, pero por favor no insultes, no agredas, no seas pornografico, eso no nos gusta y te vamos a mandar bien lejos.