macro con rango dinamico

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
jhonfredy
Mensajes: 47
Registrado: Vie Abr 08, 2016 6:50 pm

macro con rango dinamico

Mensaje por jhonfredy »

Buena tarde, tengo una macro que copia los valores filtrados de acuerdo al criterio seleccionado. En el código tengo un rango establecido desde el cual se copian los datos. Tal y como está funciona bien (A1:X300). Resulta que en el archivo del que filtro los datos, algunas veces adiciono columnas o filas y debo modificar ese rango con el fin que el filtro quede bien realizado.

Para solucionar el tema de estar modificando ese rango, use la formula: DESREF($A$1;0;0;CONTARA($A:$A);CONTARA($1:$1)) y la introduje en la línea 143 del código así:

Como está actualmente:
oRange = oSheet.GetCellRangeByName("A1:X300")

Como quedaría:
oRange = oSheet.GetCellRangeByName.Formula = "=DESREF($A$1;0;0;CONTARA($A:$A);CONTARA($1:$1))"

Pero al ejecutar se genera un error.

PD: En la función DESREF no incluí internamente Hoja3! debido a que mes a mes debo ir agregando hojas

Alguien me puede decir de que manera puedo hacer esto?

Muchas gracias
Adjuntos
Cuadro_de_dialogo_Calc.ods
(30.83 KiB) Descargado 170 veces
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: macro con rango dinamico

Mensaje por mauricio »

Por favor, asegura te publicar tu pregunta en el foro correcto, he movido este tema desde el foro incorrecto.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: macro con rango dinamico

Mensaje por PepeOooSevilla »

Hola.
Prueba modificando .Formula por .FormulaLocal.
Saludos cordiales.
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
jhonfredy
Mensajes: 47
Registrado: Vie Abr 08, 2016 6:50 pm

Re: macro con rango dinamico

Mensaje por jhonfredy »

Buena tarde,

Coloque la modificación que sugiere el señor PepeOooSevilla pero sale el siguiente error:

Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.lang.IllegalArgumentException
Message: expected 1 arguments, got 0.

La linea quedo así:
oRange = oSheet.GetCellRangeByName.FormulaLocal =("=DESREF($A$1;0;0;CONTARA($A:$A);CONTARA($1:$1))")

El mismo error sale si quito los paréntesis que van después del igual

Quedo pendiente.

Gracias
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: macro con rango dinamico

Mensaje por mauricio »

Eso es incorrecto:

Código: Seleccionar todo

oSheet.GetCellRangeByName.FormulaLocal 
Debes de usarlo como en tu primer mensaje:

Código: Seleccionar todo

oRange = oSheet.GetCellRangeByName("A1:X300")
entonces si:

Código: Seleccionar todo

oRange.FormulaLocal = TU_FORMULA
pero... si, tu_formula esta mal, tampoco funcionará

En general, es mejor usar solo Formula y usar en el código los nombres de las funciones en ingles.

pero... viendo lo que tienes en la Hoja2 donde aplicas algo de esto, esa hoja esta bastante mal estructurada, solo mira los encabezados.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
jhonfredy
Mensajes: 47
Registrado: Vie Abr 08, 2016 6:50 pm

Re: macro con rango dinamico

Mensaje por jhonfredy »

Buen dia don Mauricio

Debes de usarlo como en tu primer mensaje:
CÓDIGO: SELECCIONAR TODO EXPANDIR VISTA
oRange = oSheet.GetCellRangeByName("A1:X300")

Si uso esto, de acuerdo con lo que comenta, no hago nada pues al modificar algo que no abarque el rango, el filtro no me lo va a tomar y tendria que seguir haciendo las modificaciones manuales.

entonces si:
CÓDIGO: SELECCIONAR TODO EXPANDIR VISTA
oRange.FormulaLocal =("=OFFSET($A$1;0;0;COUNTA($A:$A);COUNTA($1:$1))")

Y con respecto a esto, solo use esta línea y no incluí lo sugerido inicialmente: oRange = oSheet.GetCellRangeByName("A1:X300")
Pero al usar oRange.FormulaLocal =("=OFFSET($A$1;0;0;COUNTA($A:$A);COUNTA($1:$1))") sale este error en esta linea:

Error de ejecución de BASIC.
Variable de objeto no establecida.

En ese sentido, declare estas variables
Dim FormulaLocal As Object
Dim OFFSET As Object
Dim COUNTA As Object

Alguien me puede ayudar con esto?
Adjuntos
Cuadro_de_dialogo_Calc.ods
(24.51 KiB) Descargado 140 veces
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: macro con rango dinamico

Mensaje por mauricio »

Mi recomendación general es que si, hagas pruebas, pero con la documentación en la mano, declarar esas variables es erróneo, casi todo lo que quieres lo he documentado:
https://wiki.openoffice.org/wiki/ES/Man ... ndoConCalc
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
jhonfredy
Mensajes: 47
Registrado: Vie Abr 08, 2016 6:50 pm

Re: macro con rango dinamico

Mensaje por jhonfredy »

Buena tarde,

Estuve leyendo la documentación que refiere don Mauricio, pero no logro identificar que variable debo declarar en esta línea, la cual está presentando el error:

oRange.FormulaLocal ="=DESREF($A$1;0;0;CONTARA($A:$A);CONTARA($1:$1))"

El código completo es el siguiente:

Sub FiltroGuias()
Dim oDocument As Object
Dim oSheet As Object
Dim oRange As Object
Dim oSheet2 As Object
Dim oCrite As Object
Dim Salida As New com.sun.star.table.CellAddress
Dim Generar As Object
oDocument = ThisComponent
oSheet = oDocument.Sheets(0)
oRange.FormulaLocal ="=DESREF($A$1;0;0;CONTARA($A:$A);CONTARA($1:$1))"

oSheet2 = oDocument.Sheets(1)
oCrite = oSheet2.GetCellRangeByName("A1:X6")
With Salida
.Sheet = 1
.Column = 0
.Row = 12
End With
Generar = oCrite.CreateFilterDescriptorByObject(oRange)
Generar.CopyOutputData = True
Generar.OutputPosition = Salida
Generar.UseRegularExpressions = True
oRange.Filter(Generar)

Call descombinar

End Sub

Agradezco si alguien me colabora identificando el error. A manera de retroalimentación, lo que busco es que el rango de datos a analizar sea dinámico. Actualmente, en lugar de la línea:
oRange.FormulaLocal ="=DESREF($A$1;0;0;CONTARA($A:$A);CONTARA($1:$1))"
Tengo la línea:
oRange = oSheet.GetCellRangeByName("A1:X300")

Al ejecutar la macro no me genera error con el rango fijo. Pero con este rango, si adiciono alguna fila o columna, algunos valores se van a quedar sin ser analizados y por eso debo modificarlo manualmente.

PD: En la documentación leí que al usar FormulaLocal puedo introducir la fórmula utilizando el nombre de la función en nuestro idioma.

Adjunto el archivo con la línea de rango fijo para que vean que funciona como la tengo actualmente.

Quedo pendiente, muchas gracias
Adjuntos
Cuadro_de_dialogo_Calc.ods
(22.19 KiB) Descargado 149 veces
OpenOffice 3.1 en Windows Vista
Responder