Gracias Mauricio, justo estaba redactando un mail para enviar a la lista
explicando mejor mi consulta porque por el reciente canal de IRC creado para
OOo me habían dicho que habían leido mi mail pero que no lo habían
entendido. Me estaba refiriendo a una celda como selección. Igualmente,
muchas gracias (otra vez) por ir más allá de lo solicitado por mi consulta,
me ha sido de utilidad.

Me he dado cuenta que mi gran problema con OOo BASIC es darme cuenta cómo
debo armar la estructura de la orden. Por ejemplo, en este caso
"oSeleccion.getCellAddress().Row", yo estaba probando con "ohoja1.row",
"getcurrentcomponent.row", "getcurrentselection.row" y así con otras cosas,
siempre a ensayo y error (típico de autodidacta). Porque la orden que debo
usar me resulta relativamente sencillo encontrarla (también mediante una
sugerencia hecha a través del IRC) usando el buscador de api.openoffice.org.

Hasta que logre comprender esto, en esta lista seguramente encontrarán sólo
consultas de mi parte. Espero poder en algún momento ayudar a algún
principiante.

Gracias Mauricio, gracias comunidad por su aporte y ayuda desinteresada.



Leonardo.



El día 29 de junio de 2008 20:15, Mauricio Baeza <[EMAIL PROTECTED]>
escribió:

> 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