Hola.
Soy recién llegado al foro. He estado buscando algún hilo relacionado con mi problema y no he encontrado.
Quiero hacer una macro para Math que sustituya automáticamente un carácter por otro en todas las fórmulas de un documento de Writer, ya que son documentos muy largos y con muchas fórmulas. He encontrado algo similar para cambiar las propiedades de todas las fórmulas de Math en un documento y me funciona bien, así que he grabado una macro reemplazando caracteres en Writer (no en Math) para mezclarlas y conseguir lo que quiero.
La macro para sustituir en Writer es ésta:
sub Masbonito2
dim document as object
dim dispatcher as object
dim args1(21) as new com.sun.star.beans.PropertyValue
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.SearchFiltered"
args1(4).Value = false
args1(5).Name = "SearchItem.Backward"
args1(5).Value = false
args1(6).Name = "SearchItem.Pattern"
args1(6).Value = false
args1(7).Name = "SearchItem.Content"
args1(7).Value = false
args1(8).Name = "SearchItem.AsianOptions"
args1(8).Value = false
args1(9).Name = "SearchItem.AlgorithmType"
args1(9).Value = 0
args1(10).Name = "SearchItem.SearchFlags"
args1(10).Value = 65536
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = "+"
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = " %m "
args1(13).Name = "SearchItem.Locale"
args1(13).Value = 255
args1(14).Name = "SearchItem.ChangedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.DeletedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.InsertedChars"
args1(16).Value = 2
args1(17).Name = "SearchItem.TransliterateFlags"
args1(17).Value = 1073742848
args1(18).Name = "SearchItem.Command"
args1(18).Value = 3
args1(19).Name = "SearchItem.SearchFormatted"
args1(19).Value = false
args1(20).Name = "SearchItem.AlgorithmType2"
args1(20).Value = 1
args1(21).Name = "Quiet"
args1(21).Value = true
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
end sub
La mezcla con la macro que me funciona en Math no es mucho más larga y el problema está en que no encuentro un objeto sobre el que ejecutar el comando executeDispatch del final. Pongo aquí la macro que me da problemas:
Sub MasBonito()
'Cambiar el carácter + normal por el bonito
Dim listaDeObjetosEmbebidos As Object
Dim listaDeNombres() As String
Dim cadaObjeto As Object
Dim contenidoFormula As Object ' el texto de la fórmula
Dim i as integer
Dim cambiador as Object
dim args1(21) as new com.sun.star.beans.PropertyValue
listaDeObjetosEmbebidos = ThisComponent.getEmbeddedObjects()
listaDeNombres = listaDeObjetosEmbebidos.getElementNames()
cambiador=createUnoService("com.sun.star.frame.DispatchHelper")
For i = 0 To UBound(listaDeNombres)
cadaObjeto = listaDeObjetosEmbebidos.getByName(listaDeNombres(i)).Model 'cada objeto
If (not isNull(cadaObjeto)) Then
With cadaObjeto
If .supportsService("com.sun.star.formula.FormulaProperties") Then 'si es una fórmula
contenidoFormula = listaDeObjetosEmbebidos.getByName(listaDeNombres(i)).EmbeddedObject
contenidoFormula.updateMode = com.sun.star.embed.EmbedUpdateModes.ALWAYS_UPDATE
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.SearchFiltered"
args1(4).Value = false
args1(5).Name = "SearchItem.Backward"
args1(5).Value = false
args1(6).Name = "SearchItem.Pattern"
args1(6).Value = false
args1(7).Name = "SearchItem.Content"
args1(7).Value = false
args1(8).Name = "SearchItem.AsianOptions"
args1(8).Value = false
args1(9).Name = "SearchItem.AlgorithmType"
args1(9).Value = 0
args1(10).Name = "SearchItem.SearchFlags"
args1(10).Value = 65536
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = "+"
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = " %m "
args1(13).Name = "SearchItem.Locale"
args1(13).Value = 255
args1(14).Name = "SearchItem.ChangedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.DeletedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.InsertedChars"
args1(16).Value = 2
args1(17).Name = "SearchItem.TransliterateFlags"
args1(17).Value = 1073742848
args1(18).Name = "SearchItem.Command"
args1(18).Value = 3
args1(19).Name = "SearchItem.SearchFormatted"
args1(19).Value = false
args1(20).Name = "SearchItem.AlgorithmType2"
args1(20).Value = 1
args1(21).Name = "Quiet"
args1(21).Value = true
cambiador.executeDispatch(cadaObjeto, ".uno:ExecuteSearch", "", 0, args1())
End If
End With
End If
Next i
ThisComponent.reformat()
End Sub
El problema lo tengo en la línea cambiador.executeDispatch(cadaObjeto, “.uno:ExecuteSearch”, “”, 0, args1()). El intérprete me dice esto:
Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.lang.IllegalArgumentException
Message: cannot coerce argument type during corereflection call:
arg no.: 0 expected: “com.sun.star.frame.XDispatchProvider” actual: “com.sun.star.frame.XModel”.
Algo así como que el objeto sobre el que pretendo ejecutar el despachador no es del tipo adecuado. Me pierdo del todo en la referencia de objetos.
¿Alguien puede ayudarme con esto?
Muchas gracias