Arrays are inefficient given they are iterative by nature and do not restrict themselves to used range intersect of precedent ranges (unlike most other functions)
If you change C:C to say C1: C1000 you will notice a significant improvement.
If you require for the range to be dynamic (based on data added/removed) you can use a Dynamic Named Range, however, use INDEX in construct rather than OFFSET (IMO to avoid Volatility of latter)
Example of the above
First, Insert a new Name as follows:
Name: _Data
RefersTo: =CF1OUT!$A$1:INDEX(CF1OUT!$A:$IV,MATCH(9.99E+307,CF1OUT!$A:$A),MATCH(REPT("Z",255),CF1OUT!$1:$1))
Modify your Array to use the Dynamic Range, e.g
MAIN!E4:
=MAX(IF((INDEX(_Data,0,3)=LOOKUP(REPT("Z",255),$C$4:$C4))*(INDEX(_Data,0,4)=$D4),INDEX(_Data,0,12)))
confirmed with CTRL + SHIFT + ENTER
MAIN!F4:
=MAX(IF((INDEX(_Data,0,3)=LOOKUP(REPT("Z",255),$C$4:$C4))*(INDEX(_Data,0,4)=$D4),INDEX(_Data,0,13)))
confirmed with CTRL + SHIFT + ENTER
MAIN!G4:
=MAX(IF((INDEX(_Data,0,3)=LOOKUP(REPT("Z",255),$C$4:$C4))*(INDEX(_Data,0,4)=D4),INDEX(_Data,0,24)))
confirmed with CTRL + SHIFT + ENTER
MAIN!H4:
=MAX(IF((INDEX(_Data,0,3)=$C$4)*(INDEX(_Data,0,4)=D4),INDEX(_Data,0,17)))
confirmed with CTRL + SHIFT + ENTER
MAIN!I4:
=MAX(IF((INDEX(_Data,0,3)=$C$4)*(INDEX(_Data,0,4)=D4),INDEX(_Data,0,18)))
confirmed with CTRL + SHIFT + ENTER
Copy E4:I4 down to row 27
Bookmarks