Hola Leonardo...
Hola a todos...
Primero lo primero, ¿que es lo que esta seleccionado?, uno podría pensar y
programar en consecuencia, que en una hoja de calculo "siempre" es una celda
o rango de celdas, pero no te fíes de los usuarios, prueba la siguiente
macro, teniendo seleccionado los siguientes elementos...
Una celda
Un rango de celdas
Varios rangos de celdas
Un objeto de dibujo
Cualquier otra cosa
Option Explicit
Sub Seleccion()
Dim oSeleccion As Object
'Obtenemos una referencia a la seleccion actual
Set oSeleccion = ThisComponent.getCurrentSelection()
'Obtenemos el tipo de seleccion
MsgBox oSeleccion.getImplementationName()
End Sub
Notaras como, dependiendo de tu selección, te da un nombre diferente, esto
es muy importante para actuar en consecuencia, vamos a lo importante, las
selecciones que nos interesan son:
Una celda = ScCellObj
Un rango de celdas = ScCellRangeObj
Varios rangos de celdas = ScCellRangesObj
Para obtener la fila de la "selección" actual usamos:
iFila = oSeleccion.getCellAddress().Row
OJO, el metodo getCellAddress solo esta implementado en el objeto ScCellObj,
es decir, si el usuario selecciona un rango de celdas o varios rango o
cualquier otra cosa, este metodo fallara, si quieres, "siempre" seleccionar
la primer celda, del primer rando que este seleccionado, usa el siguiente
código:
'Obtenemos una referencia a la seleccion actual
Set oSeleccion = ThisComponent.getCurrentSelection()
Select Case oSeleccion.getImplementationName
Case "ScCellObj"
'Si es una sola celda no hacemos nada, asi esta bien
Case "ScCellRangeObj"
'Si es un solo rango, solo tomamos la superior izquierda
Set oSeleccion = oSeleccion.getCellByPosition(0,0)
Case "ScCellRangesObj"
'Si son varios rangos, tomamos la superior izquierda del primer
rango
Set oSeleccion = oSeleccion.getByIndex(0).getCellByPosition(0,0)
End Select
iFila = oSeleccion.getCellAddress().Row
Prueba y observa como ahora, no importa que tipo de rango de celdas tengamos
seleccionado, siempre que sean celdas, nos dara la fila de la celda
(recuerda que en OOo Basic las filas empiezan en 0), si es un rango de
celdas, el de la celda superior izquierda.
OJO, este metodo aun puede fallar, pues recuerda que el usuario puede tener
alguna otra cosa seleccionada, asegurate de que sean, por lo menos, celdas,
con una sencilla instrucción lo haces, pero esa es tu tarea... sigamos...
Cuando pones
Do Until ThisComponent.getCurrentSelection.Value = "-"
Te funcionara, siempre y cuando la seleccion sea una sola celda, en general
no te recomiendo hacer comprobaciones directamente con las selecciones,
primero obten al inicio de tu macro, "todos" los datos que necesites y
despues haz con ellos lo que quieras...
Despues creas un cursor
oCursor = oHoja1.createCursor
Un cursor implementa metodos muy utiles como seleccionar o hacer referencia
a la region actual o mover el cursor al inicio o al final, pero si lo creas
a partir de la hoja, no tiene mucha utilidad, es mucho mejor si lo creas a
partir de tu seleccion o la celda que te interese, veamos la diferencia...
Supongamos que tenemos datos de las celdas A1 a la J20, es decir, 10
columnas por 10 filas, una tabla de datos, algo muy usual en Cal y en hojas
de calculo y algo muy usual es manipular regiones como esta...
Se le pide al usuario que ejecute tu macro, teniendo seleccionada solo una
celda de cualquiera que este "dentro" del rango anterior, pero como no
confiamos en los usuarios, tu debes de "validar" que efectivamente
selecciono solo una celda como lo vimos anteriormente, partimos de esa
celda...
Una operación común es hacer una referencia a la region actual y obtener
información de ella: cuantas filas y columnas tiene, cual es la primer fila,
la ultima, la primer columna, la ultima
'Creamos un cursor a partir de la celda seleccionada
oCursor = oHojaActual.createCursorByRange(oSeleccion)
'Hacemos referencia a la region actual
oCursor.collapseToCurrentRegion()
'Obtenemos todos los datos que quieras
'Cuantas filas tiene
MsgBox oCursor.getRows().getCount()
'Cuantas columnas
MsgBox oCursor.getColumns().getCount()
'En que fila empieza
MsgBox oCursor.getRangeAddress().StartRow()
'En cual termina
MsgBox oCursor.getRangeAddress().EndRow()
'Columna de inicio
MsgBox oCursor.getRangeAddress().StartColumn()
'Columna final
MsgBox oCursor.getRangeAddress().EndColumn()
Con los cursores podemos movernos, al inicio
oCursor.gotoStart()
o al final
oCursor.gotoEnd()
o movernos un numero de columnas o filas determinado
oCursor.gotoOffset(columnas, filas)
es decir, podemos movernos o mover todo el cursor a donde queramos, claro,
siempre y cuando este "dentro" del area de la hoja
oCursor.gotoOffset(2, 5)
Para moverte a la siguiente fila libre usamos
oCursor.gotoEnd()
oCursor.gotoOffset(0,1)
Observa como primero nos movemos al final, si no te mueves primero al final
estaras recorriendo "todo" el cursor, aun sin moverte, puedes saber cual es
la siguiente fila libre, tan solo sumandole uno a la ultima fila del rango
lFilaLibre = oCursor.getRangeAddress().EndRow() + 1
En mi anterior correo te mostre otro metodo para saber la siguiente fila
libre, así que opciones hay...
Para finalizar dos recomendaciones:
1.- Si conoces el area del rango a manipular es mejor usar rangos por
nombre, si vas a hacer ciclos es mejor usar rangos por posicion.
2.- Si estas traduciendo codigo de VBA, no quieras traducir "linea por
linea", en OOo Basic muchas cosas se hacen de forma "diferente" (y a veces
más fácil), ademas, como me ha pasado, el código original VBA esta mal o
simplemente no esta optimizado, casi siempre, hay muchas, muchas líneas de
más
Todas estas notas espero ampliarlas en los apuntes de OOo Basic
Saludos a todos...
Mauricio
--
_______________________________
Todo lo que no es dado es perdido
El día 29 de junio de 2008 0:41, Leonardo Spaltro <
[EMAIL PROTECTED]> escribió:
> Hola comunidad, recurro nuevamente a ustedes para salir de este problema.
> No
> creo que sea dificil, pero realmente, hace días que estoy tratando y no
> encuentro la solución.
>
> Mi pregunta sigue bajo el tema de OOo BASIC.
>
> Quiero tomar el número de la fila donde está posicionado el cursor para
> tomarlo como variable y luego utilizarlo para definir un rango. ¿Cómo hago
> para tomar ese valor?? He orientado mi búsqueda y pruebas a row, getRow,
> getRows pero no hubo caso.
>
> En VBA esto lo lograba con ---> Fila = selection.row
>
> Tengo el siguiente trozo de código:
>
> -------------------------------- CODIGO
> -------------------------------------------
> Do Until ThisComponent.getCurrentSelection.Value = "-" 'Esto de
> ThisComponent ...Value = "-" no lo he podido probar porque no logré
> terminar
> el ciclo, quizá esté mal, no lo sé.
>
> iProx_Dato = oHoja1.getCellRangeByName( "N3" ).value
> Celda = oHoja1.getCellRangeByName( "B3" )
> oCursor = oHoja1.createCursor
>
> For Contador = 1 to iProx_Dato
> oCursor.goToEnd()
> Next Contador
>
> iFilaInicio = ??????????????????? 'En VBA era selection.row
> iFilaFin = ??????????????
>
> oArea = oHoja1.getCellRangeByName("M" & iFilaInicio & ":V" &
> iFilaFin)
>
>
> (...)
>
>
> Loop
>
>
> Gracias.
>
>
> Leonardo.
>