El jue, 18-06-2009 a las 08:34 -0500, Mauricio Baeza escribió: > Antonio Martinez escribió: > > Buscando por ahi encontre una posible solucion que todavia no he > > implementad > Parece ser que no viste mi respuesta, la vuelvo a enviar... > > Hola Antonio... > Hola a todos... > > Para conocer, tanto el "rango actual" de datos, como el "área de > usuario", que como sabes, son dos cosas diferentes, tienes que hacer uso > de un "cursor", de la siguiente manera: > > Primero; ¿que es un cursor? (copio de mis apuntes): Un cursor, es un > objeto que nos permite movernos por la hoja entera o dentro de un rango > especificado sin afectar o modificar al rango a partir del cual se crea. > Lo más usual es crearlo a partir de un rango para desplazarse dentro de > el, pero además tiene métodos muy útiles para expandir por ejemplo a la > región actual, que como sabes, es el rango de celdas “con datos” > delimitado por filas y columnas en blanco, la región actual es un > concepto sumamente, útil y poderoso cuando se programa... > > Los siguiente ejemplos, hacen uso de la siguiente función personalizada > para conocer el rango de datos pasado como argumento: > > Function DireccionRango(Rango As Object) As String > Dim sTmp As String > > Select Case Rango.getImplementationName() > Case "ScCellObj" > sTmp = Rango.getSpreadsheet.getName() & "." & _ > Rango.getColumns().getByIndex(0).getName() & _ > Rango.getCellAddress.Row + 1 > Case "ScCellRangeObj", "ScCellCursorObj" > sTmp = Rango.getSpreadsheet.getName() & "." & _ > Rango.getColumns().getByIndex(0).getName() & _ > Rango.getRangeAddress.StartRow + 1 & ":" & _ > Rango.getColumns().getByIndex(Rango.getColumns().getCount()-1).getName() & _ > Rango.getRangeAddress.EndRow + 1 > Case "ScCellRangesObj" > sTmp = Join( Split(Rango.getRangeAddressesAsString(),";"),Chr(13) ) > End Select > DireccionRango = sTmp > > End Function > > > En el siguiente ejemplo, creamos un cursor a partir de la celda actual y > obtenemos diversa información de el: > > Sub Cursores1() > Dim oSel As Object > Dim oCursor As Object > > 'Partimos de la seleccion > oSel = ThisComponent.getCurrentSelection() > 'Solo si es una sola celda > If oSel.getImplementationName() = "ScCellObj" Then > 'Mostramos la direccion de la celda seleccionada > MsgBox DireccionRango( oSel ) > > 'Creamos un cursor a partir de esta celda > oCursor = oSel.getSpreadSheet().createCursorByRange( oSel ) > 'Verificamos que apunten a la misma celda > MsgBox DireccionRango( oCursor ) > > 'Nos movemos al inicio de la region actual > oCursor.gotoStart() > MsgBox DireccionRango( oCursor ) > > 'Nos movemos al final > oCursor.gotoEnd() > MsgBox DireccionRango( oCursor ) > > 'Expandismo el cursor a toda la region actual > oCursor.collapseToCurrentRegion() > MsgBox DireccionRango( oCursor ) > > 'Mostramos de nuevo la direccion de la celda seleccionada > 'observa que esta no se a movido > MsgBox DireccionRango( oSel ) > Else > MsgBox "Selecciona solo una celda" > End If > End Sub > > > En una hoja de calculo, el “área de usuario”, es aquel rango > “efectivamente” usado, es muy dinámico pues varia de acuerdo a su uso y > eliminación, en una hoja nueva el inicio y el final de esta área siempre > será el mismo, la celda A1, si tienes “una” sola celda usada, esta, será > el inicio y el fin de tu área de usuario, la cosa cambia en cuanto > tienes dos o más celdas usadas, la regla es: el inicio de tu área de > usuario será la celda (“con datos”) que este más cercana al extremo > superior izquierdo de la hoja y el final será la celda (“con datos”) que > este más cercana al extremo inferior derecho de dicha hoja, y digo que > es dinámica, por que si eliminas datos o celdas, esta área se ira > ajustando conforme a estos cambios. > > Sub Cursores13() > Dim oSel As Object > Dim oCursor As Object > > oSel = ThisComponent.getCurrentSelection() > If oSel.getImplementationName() = "ScCellObj" Then > > oCursor = oSel.getSpreadSheet().createCursorByRange( oSel ) > > 'Vamos al inicio del area usada, el argumento False, evita que se > 'expanda la selección del rango > oCursor.gotoStartOfUsedArea( False ) > MsgBox DireccionRango( oCursor ) > > 'Ahora vamos al final > oCursor.gotoEndOfUsedArea( False ) > MsgBox DireccionRango( oCursor ) > > Else > MsgBox "Selecciona solo una celda" > End If > End Sub > > > Saludos a todos... > > Mauricio
Buen aporte, gracias. -- Saludos, Mauricio J. Adonis C. ---------------------------------------------------------------------------- Usuario Linux # 482032 Usuario Ubuntu # 25554 Ubuntu Code of Conduct - 1.0.1 signatario (FD9329AC66C0907805831BF8E8D0B29A3AE3D244) ----------------------------------------------------------------------------
signature.asc
Description: Esto es una parte de mensaje firmado digitalmente
