It looks like you are not referencing the original textbox collection in your eval function.
If I understand your question correctly I think you want to do something like this...
' CREATE A CLASS/MODULE LEVEL VARIABLE TO HOLD A REFERENCE TO YOUR TEXTBOXES FOR LATER USE
Private _textboxes(10, 1) As TextBox
' ADD YOUR CONTROLS TO YOUR FORM AND THE _textboxes ARRAY
Public Sub CreateControlArray()
Dim rowCount As Int32 = 10
' ASSIGN SIZE BASED ON USER INPUT FOR ROW COUNT
ReDim _textboxes(10, rowCount)
For col = 1 To 10 ' each column
For row = 1 To rowCount ' each row
Dim txt As TextBox = New TextBox
txt.Size = New Size(60, 60)
txt.Location = New Point(col * 80 + 5, row * 30 + 100)
' test code : add test input value to second and third columns
If col = 2 Then
txt.Text = row * 5
ElseIf col = 3 Then
txt.Text = row * 30
End If
' end test code
_textboxes(col, row) = txt ' ADD TEXTBOX TO CONTROL ARRAY
Controls.Add(txt) ' add to form
Next row
Next col
End Sub
Public Sub Eval()
Dim rowCount As Int32 = 10
For col As Int32 = 4 To 4
For row As Int32 = 1 To rowCount
' REFERENCE THE TEXTBOXES USING THE CLASS/MODULE LEVEL VARIABLE YOU STORED THEM IN DURING THE CreateControlArray() ROUTINE
Dim txtUserInput As TextBox = _textboxes(col - 2, row)
Dim txtOtherValue As TextBox = _textboxes(col - 1, row)
Dim txtProduct As TextBox = _textboxes(col, row)
' UPDATE FOURTH COLUMN TEXTBOXES
If IsNumeric(txtUserInput.Text) AndAlso IsNumeric(txtOtherValue.Text) Then
txtProduct.Text = CType(txtUserInput.Text, Single) * CType(txtOtherValue.Text, Single)
End If
Next
Next
End Sub