Página 1 de 1

macro con rango dinamico

Publicado: Vie Dic 13, 2019 9:57 pm
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

Re: macro con rango dinamico

Publicado: Sab Dic 14, 2019 10:14 pm
por mauricio
Por favor, asegura te publicar tu pregunta en el foro correcto, he movido este tema desde el foro incorrecto.

Re: macro con rango dinamico

Publicado: Dom Dic 15, 2019 10:56 pm
por PepeOooSevilla
Hola.
Prueba modificando .Formula por .FormulaLocal.
Saludos cordiales.

Re: macro con rango dinamico

Publicado: Lun Dic 16, 2019 10:02 pm
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

Re: macro con rango dinamico

Publicado: Lun Dic 16, 2019 11:13 pm
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.

Re: macro con rango dinamico

Publicado: Mar Dic 17, 2019 4:08 pm
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?

Re: macro con rango dinamico

Publicado: Mar Dic 17, 2019 5:07 pm
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

Re: macro con rango dinamico

Publicado: Sab Dic 21, 2019 6:26 pm
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