Hi Suresh
Because you are using offsets from B1 to fill your form, it makes sense to use the same reference to write edited data back to the sheet. I've therefore assigned a tag value equal to the offset in Sub Userform_Activate to each of the textboxes on the form.
If the contents of the textbox are NOT to be written to the worksheet, then the Tag should be deleted.
The code looks for the ServerrName in column B and returns this as a row number (i). It then cycles through each control, checking the Tag values. If it is not empty, it writes the cell contents into a cell offset from range B1 by (i-1) rows and (Tag) columns
[vba]
For Each c In Me.Controls
If Not c.Tag = "" Then
Worksheets("Servers").Range("B1").Offset(i - 1, c.Tag) = c.text
End If
Next
[/vba]Regarding the Compile error, whenever you use a For Each X in Y loop, X must always be declared a Variant, even if you know the data type is integer, long, string or whatever.
Either "Dim c as Variant", or simply "Dim c", as Variant is implied.
I've also tidied your Activate code to reduce the verbiage in filling the controls. It's not necessary to use the Userform name with each control on the same form, and the With statement omits repetition of the same range address.

[vba]With Worksheets("Servers").Range("B1")
ServerName.text = .Offset(i, 0).text 'Server Name
ServerIP.text = .Offset(i, 1).text 'Server IP
ServerClientIP.text = .Offset(i, 2).text 'Server Client IP
'.................
End With
[/vba]
Regards
MD