Pour inverser, dans la solution sans cellules vides que j'ai donnée, on inverse aussi dans la macro...
Private Sub CommandButton1_Click()
Dim tbl, i%
tbl = Worksheets("Feuil1").Range("B1:M2").Value
For i = 1 To 12
tbl(2, i) = Controls(tbl(1, i)).Value
Next i
Worksheets("Feuil1").Range("B1:M2").Value = tbl
End Sub
Pour tes décalages...
Private Sub CommandButton1_Click()
Dim tbl, i%
tbl = Worksheets("Feuil1").Range("B1:Q2").Value
For i = 1 To UBound(tbl, 2)
If tbl(1, i) <> "" Then tbl(2, i) = Controls(tbl(1, i)).Value
Next i
Worksheets("Feuil1").Range("B1:Q2").Value = tbl
End Sub
En mettant UBound(tbl, 2) au lieu de 16, j'ai amorcé une généralisation...
Pour généraliser complètement, il faut rendre aussi la plage variable en cherchant la dernière colonne utilisée en ligne 1...
En réfléchissant un peu sur la signification du code fourni et les méthodes utilisées, tu aurais dû pouvoir extrapoler et adapter...