F2 has =INDEX($B$1:$D$1,MOD(ROW()-ROW(F$1)-1,COUNTA($B$1:$D$1))+1)
G2 has =INDEX($A$2:$A$5,MOD(ROW()-ROW(G$1)-1,COUNTA($A$2:$A$5))+1)
H2 has =INDEX($B$2:$D$5,MATCH(G2,$A$2:$A$5,0),MATCH(F2,$B$1:$D$1,0))
Replace $B$1:$D$1 with your column heading range for Customer columns,
Replace $A$1:$A$5 with your row heading range for Product columns,
Replace F$1 with the address of your Customer heading on the result range ( H$4?)
Replace G$1 with the address of your Product heading on the result range ( I$4?)
Replace $B$2:$D$5 with your data range (where the volumes are)
You also need to adjust G2 to and F2 in the last formula in H2 (in my example). If this to go to J5 (in yours), change G2 to I5, and F2 to H5.
I hope this helps; if you still have difficulties tell me what your H5:J5 refers to: the first row of results, or the heading (Customer Name,Product Name, Volume)

You still calculate rows*columns to copy the formulae down. Also it does not remove blank cells (your Customer1 having no Product volume.