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