@Thaddy, Sure, it is safer, however I am used to generating new class instances and destroying them in the calling routine. If I do not destroy it in the calling routine then it is a (smaller though) memory leak.
@wp, I have some spreadsheets, where columns should look like identical, but sometimes (beyond my control) the same purpose cells are entered into different rows in different columns. So, I try to find if cell1(row1, column1) is the "same" as cell2(row2<>row1, column2<>column1), so make a lot of iteration to "guess" it. One step of the guessing is to check if they add to the same row. E.g. C10 is +C12+C15 and D10 is +D12+D25, so it is likely (a lot of other checks are also done) that C15 and D25 are the same purpose, so I can merge row 25 into row 15. So when I compare C15 and D25 during the guessing, I check where they add into. Now for C15 I iterate all functions (only in column C though) to see that it is C10 where it adds into, and so for D25 to find D10. This step I thought to simplify by a quicker step to find the descendants. Anyway, it is a great package and with one extra iteration I can do it.
Thanks,