Creo que estas equivocado. Las consultas SQL se deben hacer al abrir el recordset.
Supongo que, para cargarlo ejecutas "SELECT * FROM tabla"
Despues cuando haces nom = rst.Fields("Nombre") estas cargando el valor del registro actual por eso te muestra siempre el mismo.
Si ya tenes cargados todos los nombres con "SELECT * FROM tabla" usa Find para buscar el que queres.
Código:
Dim rst as New ADODB.Recodset
Dim SQL as String
Dim nom as String
Dim nom1 as String
Dim nom2 as String
'Esta es la sentencia SQL que se va a ejecutar
SQL = "SELECT nombre, id FROM tabla"
'Cargamos los registros (Todos en este caso)
rst.Open SQL, conexion, adOpenForwardOnly, adLockBatchOptimistic
If rst.RecordCount > 0 then 'Vemos si hay algun registro o dará error
'Buscamos los que nos interesan (1, 3, 4 en tu ejemplo)
rst.Find "id = '1'", , adSearchForward, 1
nom = rst.Fields("nombre").Value
rst.Find "id = '3", , adSearchForward, 1
nom1 = rst.Fields("nombre").Value
rst.Find "id = '4'", , adSearchForward, 1
nom2 = rst.Fields("nombre").Value
End If
Text3.Text = nom
Text4.Text = nom1
Text5.Text = nom2
espero que te sirva, un saludo