[RESUELTO] Copiar formula de forma relativa

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
emoreno
Mensajes: 14
Registrado: Jue Feb 04, 2010 8:12 pm
Ubicación: México, D.F.

[RESUELTO] Copiar formula de forma relativa

Mensaje por emoreno »

Saludos:

El siguiente código sirve para copiar el contenido de una celda superior en caso de que este vacía. Se necesita tener un contenido en la celda a1 y algo mas en la celda a5, para que puedan apreciar su funcionamiento.

Código: Seleccionar todo


Dim i As Integer
Dim oHoja As Object, oCelda1 As Object, oCelda2 As Object
For i = 0 to 10
	oCelda1 = oHoja.getCellByPosition(0,i)
	oCelda2 = oHoja.getCellByPosition(0,i+1)
	If oCelda2.Type = 0 Then
		If oCelda1.Type = 1 Then
			oCelda2.Value = oCelda1.Value
		ElseIf oCelda1.Type = 2 Then
			oCelda2.String = oCelda1.String
		ElseIf oCelda1.Type = 3 Then
			oCelda2.Formula = oCelda1.Formula
		EndIf
	End If
Next i
Y casi funciona bien. Los valores y los textos se rellenan perfectamente, pero a la hora de copiar las fórmulas se hace eso exactamente, se copia la fórmula anterior.
Es decir, si en A1 escriben =B1+C1, en A2 aparece =B1+C1. Por supuesto, se necesita que copie formulas de forma relativa, es decir, que aparezca =B3+C2.

Espero haberme explicado. Tengo una solución que van a ser mas de 10 líneas de código. Siento que debe haber algo más sencillo para que no sea lento el proceso.
Última edición por emoreno el Jue May 13, 2010 10:34 pm, editado 1 vez en total.
J. Eduardo Moreno S.
México, D.F.
LibreOffice 3.6 (Windows y ALDOS Linux)
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Copiar formula de forma relativa

Mensaje por mauricio »

Hola...

No acabo de entender el ¿para que?, pero eso realmente no importa. Si tu haces:

Código: Seleccionar todo

         oCelda2.Formula = oCelda1.Formula 
Como ya notaste, copia la formula sin actualizar las referencias, es correcto, pues el parámetro es una cadena, analizar esta cadena es inviable entre más crece la complejidad de la formula a copiar, lo mejor es esto, copiar la celda con lo que te actualizara las referencias relativas que tenga la formula origen...

Código: Seleccionar todo

oHoja.copyRange( oCelda2.getCellAddress, oCelda1.getRangeAddress )	
Otra posibilidad es usar series, que también te actualiza las referencias...

Por favor, si esto responde tu pregunta, edita el primer mensaje de este hilo y agrega al principio del título la etiqueta [RESUELTO], de esta forma conseguiremos un foro más ordenado.


Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
emoreno
Mensajes: 14
Registrado: Jue Feb 04, 2010 8:12 pm
Ubicación: México, D.F.

Re: Copiar formula de forma relativa

Mensaje por emoreno »

Exacto, su uso copyRange() puedo hacerlo, y es la parte que me dio flojera porque es escribir bastantito.

La pregunta era para aumentar la eficacia de la extensión Rellenar Vacíos que acabo de publicar. Quería ver la posibilidad de mejorarla de uan forma rápida.

En la versión 2 agregaré el código necesario para que copie las fórmulas de forma relativa, pregunte si se quiere o no copiar los formatos y alguna otra monada.

Gracias.
J. Eduardo Moreno S.
México, D.F.
LibreOffice 3.6 (Windows y ALDOS Linux)
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Copiar formula de forma relativa

Mensaje por mauricio »

Hola...

Supongo que mejora en rapidez te refieres a que el código sea más rápido, ¿verdad?. Creo que no necesito mencionártelo pero lo ponemos en la mesa, la rapidez no esta determinada por el número de líneas si no por la "eficiencia" del algoritmo usado, y como sabes, código compilado siempre en mucho más rápido que código interpretado, por ello, "casi siempre", será mucho más rápido usar los métodos incorporados en el API que hacer nuestro propios algoritmos. No se que lógica estés usando para tu extensión, pero una posibilidad, en vez de recorrer todo el rango seleccionado, es encontrar las celdas vacías y rellenarlas (copiando o con serie) de acuerdo al patrón de la primera...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder