Eu usaria a função Index:
Digamos que sua fonte de dados esteja na planilha1 em A1: D20. Em seguida, na planilha2, use essas fórmulas:
Column A: "Row": =1, =1, =1, =A1+1, drag down
Column B: "Column": =1, =2, =3, =A1, drag down
Column C: "User": =INDEX(Sheet1!$A$2:$A$20,A2)
Column D: "Perms": =INDEX(Sheet1!$B$1:$D$1,B2)
Column E: "Value": INDEX(Sheet1!$B$2:$D$20,A2,B2)
Que deve ficar assim:
Row Column User Perm Value
1 1 User1 Perm1 R
1 2 User1 Perm2 W
1 3 User1 Perm3 X
2 1 User2 Perm1 X
2 2 User2 Perm2 W
2 3 User2 Perm3 X
3 1 User3 Perm1 R
3 2 User3 Perm2 R
3 3 User3 Perm3 X
Espero que isso ajude.
EDITAR:
As duas primeiras colunas são projetadas para percorrer todas as possibilidades de combinação de colunas de linha. Digamos que você tenha 40 tipos de permissão diferentes e 500 usuários:
Row Column
1 1
1 2
1 3
1 4
...
1 39
1 40
2 1
2 2
2 3
2 4
...
2 39
2 40
3 1
...
500 40
Se você quiser usar fórmulas que você pode arrastar até o fim para isso, você pode fazer isso:
Column A: "Count": =1, =A1+1
Column B: "Row": =INT((A1-1)/5)+1
Column C: "Column": =MOD(A1-1,40)+1 (where you change 40 to the number of permissions you have)
Column D: "User": =INDEX(Sheet1!$A$2:$A$20,B2)
Column E: "Perms": =INDEX(Sheet1!$B$1:$D$1,C2)
Column F: "Value": INDEX(Sheet1!$B$2:$D$20,B2,C2)