Calc no cuenta (no conozco), una herramienta para seleccionar solo las celdas visibles, pero es trivial implementar una macro que lo haga, por ejemplo:
Código: Seleccionar todo
Sub SeleccionarSoloCeldasVisibles()
Dim oSel As Object
Dim oCursor As Object
Dim oVisibles As Object
'Obtenemos la selección
oSel = ThisComponent.getCurrentSelection()
'Si es una sola celda
If oSel.getImplementationName = "ScCellObj" Then
'Creamos un cursor
oCursor = oSel.getSpreadSheet.createCursorByRange( oSel )
'Expandimos el cursor a la region actual
oCursor.collapseToCurrentRegion()
'Dejamos solo las celdas visibles
oVisibles = oCursor.queryVisibleCells()
If oVisibles.getCount = 0 Then
MsgBox "No hay celdas ocultas"
Else
'Si hay las seleccionamos
ThisComponent.getCurrentController.select( oVisibles )
End If
End If
End Sub
Posicionen su cursor en "solo una" celda del rango con celdas ocultas, la macro expandirá el rango a la región actual y seleccionará solo las celdas visibles, si las hay. Pero, dicen que siempre hay un pero, intenten copiar la selección, les mostrará un "horrible" mensaje de que no se puede, así que, volvemos a hacer uso de OOo Basic para que nos ayude. Para copiar un rango en otro lado, usamos el método copyRange de la siguiente manera:
Código: Seleccionar todo
Sub CopiarRangos1()
Dim oHojaActiva As Object
Dim oOrigen As Object
Dim oDestino As Object
oHojaActiva = ThisComponent.getCurrentController().getActiveSheet()
'Rango a copiar
oOrigen = oHojaActiva.getCellRangeByName( "A1:B3" )
'Celda destino
oDestino = oHojaActiva.getCellRangeByName( "D10" )
'Copiamos el rango
oHojaActiva.copyRange( oDestino.getCellAddress(), oOrigen.getRangeAddress() )
End Sub
Pero, otra vez el pero, el método queryVisibleCells, siempre nos devuelve un conjunto de rangos de celdas, por lo que tenemos que "iterar" entre ellos y copiar cada rango del conjunto, para conocer un poco del manejo de rangos de celdas, les copio parte de mis apuntes:
Cuando en la interfaz del usuario, hacemos la selección de un rango y mantenemos presionada la tecla Ctrl y hacemos un segunda selección de un rango y así sucesivamente, estamos hablando de un conjunto de rangos que tiene sus características particulares para su control y manejo. Para seleccionar varios rangos desde código, primero debemos crear el “contenedor” de estos rangos, veamos como:
Código: Seleccionar todo
Sub Acceso_A_Rangos1()
Dim oHojaActiva As Object
Dim oRangos As Object
Dim oRango As Object
Dim oDirRango As Object
oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
'Creamos el contender para los rangos
oRangos = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
'Creamos la estructura CellRangeAddress necesaria
oDirRango = oHojaActiva.getCellRangeByName( "A1:B2" ).getRangeAddress()
'Y lo agregamos al contenedor de rangos
oRangos.addRangeAddress( oDirRango ,False )
'Aquí solo hacemos referencia al rango
oRango = oHojaActiva.getCellRangeByName( "E1:G2" )
'Y lo agregamos al contenedor de rangos, nota como tenemos que usar
'el método getRangeAddress para pasarle el argumento correcto
oRangos.addRangeAddress( oRango.getRangeAddress() ,False )
'Aquí agregamos un rango directamente al contenedor
'toma en cuenta que se van acumulando
oRangos.addRangeAddress( oHojaActiva.getCellRangeByName( "D4:E5" ).getRangeAddress() ,False )
'Comprobamos que están correctos seleccionándolos
ThisComponent.getCurrentController.select(oRangos)
End Sub
No te confundas, los tres líneas donde se agrega el rango con el método addRangeAddress() son iguales, lo que cambia es la forma en que hacemos referencia a la dirección del rango, si vas empezando a programar, te recomiendo ir desglosando cada línea, con el tiempo y la experiencia, podrás concentrar código de forma más natural, por ahora, usa todas las líneas que consideres pertinentes para que tu código lo entiendas con solo verlo.
Por supuesto, también de estos rangos podemos obtener información, por ejemplo, los nombres de los rangos que contiene:
Código: Seleccionar todo
Sub Acceso_A_Rangos2()
Dim oHojaActiva As Object
Dim oRangos As Object
oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
'Creamos el contender para los rangos
oRangos = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
'Agregamos los rangos que queramos
oRangos.addRangeAddress( oHojaActiva.getCellRangeByName( "A1:A2" ).getRangeAddress() ,False )
oRangos.addRangeAddress( oHojaActiva.getCellRangeByName( "B4:B5" ).getRangeAddress() ,False )
oRangos.addRangeAddress( oHojaActiva.getCellRangeByName( "C7:C8" ).getRangeAddress() ,False )
oRangos.addRangeAddress( oHojaActiva.getCellRangeByName( "D10:D11" ).getRangeAddress() ,False )
oRangos.addRangeAddress( oHojaActiva.getCellRangeByName( "E13:E14" ).getRangeAddress() ,False )
'Mostramos las direcciones de los rangos
MsgBox oRangos.getRangeAddressesAsString()
End Sub
Para finalizar, solo resta poner a trabajar estos tres nuevos conocimientos para lograr copiar las celdas visibles de un conjunto de rangos, pero, esa es su tarea...
Saludos a todos...
Mauricio