Gracias por la respuesta, pero pasa lo habitual: ¡Soy de ciencias!, por lo que me explico entre regular y bastante mal.
Te pongo el ejemplo completo par a que veas como va:
Pretendo poner un icono en la barra de herramientas que llame a una macro cuando queramos aplicarla. Esta macro tiene como función la modificación de textos en cuanto a su tamaño de letra, interlineado, imágenes, marcos de texto, marcos, tablas, y todo lo que se nos pueda imaginar (por lo que tendrá tantos fallos como nos podamos imaginar), con la intención de ajustar el tamaño del documento al tamaño de página.
Al 'poder' tener resultados inesperados o no deseados, quisiera tener una copia de seguridad del documento inicial para volver a ella si el resultado no es el deseado.
Encontré que el sistema de copia del documento (nos quedaría en el portapapeles) no respeta membretes , y me lié con esto de las versiones.
También intenté hacer la copia y después pegar los formatos, con lo que los membretes respondían bien, pero a la hora de hacer reducción o ampliación de texto dentro de un cuadro de texto me salía un bug que me hizo aparcar esa vía
Añado un documento en el que se explica el porqué y el cómo de la macro (es un poco largo), y aquí te dejo todo el código, para que veas que para mí es difícl aplicar tu solución, ya que no tengo manera de saber la ruta de la versión que deseo recuperar(seguramente solo es ignorancia) para sustituir el documento al que la macro le llevó.
Código: Seleccionar todo
Sub AjustarTexto(Distancia)
'---------------------------------------------------------------------
' Modificaciones sobre procedimiento publicado por Christoph Lutz
Dim objSize as New com.sun.star.awt.Size
'--------------------------------------------------------------------
' Variables que pueden ser modificadas según conveniencia
Minimo= 5000 ' Constante de distancia
Maximo= 27000 ' Constante de distancia
Medio = 10000 ' Constante de distancia
MedioAmpliado= 15000 ' Constante de distancia
Paglim=4 ' Páginas a partir de las cuales cambian los criterios
scaleinc=0.005 ' Cambia la escala en pasos del 0,005%
'--------------------------------------------------------------------------
' 1º Contamos las páginas y tomamos el control del texto
Doc= ThisComponent ' Documento a manejar
document = ThisComponent.CurrentController.Frame ' Control del documento
odispatcher = createUnoService("com.sun.star.frame.DispatchHelper") ' Despachador
User= Environ("USERNAME") ' Usuario del programa
paginas=ThisComponent.getCurrentController().getPropertyValue("PageCount") ' Número de páginas
if paginas=1 Then Exit sub ' Si es una página nos echa
HacerVersion (Doc) ' Hacemos una versión de respaldo del documento original
oText = doc.getText() ' Tomamos el control del texto del documento
oCursor = oText.createTextCursor() ' Creamos un cursor de texto
oCursor.gotoStart(False) ' Vamos al inicio del texto
oCursor.goToEnd (False) ' Vamos al final del texto, seleccionándolo
'---------------------------------------------------------------
' 2º Ponemos una forma (rectángulo) al final del texto (tamaño minúsculo y sería transparente, por lo que al final no se vería)
oShape = doc.createInstance("com.sun.star.drawing.RectangleShape") ' Vamos a insertar un rectángulo
Objsize.Width = 1 ' Anchura del rectángulo
Objsize.Height = 1 ' Altura del rectángulo
oShape.setSize(Objsize) ' Tamaño de la forma
oShape.name="Auxiliar"
oShape.LineColor=RGB (255,255,255) ' Color blanco
oShape.LineWidth= 1 ' Grosor de la línea
oText.insertTextContent( oCursor, oShape, False ) ' Inserción del rectángulo
oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER ' Lo ancoramos como carácter
oShape.Surround = com.sun.star.text.WrapTextMode.THROUGHT ' NONE, THROUGHT, DYNAMIC, PARALLEL, LEFT, RIGHT
oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE ' Lo ancoramos a la página
Distanciaa=oShape.getPosition().Y ' Distancia al borde superior de la página
oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER ' Lo ancoramos como carácter
'-------------------------------------------------------------------
' 3º Contamos los párrafos que tiene el documento
CantidadParrafos(doc, npars) ' Llamamos a la función de contar el número de párrafos
DistanciaReferencia (doc, oShape,Distancia) ' Llamamos a la función que mide
'-------------------------------------------------------------------
' 4º Actuamos sobre cada párrafo dependiendo del número de páginas y localización de la forma auxiliar
scalemax=0.05 ' Máxima modificación de la escala de reducción
scale=0 ' Escala inicial de reducción 0
oText = doc.getText() ' Tomamos el control del texto del documento
oCursor = oText.createTextCursor() ' Creamos un cursor de texto
oCursor.gotoStart(False) ' Vamos al inicio del texto
'-------------------------------------------------------------------
' 5º Caso primero, reducción del texto
If Paginas<Paglim and (Distanciaa <= Minimo or Distanciaa>Maximo) or Paginas>=Paglim and (Distanciaa <= MedioAmpliado) then ' Según páginas y localización de forma auxiliar
While scalemax >= scale ' Mientras la escala sea menor que la máxima
scale=scale+scaleinc ' Se le suma la escala del momento más un 0,0005%
Escala=1-scale ' Parámetro que usaremos después
ObjetoDibujo(Doc, Escala) ' Llamamos a la función del objeto de dibujo
Tabla (Doc, Escala) ' Llamamos a la función de tabla
Resize (doc, oShape,oCursor,Escala, npars) ' Llamamos a la función que modifica el tamaño
DistanciaReferencia (doc, oShape,Distancia) ' Medimos la distancia
'---------------------------------------------------------------
' Control de distancia para salir de la macro
If (Paginas<Paglim and (Distancia > Medio)) or (Paginas>=Paglim and (Distancia > (Maximo))) Then' Si las distancias superan los límites permitidos
oShape.Dispose ' Eliminamos la forma auxiliar
Recuperacion (Doc,Copia)
Exit Sub ' Nos echa de la macro
End if ' Acabamos la condición
'----------------------------------------------------------------
' Control de número de páginas para salir de la macro
If paginas2<=paginas-1 or paginas2>paginas Then ' Si las páginas superan los límites permitidos
oShape.Dispose ' Eliminamos la forma auxiliar
Recuperacion (Doc,Copia)
Exit Sub ' Nos echa de la macro
End if ' Acabamos la condición
'-----------------------------------------------------------------
' Si no hemos sido expulsados, seguimos el ciclo
oCursor.gotoStart (false) ' Vamos al inicio del texto
Wend ' Vamos al siguiente ciclo de modificación
End if ' Acabamos con la condición para reducción
'----------------------------------------------------------
' 8º Caso segundo, aumento de texto
If (Paginas<Paglim and (Distanciaa>Minimo)) and (Paginas<Paglim and (Distanciaa<=Medio)) or (Paginas>=Paglim and (Distancia > MedioAmpliado)) then ' Según páginas y localización de forma auxiliar
While scalemax >= scale ' Mientras la escala sea menor que la máxima
scale=scale+scaleinc ' Se le suma la escala del momento más el porcentaje fijado
Escala=1+scale ' Parámetro que usaremos después
ObjetoDibujo(Doc, Escala) ' Llamamos a la función que actúa en las formas
Tabla (Doc, Escala)
Resize (doc, oShape,oCursor,Escala, npars) ' Llamamos a la función que modifica el tamaño
DistanciaReferencia (doc, oShape,Distancia) ' Medimos la distancia
'---------------------------------------------------------------
' Control de distancia para salir de la macro
If (Paginas<Paglim and (Distancia > Medio)) or (Paginas>=Paglim and (Distancia > (Maximo))) Then' Si las distancias superan los límites permitidos
oShape.Dispose ' Eliminamos la forma auxiliar
Recuperacion (Doc,Copia) ' Llamamos la función que recupera el documento
Exit Sub ' Nos echa de la macro
End if ' Acabamos la condición
'----------------------------------------------------------------
' Control de número de páginas para salir de la macro
If paginas2<=paginas-1 or paginas2>paginas Then ' Si las páginas superan los límites permitidos
oShape.Dispose ' Eliminamos la forma auxiliar
Recuperacion (Doc,Copia) ' Llamamos la función que recupera el documento
Exit Sub ' Nos echa de la macro
End if ' Acabamos la condición
'-----------------------------------------------------------------
' Si no hemos sido expulsados, seguimos el ciclo
oCursor.gotoStart (false) ' Vamos al inicio del texto
Wend ' Vamos al siguiente ciclo de modificación
End if ' Acabamos con la condición de aumento
oShape.Dispose ' Eliminamos la forma auxiliar
End Sub
Function CantidadParrafos(doc, npars)
npars=0 ' Ponemos la constante a 0
oText = doc.getText() ' Tomamos el control del texto del documento
oCursor = oText.createTextCursor() ' Creamos un cursor de texto
oCursor.goToEnd (False) ' Vamos al final del texto
oEnum = doc.Text.createEnumeration() ' Enumeración de elementos de texto
Do While oEnum.hasMoreElements() ' Mientras hay más elementos de texto
oPar = oEnum.nextElement() ' Siguiente elemento de texto
If oPar.supportsService("com.sun.star.text.Paragraph") Then ' Si es un párrafo
nPars = nPars + 1 ' añadimos un párrafo más
End if ' Acabamos la condición de ser párrafo
Loop ' Vamos al siguiente elemento de texto
End Function
Function DistanciaReferencia (Doc, oShape,Distancia)
oText = doc.getText() ' Tomamos el control del texto del documento
oCursor = oText.createTextCursor() ' Creamos un cursor de texto
oCursor.goToEnd (True) ' Vamos al final del texto
oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER ' Lo ancoramos como carácter
oShape.Surround = com.sun.star.text.WrapTextMode.THROUGHT ' NONE, THROUGHT, DYNAMIC, PARALLEL, LEFT, RIGHT
oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE ' Lo ancoramos a la página
Distancia=oShape.getPosition().Y ' Distancia al borde superior de la página
oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER ' Lo ancoramos como carácter
End function
Function Resize (doc, oShape,oCursor,Escala, npars)
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") ' Creamos un servicio de 'despachador'
'----------------------------------------------
' 1º Hacemos el repaso párrafo a párrafo, parcheando si hay letras de distinto tamaño dentro del párrafo
For i=0 to nPars-1 ' Ciclo para recorrer todos los párrafos
oCursor.gotoStartOfParagraph (False) ' Nos colocamos en el inicio del párrafo
oCursor.gotoEndOfParagraph (True) ' Vamos al final del párrafo, seleccionándolo
'----------------------------------------------------------
' 2º Parche si un párrafo tiene alguna letra con tamaño diferente de las demás
if Cint( oCursor.Charheight) <>0 Then ' Si el párrafo tiene todos los caracteres iguales
oCursor.CharHeight = oCursor.CharHeight*(Escala) ' Modificamos el tamaño de letra según escala
LineSpace = oCursor.paralinespacing ' Toma el control del interlineado
If Escala>1 and LineSpace.Height<140 Then ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
If Escala<1 and LineSpace.Height>110 Then ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
Else ' Si el párrafo tiene caracteres de distintos tamaños
LineSpace = oCursor.paralinespacing ' Toma el control del interlineado
If Escala>1 and LineSpace.Height<140 Then ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
If Escala<1 and LineSpace.Height>110 Then ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
oCursor.ParaTopMargin=oCursor.ParaTopMargin*(Escala) ' Disminuimos la parte alta del párrafo
oCursor.ParaBottomMargin=oCursor.ParaBottomMargin*(Escala) ' Disminuimos la parte baja del párrafo
oCursor.gotoStartOfParagraph (False) ' Nos colocamos en el inicio del párrafo
oCursor.gotoEndOfParagraph (True) ' Vamos al final del párrafo, seleccionándolo
for a=0 to len (oCursor.String) ' Iniciamos ciclo recorriendo cada carácter del párrafo
oCursor.gotoStartOfParagraph (False) ' Vamos al inicio del párrafo
oCursor.goRight(a,False) ' Nos movemos tantos lugares a la derecha como letras se cuentan en ese momento
oCursor.goRight(1,True) ' Vamos al siguiente carácter
oCursor.CharHeight = oCursor.CharHeight*(Escala) ' Disminuimos la altura de la letra
next ' Retomamos el ciclo de caracteres
End if ' Acabamos condición de tamaño de caracteres iguales o no
oCursor.gotoNextParagraph(False) ' Vamos al siguiente párrafo
'----------------------------------------------------------------------------
' Freno al avance en los párrafos
if i=npars-1 Then ' Si hemos alcanzado el último párrafo
Exit for ' Salimos del ciclo, y entra un nuevo ciclo de reducción recorriendo todos los párrafos
End if ' Acabamos la condición de estar en el último párrafo
'-------------------------------------------------------------------------------
' Medimos distancia del final del texto al borde superior de la página y contamos las páginas
DistanciaReferencia(Doc, oShape, Distancia) ' Llamada a la función de medición
oDispatcher.executeDispatch(doc.currentController.Frame, ".uno:Repaginate", "", 0, Array()) ' Repaginamos
paginas2=doc.getCurrentController().getPropertyValue("PageCount") ' Número de páginas
'----------------------------------------------------------------------------
' Controles de avance del cambio de tamaños
If (Paginas<Paglim and (Distancia > Medio)) or (Paginas>=Paglim and (Distancia > Maximo)) Then Exit Function
if paginas2<=paginas-1 or paginas2>paginas Then Exit For
Next
if paginas2>paginas Then ' Si nos pasamos de número de páginas (Hemos aumentado demasiado)
Afinar (Doc, oShape,paginas,paginas2,npars,scale) ' Llamamos a la función afinar, que reducirá el interlineado un 5%
End if ' Acabamos la condición
End Function
Function Afinar (Doc, oShape,paginas,paginas2,npars,scale)
Escala=0.95 ' Establecemos un nuevo valor para Escala
DistanciaReferencia(Doc, oShape, Distancia) ' Llamada a la función de medición
oText = doc.getText() ' Tomamos el control del texto del documento
oCursor = oText.createTextCursor() ' Creamos un cursor de texto
oCursor.gotoStart(False) ' Ponemos el cursor al inicio del texto
For i=1 to nPars-1 ' Ciclo para recorrer todos los párrafos
oCursor.gotoStartOfParagraph (False) ' Nos colocamos en el inicio del párrafo
oCursor.gotoEndOfParagraph (True) ' Vamos al final del párrafo, seleccionándolo
LineSpace = oCursor.paralinespacing ' Toma el control del interlineado
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
oCursor.gotoNextParagraph(True) ' Vamos al siguiente párrafo
paginas3=doc.getCurrentController().getPropertyValue("PageCount") ' Número de páginas
DistanciaReferencia(Doc, oShape, Distancia) ' Llamamos a la función de medición
if paginas3=paginas Then Exit Function ' Si hemos igualado las páginas, entonces salimos
next ' Procesamos el siguiente párrafo
End Function
Function ObjetoDibujo(Doc, Escala)
oDrawPage = Doc.DrawPage ' Página de dibujo
Dim objSize as New com.sun.star.awt.Size ' Control del tamaño de la forma
Dim Point As New com.sun.star.awt.Point
For i = 0 to oDrawPage.Count - 1 ' Recorremos todas los elementos de dibujo del documento
oShape = oDrawPage.getByIndex(i) ' Elemento de dibujo a inspeccionar en este momento
if oShape.name <>"" and oShape.name <>"Auxiliar" and oShape.name <>"Imaxe13" and oShape.name <>"Imaxe14" and oShape.name <>"Imaxe15"Then ' Si la forma tiene nombre
if not (oShape.supportsService("com.sun.star.text.TextGraphicObject"))Then
oText= oShape.getText() ' Texto dentro de la forma
oCurs = oText.createTextCursor () ' Cursor de texto
oCurs.gotoStart (false) ' Vamos al principio del texto
oCurs.gotoEnd (True) ' Vamos al final del texto y lo seleccionamos
oCurs.CharHeight =oCurs.CharHeight*Escala ' Nuevo tamaño de letra
LineSpace = oCurs.paralinespacing ' Toma el control del interlineado
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se modifica según la escala
oCurs.paralinespacing = LineSpace ' Se aplica el interlineado
Objsize.Width = oShape.Size.Width ' Nueva anchura de la forma
Objsize.Height = oShape.Size.Height*(Escala) ' Nueva altura de la forma
oShape.setSize(Objsize) ' Se aplica el tamaño de la forma
End if
if oShape.supportsService("com.sun.star.text.TextGraphicObject")Then ' Si es una imagen
Objsize.Width = oShape.Size.Width*(Escala) ' Nueva anchura de la forma
Objsize.Height = oShape.Size.Height*(Escala) ' Nueva altura de la forma
oShape.setSize(Objsize) ' Se aplica el tamaño de la forma
End if
End if ' Acabamos con la condición de que la forma no tenga nombre
Next ' Vamos a la siguiente forma
End Function
Function Recuperacion (Doc,Copia)
Resultado= Msgbox ("Se vostede está conforme co resultado, prema no botón 'Si' e este cadro de diálogo pechará" & Chr(13) & "Se vostede non está conforme co resultado, prema no botón 'No', e aparecerá un cadro de diálogo para recuperar a versión orixinal", 48+3,"OOO")
If Resultado= 7 Then ' Botón 'NO'
dim document as object
dim dispatcher as object
document = Doc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "VersionComment"
args1(0).Value = ""
dispatcher.executeDispatch(document, ".uno:VersionDialog", "", 0, args1())
'dispatcher.executeDispatch(document, ".uno:Save", "", 0, args1())
' Doc.Dispose()
End if
End Function
Global Copia
Function Tabla (Doc, Escala) ' Maneja tablas de texto simples y complejas, con todos los caracteres de la misma altura o no.
NTexttable = Doc.Texttables().GetCount() ' Contamos las tablas que hay
For z=0 to NTexttable-1 ' Ciclo que recorre las tablas
oTexttable = Doc.Texttables(z) ' Tabla que toca en ese momento del ciclo
Filas= oTexttable.rows.count-1 ' Filas que tiene la tabla
Columnas= oTexttable.Columns.count-1 ' Columnas de la tabla
oCursor = oTexttable.createCursorByCellName("A1") ' Cursor de tabla en la primera celda
oCursor.goToEnd (True) ' Ponemos el cursor al final
'-------------------------------------------------------
' Chequeamos si algún elemento de texto tiene una altura diferente dentro de toda la tabla
if Cint(oCursor.charheight)=0 Then ' Si algún elemento de texto tiene una altura diferente
oCursor = oTexttable.createCursorByCellName("A1") ' Creamos de nuevo el curosr en la primera celda
Do ' Iniciamos un ciclo que recorre cada celda
oCursor.getRangeName ' Nombre de la celda
oCell = oTextTable.getCellByName(oCursor.getRangeName) ' Nos ponemos en la celda que cumple las condiciones
oText = oCell.Text ' Texto en el interior de la celda
oCurs = oText.createTextCursor() ' Generamos un cursor de texto
oCurs.gotoEND(True) ' Vamos hasta el final del texto, indicando que las acciones se aplican a todo el texto de la celda
'-------------------------------------------------------
' Chequeamos si algún carácter tiene una altura diferente del resto de la celda (caso no frecuente)
if Cint(oCurs.CharHeight)=0 Then ' Si alguna letra es de diferente tamaño que el resto de la celda
for a=0 to (len (oCurs.String)-1) ' Iniciamos ciclo recorriendo cada carácter de la celda
oCurs.gotoStart (False) ' Vamos al inicio del texto
oCurs.goRight(a,False) ' Nos movemos tantos lugares a la derecha como letras se cuentan en ese momento
oCurs.goRight(1,True) ' Vamos al siguiente carácter
oCurs.CharHeight = oCurs.CharHeight*(Escala) ' Variamos la altura de la letra
next ' Retomamos el ciclo de caracteres
Else ' En caso de que todos los caracteres de la celda tengan la misma altura
oCurs.CharHeight= oCurs.CharHeight*(Escala) ' Variamos la altura de la letra
LineSpace = oCurs.paralinespacing ' Toma el control del interlineado
If Escala>1 and LineSpace.Height<140 Then ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCurs.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
If Escala<1 and LineSpace.Height>110 Then ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCurs.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
End if ' Acabamos la condición de que algún elemento de toda la tabla tenga algún carácter de distinta altura
Loop While oCursor.goRight(1,False) ' Reiniciamos el ciclo hasta la última celda
Else ' Si todos los caracteres de la tabla son iguales
oCursor.CharHeight= oCursor.CharHeight*(Escala) ' Modificamos la altura de los caracteres
LineSpace = oCursor.paralinespacing ' Toma el control del interlineado
If Escala>1 and LineSpace.Height<140 Then ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
If Escala<1 and LineSpace.Height>110 Then ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
LineSpace.height = LineSpace.height*(Escala) ' Interlineado se disminuye según la escala
oCursor.paralinespacing = LineSpace ' Se aplica el interlineado
End if ' Se acaba la condición de interlineado
End if ' Acabamos la condición de la altura de los caractéres de toda la tabla
For i=0 To Filas
oRow = oTexttable.rows(i)
oRow.height=oRow.Height*(Escala)
Next
next z ' Acaba el ciclo de las tablas
End Function
Function HacerVersion (Doc)
dim document as object
dim dispatcher as object
document = Doc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "VersionComment"
args1(0).Value = ""
dispatcher.executeDispatch(document, ".uno:Save", "", 0, args1())
End Function
Function RecuperarVersion(Doc)
dim document as object
dim dispatcher as object
document = Doc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "VersionComment"
args1(0).Value = ""
args1(1).Name = "Flags"
args1(1).Value = 10
dispatcher.executeDispatch(document, ".uno:VersionDialog", "", 0, args1())
'dispatcher.executeDispatch(document, ".uno:VersionVisible", "", 0, args1())
End Function
Como ves, un poco largo..., pero en general funciona bien, excepto con imágenes o marcos, que necesitan algún arreglillo y esto de la recuperación del texto original.
Gracias por leerme, a pesar de tener tanto rollo!