con el if solo recorres un registro... el while recorre todos...
y el avance o retroceso va al final, ya que si retroces y no hay nada que leer intentas leer vacio... por algo tiene esa estructura el bucle
'hacia adelante
'vamos al primero
rst.movefirst
'mientras existan registros
while not rst.eof
'código que quieras para ese registro
'avanzamos registro
rst.movenext
wend
'hacia atrás
'vamos al último
rst.movelast
'mientras existan registros
while not rst.BOF
'código que quieras para ese registro
'avanzamos registro
rst.MovePrevious
wend
BOF indica que la posición del registro actual está antes del primer registro de un objeto Recordset.
EOF indica que la posición del registro actual está después del último registro de un objeto Recordset.
copipasteo la ayuda...
Métodos MoveFirst, MoveLast, MoveNext y MovePrevious
Pasa al primer, último, siguiente o anterior registro de un objeto Recordset especificado y lo convierte en el registro actual.
Sintaxis
recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}
Comentarios
Utilice el método MoveFirst para mover la posición del registro actual al primer registro del Recorset.
Utilice el método MoveLast para mover la posición del registro actual al último registro del Recorset. El objeto Recordset tiene que aceptar marcadores o movimiento hacia atrás; si no, la llamada al método generará un error.
Utilice el método MoveNext para mover la posición del registro actual un registro hacia delante (hacia el final del Recordset). Si el último registro es el registro actual y llama al método MoveNext, ADO establece el registro actual a la posición posterior al último registro del Recordset (EOF es True). El intento de avanzar cuando la propiedad EOF ya sea True genera un error.
Utilice el método MovePrevious para mover la posición del registro actual un registro hacia atrás (hacia el principio del recordset). El objeto Recordset tiene que aceptar marcadores o movimiento hacia atrás; si no, la llamada al método generará un error. Si el primer registro es el registro actual y llama al método MovePrevious, ADO establece el registro actual a la posición anterior al primer registro del recordset (BOF es True). El intento de retroceder cuando la propiedad BOF ya sea True genera un error. Si el objeto Recordset no acepta marcadores o movimiento hacia atrás, el método MovePrevious generará un error.
Si el recordset es de tipo Forward-only y quiere recorrerlo hacia adelante y hacia atrás, puede utilizar la propiedad CacheSize para crear una caché de registros que acepte el movimiento hacia atrás mediante el método Move. Como los registros de la caché están guardados en la memoria, tiene que evitar guardar en la caché más registros de los estrictamente necesarios. Puede invocar el método MoveFirst en un objeto Recordset de tipo Forward-only; si lo hace, el proveedor vuelve a ejecutar el comando que generó el objeto Recordset.