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.
>

Responder a