Crear cursor en un cuadro de texto

Llevo unas semanas recopilando y adaptando varias macros para mi trabajo que funcionan muy bien en Write, casi he terminado, necesito que además funcionen en un cuadro de texto lo que no se es como ubicar el cursor, por ejemplo insertar un NIF:

Sub main()
Dim doc As Object
Dim oText As Object
Dim oVCurs As Object
Dim oTCurs As Object
doc = ThisComponent
oText = doc.Text
dni = InputBox (“Captura el DNI”)
Dim nif As String
nif = LetraNif(dni)
d = Format(dni,"##,###")
REM ver el cursor
oVCurs = doc.CurrentController.getViewCursor()
REM crear cursor
oTCurs = oText.createTextCursorByRange(oVCurs.getStart())
’ Place the text to insert here
oText.insertString(oTCurs,d & “-”&nif , FALSE)
End Sub
Function LetraNif(dni As Long) As String
LetraNif = Mid(“TRWAGMYFPDXBNJZSQVHLCKE”, (dni Mod 23) + 1, 1)
End Function

He buscado en el foro sobre el tema y a lo mas que llego es a como crear un cuadro de texto:
oTextBox = oDoc.createInstance(“com.sun.star.drawing.TextShape”)
pero no he encotrado de nada de como seleccionarlo para insertar las macros en el, porque si ejecuto mi macro dentro lo que recibo es este error:

Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.uno.RuntimeException
Message: no text selection.

No tengo claro si quieres agregar un cuadro de texto y agregar texto dentro de el… o quieres agregar texto a un cuadro ya existente.

Agregar al ya existente

Debes de conocer el nombre del cuadro de texto

	nombre = "Text Frame 1"
	doc = ThisComponent
	pagina_dibujo = doc.DrawPage
	
	For Each forma In pagina_dibujo
		If forma.Name = nombre Then
			Exit For
		End If
	Next

Entonces, puedes agregar el texto que quieras…

	texto = forma.Text
	cursor = texto.createTextCursorByRange(forma.Text)
	cursor.gotoEnd(False)
	texto.insertControlCharacter(cursor, com.sun.star.text.ControlCharacter.LINE_BREAK, False)
	texto.insertString(cursor, "TEST", False)

Solo cuida de que el cursor visible NO este dentro del cuadro de texto.


v2.0

En esta versión inserta el texto en la posición actual del cursor visible, este o no dentro de un cuadro de texto…

	'Obtener una referencia al documento actual  
	doc = ThisComponent
	'dni = InputBox ("Captura el DNI")
	dni = "74631074"
	nif = LetraNif(dni)
	info = Format(dni, "##,###") & "-" & nif
	
    'La selección actual
    sel = doc.CurrentController.Selection.getByIndex(0)
    texto = sel.Text
    cursor = texto.createTextCursorByRange(texto)
	cursor.gotoEnd(False)
    texto.insertString(cursor, info, False)    

Funciona, como puedes ver en la siguiente animación.
Peek 2022-03-30 12-42

pero… por alguna razón que no se, en cuanto ejecutas la macro dentro del cuadro de texto, debes de mover el cursor fuera de el para ver el resultado… desconozco el porque de este comportamiento…

Muchas gracias por tu ayuda Mauricio, llevo un par de dias intentado adaptar la macro para que en función de donde esté situado el cursor, en el cuadro de texto o fuera de él, funcione correctamente, no quiero molestar más, pero mi nivel es el que es, y lo hace a medias, fuera del marco perfecto, pero cuando el cursor está dentro, solo inserta el texto al salir del cuadro con lo que no es nada eficaz pues no puedes usar la macro, salir, y volver a entrar para seguir escribiendo, esto es como he dejado la macro, os ruego que me ayudeis a encontrar el problema:

Sub NIF

'Dim doc, oText, oVCurs, oTCurs, cursor, texto As Object
Dim doc, oText, oVCurs, oTCurs As Object
Dim nif As String

'Obtener un enlace al documento actual  
oDoc = ThisComponent
'dni = InputBox ("Captura el DNI")
dni = "12345678"
nif = LetraNif(dni)
d = Format(dni,"##,###")

pagina_dibujo = ThisComponent.DrawPage
'nombre = "Textshape1"

For Each forma In pagina_dibujo
	'If forma.Name = nombre Then
	'	Exit For
	'End If
Next

'La selección actual
oSel = oDoc.getCurrentController.getSelection.getByIndex(0)

'Verificamos si es una forma
If oSel.getImplementationName = "SwXShape" Then
    'Verificamos que sea un cuadro de texto
     'MsgBox "Esto es un cuadro de texto"

     oText = forma.Text
     oTCurs = oText.createTextCursor(ThisComponent.DrawPage)
     oText.insertString(oTCurs, "TEST", False)

	Else
	
	oText = ThisComponent.Text
	oTCurs = oText.createTextCursorByRange(thisComponent.currentController.viewCursor)
	oText.insertString(oTCurs,d & "-"&nif , FALSE)   
   
End If	

End Sub

Function LetraNif(dni As Long) As String
LetraNif = Mid(“TRWAGMYFPDXBNJZSQVHLCKE”, (dni Mod 23) + 1, 1)
End Function

Anexa el archivo donde estas probando para verificarlo…

Este es un archivo de ejemplo
prueba.odt (12.3 KB)