El control richtextbox, no proporciona toda la infor precisa para reposicionarlo en exactamente el mismo punto, pero si de forma muy aproximada...
Tienes que usar el evento Selchange para ello...
Sea una ventana con un label1 y un richtextbox, llamado rTxt...
Cada vez que pulsas en el control, mueves el cursor, la propiedad SelStart mantiene precisamente el nº del carácter donde está localizado el cursor.
Y una función (GetLineFromChar), devuelve la línea (en el control), que contiene justamente el ese carácter... obviamente si haces el control de distinto tamaño el número de línea cambia, ya que la información de línea es relativa a la presentación no la absoluta al fichero de origen.
Private Sub rTxt_SelChange()
Dim Linea As Long
Linea = rTxt.GetLineFromChar(rTxt.SelStart)
Label1.Caption = "Posición: " & CStr(rTxt.SelStart) & " Linea: " & CStr(Linea)
End Sub
Entonces una vez guardes el fichero, debes guardar el detalle que te faltaba: exactamente la posición del cursor (medidas, fuente y tal, no son necesarios en este caso).
Luego al cargar el fichero, invocas una función como la siguiente
Private Sub CargarFile(ByVal Ruta As String, ByVal Posicion As Long)
rTxt.FileName = Ruta
If ((Posicion < 0) Or (Posicion > Len(rTxt.Text))) Then
Posicion = 0
End If
rTxt.SelStart = Posicion
rTxt.SetFocus ' activar el 'blink' del cursor, para que el usuario lo vea...
End Sub
Este método te proporciona que la posición donde estaba el cursor antes de cerrar el fichero, vuelva a ser la misma posición que contiene el cursor y que esté a la vista, pero la línea en el tope del control, puede no ser la misma, ya que forzado de dicho modo, serán scrolls enteros de la ventana...
...es decir pongamos que estaba en la posición 14546 y que era la línea 244, y que la línea en el top de la ventana era la 235, luego el cursor estaba en la 9º línea en dicha ventana y pongamos que caben 50 líneas en la ventana... al cargarlo, ahora la línea top será la 200 y por tanto el cursor estará ahora desde el tope, en la línea 44ª y no en la 9ª como antes.
El control richtextbox, tampoco tiene un método TextHeight, para calcular las línea de texto que caben en la ventana, ni las barras de scroll proporcionan dato alguno sobre que línea está al tope, que permitirían un mayor control para posicionar al tope la línea deseada...
Todavía podrías subclasificar el control para obtener los puntos de scroll y click, para saber la línea al tope, pero no considero que merezca la pena perder más tiempo ni esfuerzo en ello...
La forma que te proprociono lo ofrece con una exactitud aceptable... el cursor está exactamente en la misma posición donde estaba, si bien lo único que no se consigue es garantizar que la línea ocupe la misma posición que tenía antes.
La ventaja añadida al menos de este método es que tampoco precisas mantener las medias del control ni la fuente usada o su tamaño, ya que lo que se guarda es el índice del carácter que tiene el cursor en el texto, así que se autoajusta sea cual sea las medidas y fuente de la ventana, para que la página donde está el índice del cursor, esté a la vista.
Una imagen de ejemplo:
El cursor no se captura con la captura de pantalla, pero está justo al comienzo de 'Rosebud.en-us', en la línea justo encima del botón de scroll