[RESUELTO] "Var. obj. no establecida" con más de 20 objetos

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
ifanlo
Mensajes: 420
Registrado: Lun Mar 30, 2009 10:32 am

[RESUELTO] "Var. obj. no establecida" con más de 20 objetos

Mensaje por ifanlo »

Hola!

Editado: Antes de enviar, encontré la solución, pero lo publico porque puede ser de interés para alguien.

De alguna manera, esto es una continuación del tema expuesto en https://forum.openoffice.org/es/forum/v ... 50&t=10609 y que pude cerrar gracias a la sugerencia de FJCC-ES.

Al ejecutar una variante del código sugerido para resolver mi necesidad de acceder a objetos de texto incrustados en hoja de cálculo, me he encontrado con un error de "Variable de objeto no establecida", pero con un comportamiento muy aleatorio.

Me ha vuelto tan loco que no sabía si cortarme las venas o dejármelas crecer. :crazy:

Finalmente, me ha parecido encontrar la causa. Hasta 20 objetos incrustados funciona bien, pero cuando hay más de 20, peta. Para descartar que fuese por el número de hojas, también he ensayado poniendo los objetos en una sola hoja y se ha confirmado el error cuando hay 21.

El código utilizado es el siguiente

Código: Seleccionar todo

Sub EjemploForo
Dim oSheets As Object 
Dim oSheet As Object
Dim oDP As object
Dim oObj As Object
Dim oEmbObj As Object
Dim Comp As Object
Dim StyleFam As Object
Dim oPageStyles As Object 
Dim oStd As Object
Dim i As Integer
Dim j As Integer
Dim contador As Integer
	
	contador = 0
	oSheets = ThisComponent.Sheets
	For i = 0 To oSheets.getCount() - 1 
		oSheet = oSheets(i)
		oDP = oSheet.getDrawPage()
		for j = 0 to oDP.Count - 1
			oObj = oDP.getByIndex(j)
			' Selecciona objeto.  QUITAR TRAS LA DEPURACIÓN
			ThisComponent.getCurrentController.select( oObj ) 'quitar tras depuración
	 	   	If oObj.supportsService("com.sun.star.drawing.OLE2Shape") Then
		      	oEmbObj = oObj.EmbeddedObject
		      	Comp  = oEmbObj.getComponent()
		      	If Comp.supportsService("com.sun.star.text.TextDocument") then
		         	StyleFam = Comp.StyleFamilies
		         	oPageStyles = StyleFam.getByName("PageStyles")
		         	oStd = oPageStyles.getByName("Standard")
		         	oStd.LeftMargin = 0
			        oStd.RightMargin = 0
		         	oStd.TopMargin = 0
		         	oStd.Width = oObj.VisibleArea.Width
		         	contador = contador + 1
		      	End If
		   	End If
		Next j
	Next i
	msgbox "Procesados " & contador & " objetos de texto incrustados."
End sub
El error lo da la línea:

Código: Seleccionar todo

      If Comp.supportsService("com.sun.star.text.TextDocument") then
Rastreando las variables antes de ejecutar esta línea, me encuentro con que la variable oEmbObj dispone de una propiedad Component que es un SwXTextDocument.

Cuando funciona bien, la variable Comp, de tipo SwXTextDocument.

Cuando no funciona, esta variable Comp aparece como Null.

Entonces la cuestión es entender porqué ocurre ésto, además de que es insólito que el error "Variable de objeto no establecida" dependa del número de objetos en la hoja.

Gracias,
Última edición por mauricio el Vie Feb 06, 2015 11:39 pm, editado 1 vez en total.
Razón: Marcar icono de resuelto.
Ismael Fanlo

*ifanlo - soluciones libres* http://ifanlo.com
- Consultoría en migraciones a software libre
- Soporte ofimático online
- E-learning
- Formación informática presencial
Avatar de Usuario
ifanlo
Mensajes: 420
Registrado: Lun Mar 30, 2009 10:32 am

Re: [RESUELTO] "Var. obj. no establecida" con más de 20 obje

Mensaje por ifanlo »

Llegó la inspiración justo antes de darle al "enviar".

El número 20 me brincaba por la cabeza. Entonces, fui a Herramientas > Opciones > LibreOffice > Memoria, y en el apartado de "Caché para los objetos insertados" que estaba en 20, lo subí a 50.

Tras reiniciar, todo funcionó.

Si el error hubiese estado mejor definido "Número de objetos por encima del límite establecido" o algo así, creo que hubiese pensado antes en ello, pero ese "Variable de objeto no establecida" me llevó por tortuosos caminos.

Espero que la experiencia le sirva a alguien más.
Ismael Fanlo

*ifanlo - soluciones libres* http://ifanlo.com
- Consultoría en migraciones a software libre
- Soporte ofimático online
- E-learning
- Formación informática presencial
Responder