Also targetCell wird einige Zeilen höher mit targetCell := getCellByReference(targetList [j], mainCellArray);
aus dem Zellen-Array "geholt", d.h. es wird auf eine bestimmtes Objekt aus dem mainCellArray (Array of TCell) verwiesen, das ist eine globale Variable, die zu Anfang einmal initialisiert wird, d.h. alle Objektinstanzen im Array werden gebildet.
Und targetCell ist auch sicher nicht nil?
Hast due das Range-Checking eingeschaltet?
Zeigen die Variablen beim schrittweise Ausführen vernünftige Werte an?
Deine übermäßige Verwendung von Self solltest du nochmal überdenken. Die with-Anweisungen sind auch nicht sehr hilfreich bei der Fehlersuche.