El problema de acumular valores en una celda suele resolverse con “referencias circulares”. Son fórmulas que incluyen 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 circulares causan problemas. En cambio, proponemos 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 acumulación no se hace en la misma celda donde se escriben los datos. Para satisfacer esta condición podríamos transferir el valor de [B1] a [A1]. Pero, como esto modifica la celda [A1], se dispara nuevamente 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 explorador de proyectos del editor de Visual Basic y luego tomamos las opciones [Ver/Código].