I am using the following formula and it is working fine. Is there a better way to do so?

=IFERROR(AVERAGEIFS(INDIRECT("Data!$U"&$B$1&":$U"&$A$1),INDIRECT("Data!$A"&$B$1&":$A"&$A$1),">="&D$4,INDIRECT("Data!$A"&$B$1&":$A"&$A$1),"<="&D$5,INDIRECT("Data!$U"&$B$1&":$U"&$A$1),"<>0"),"-")

I am looking for a better way as I have to replicate the same formula in 100 columns and in 60 rows. Where every row use a different target column (like the above mentioned is using column U.

Indirect function gets the values from A1 and B1 cells (Start and end of column because end value keeps changing with data updates)
AverageIfs get average of a particular value between two dates mentioned on top.