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].

Tarde o temprano, las referencias circu­lares causan problemas. En cambio, pro­ponemos hacer la acumulación mediante una macro automática:

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] a [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.