A menudo oculto filas o columnas, para tener una visión más sencilla del conjunto de mis datos. No los filtro. Los oculto. La visibilidad es una propiedad diferente a la del filtrado, aunque en ambos casos algunas celdas quedan fuera de la vista. En estas circunstancias, quiero copiar celdas de un intervalo con ciertas columnas ocultas y pegar los valores en otro intervalos con otras celdas ocultas: eso sí, los datos en el mismo orden, obviamente.
Con Calc, nativamente, no es posible realizar esa operación. No he encontrado una extensión que al día de hoy funcione y lo haga correctamente. Así que acudí a la gran ayuda de EasyMacro (easymacro.cuates.net), un entorno que simplifica la programación de macros para llevar a cabo la tarea. Ya he hablado de este en otra ocasión, así que le conmino a leer cómo instalarlo y aprender a usarlo.
Antes que nada, muchas gracias a ElMau por su apoyo invaluable, tanto por la elaboración de este gran entorno EasyMacro, como por su retroalimentación para definir el script de Python.
También puede usted tratar de hacer la macro siguiente en BASIC y, muy probablemente, con ScriptForge, otro entorno alternativo que también recomiendo usar. Aunque en este caso particular, yo lo resolví con Python y EasyMacro. Para mi solución y caso particular, el destino es inmutable; es decir, siempre pegaré los diferentes intervalos que copio al final del mismo intervalo destino, que en mi caso usa la celda K18 como indicador del intervalo destino.
El script para pegar un intervalo con filas ocultas es diferente del de columnas ocultas. Comparto ambos:
import easymacro as app
def pasteToColsVisibles():
doc = app.active
sheet = doc.active
fuente = doc.selection.current_region.visible_cells
destino = sheet['K18'].next_free
for rango in fuente:
for i in range(rango.len_columns):
rango[:,i].copy(destino)
while True:
destino = destino.offset()
if destino.columns.visible:
break
return
def pasteToRowsVisibles():
doc = app.active
sheet = doc.active
fuente = doc.selection.current_region.visible_cells
destino = sheet['K18'].next_free
for rango in fuente:
for i in range(rango.len_columns):
rango[:,i].copy(destino)
while True:
destino = destino.offset()
if destino.columns.visible:
break
return
Solo por si acaso se descompone la indentación, comparto la imagen para cotejarla. También agrego el archivo ODS que usé para pruebas.
[ODS]-copy-ONLY-to-visible-cells
El script necesita que el cursor esté posado en una celda dentro del intervalo fuente, sin necesidad de seleccionarlo (de eso se encarga la instrucción ««fuente = doc.selection.current_region.visible_cells««). El intervalo fuente puede tener tantas columnas ocultas se desee, sin necesariamente estar contiguas. Solo debe cumplir la regla de ser un intervalo; es decir no debe contener filas ni columnas vacías. El intervalo destino debe prefijarse con anterioridad a la ejecución; en mi caso y como ya mencioné arriba, usé la celda K18, que también forma parte de un intervalo con diferentes columnas ocultas.
Las siguientes imágenes muestran el antes y después de la copia y pega. Los puntitos azules entre columnas indican que hay columnas ocultas.



