Будет публиковаться как ответ, чтобы его можно было пометить как таковое, хотя я перечислил это в комментарии:
J = 0
While J < 20
LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
ws.Range("A" & LastRow).Value = Now()
ws.Range("B" & LastRow).Value = Me.Controls("TextBox" & J*2 + 1).Value
ws.Range("D" & LastRow).Value = Me.Controls("TextBox" & J*2 + 2).Value
ws.Range("I" & LastRow).Value = TextBox21.Value
J = J + 1
Wend
Возможно, вы захотите проверить ваш J max после этого ...
строка 1 использует J = 0, поэтому текстовое поле 1, текстовое поле 2
строка 2 использует j = 1, поэтому текстовое поле 1 * 2 + 1 (3) и текстовое поле 1 * 2 + 2 (4)
строка 3 использует j = 2, поэтому текстовое поле 2 * 2 + 1 (5) и текстовое поле 2 * 2 + 2 (6)
и т. Д.