=LET(e,A3:D17,d,INDEX(e,MOD(SEQUENCE(ROWS(e)*2)-1,ROWS(e))+1,INT((SEQUENCE(ROWS(e)*2)-1)/ROWS(e))*2+1),b,SORT(UNIQUE(FILTER(d,d<>0))),a,VLOOKUP(b,e,2,0),c,VLOOKUP(b,OFFSET(e,0,2,,2),2,0),CHOOSE({1,2,3,4},IF(ISERROR(a),"",b),IF(ISERROR(a),"",a),IF(ISERROR(c),"",b),IF(ISERROR(c),"",c)))
=LET(_r,VSTACK(A3:A17,C3:C17),
_s,SORT(UNIQUE(FILTER(_r,_r<>""))),
_a,VLOOKUP(_s,A3:B17,2,),
_b,VLOOKUP(_s,C3:D17,2,),
VSTACK(A2:D2,HSTACK(IF(ISERROR(_a),"",IF({1,0},_s,_a)),IF(ISERROR(_b),"",IF({1,0},_s,_b)))))
=LET(_r,VSTACK(A3:A17,C3:C17),
_s,SORT(UNIQUE(FILTER(_r,_r<>""))),
_a,INDEX(A3:B17,XMATCH(_s,A3:A17),{1,2}),
_b,INDEX(C3:D17,XMATCH(_s,C3:C17),{1,2}),
VSTACK(A2:D2,IFERROR(HSTACK(_a,_b),"")))
For Excel 2016 I wouldn't like to develop a formula, but Power Query is available in Excel 2016, but would this be breaching the 'no table' requirement? If not I'll have a go.