No es necesario calcular el promedio cada vez que modificas una celda.
Creo que lo mejor es dividirlo en varios pasos.
Además no creo que debas utilizar el valor -9999 como indicador de nulo. Yo simplemente dejaría la celda con un 0.
Te dejo un pseudocódigo Delphi:
Código Delphi
[-]
lista_val = array[344160];
lista_Can = array[100, 100];
lista_Sum = array[100, 100];
RellenarListaValores(lista_val);
RellenarConCeros(lista_Can);
RellenarConCeros(lista_Sum);
for i = 0 to lista_val.Count do
begin
ObtenerDatos(lista_val[i], x, y, z);
CalcularPosicion(x, y, columna, fila);
lista_Can[columna, fila] := lista_Can[columna, fila] + 1;
lista_Sum[columna, fila] := lista_Sum[columna, fila] + z;
end;
for Columna = 1 to 100 do
begin
for Fila = 1 to 100 do
if lista_Can[columna, fila] <> 0 then
lista_Sum[columna, fila] := lista_Sum[columna, fila] / lista_Can[columna, fila]
else
lista_Sum[columna, fila] := -9999;
end;