Gracias Alexandro, Mauricio, Jorge, Julián, J. Eduardo y Ariel he leído sus
mails y me han orientado bastante, aunque -obviamente- todavía no he podido
leer gran parte de la documentación que me pasaron, para lo cual no faltará
tiempo.

Mención especial merece el tiempo dedicado por Ariel a la respuesta, muchas
gracias.

Mauricio, no pretendía que alguien tradujera el código por mí, pero sería
interesante ver las dos formas de hacer lo mismo escrito por alguien que
sabe y partiendo de ello, seguir avanzando yo por mi cuenta.

Otra consulta (es por curiosidad nada más, nada importante): he visto en
muchos ejemplos que al nombrar una variable se la antecede con la letra "o",
ejemplo: oDocument, oSheets, oHoja, oLoquesea. Es esto por alguna razón en
particular??, es simple costumbre??, es para diferenciarse de otro lenguaje
denotando que se utiliza OpenOffice?? En mi caso funcionó igual sin la "o"
(por supuesto), pero me intriga esa forma.

Gracias otra vez,



Leonardo



El día 27 de mayo de 2008 17:05, Ariel Constenla-Haile <
[EMAIL PROTECTED]> escribió:

> Hola Leandro, *
>
> como son diversos temas, las respuestas van tras cada cita de los
> mensajes originales
>
> Leonardo Spaltro escribió:
>
>> Bueno, también hace un tiempo que trato de usar lo menos posible MS Excel
>> en
>> favor de OOo Calc por lo que ahora intento ¿traducir? este macro de Excel
>> a
>> una macro de OOo Basic pero no logro hacer que funcione. Es más, no puedo
>> hacer que avance de:
>>
>> sub Cargar_Asiento
>> rem ----------------------------------------------------------------------
>> rem define variables
>> dim document as object
>> dim hoja as object
>>
>> rem ----------------------------------------------------------------------
>> rem get access to the document
>> document   = StarDesktop.CurrentComponent
>> hoja = document.Sheets.getByName("Carga Asientos")
>>
>> <Continúa el código que no puede probar>
>>
>> End Sub
>>
>> Cuando testeo el código con F8 cuando llega a la línea "hoja =
>> document..."
>> me aparece el siguiente error: "Error de ejecución de BASIC. Propiedad o
>> método no encontrados".
>>
>
> El error está en emplear StarDesktop.CurrentComponent . Lo siguiente
> explica la causa de ese mensaje de error.
>
> Si comienzas a ejecutar la macro *desde* el IDE de OOo Basic,
> XDesktop.getCurrentComponent() retornará el componente *actual*: el
> mismo IDE de OOo Basic, *NO* el documento de Calc que tú deseas.
> Prueba examinando el valor de la variable document, verás que en la
> columna "Tipo" figura "com.sun.star.comp.basic.BasicIDE" como el tipo de
> objeto.
> Desde luego, el BasicIDE no tiene ningún método o propiedad que
> corresponda a "Sheets" [en tu código hoja = document.Sheets el
> intérprete de OOo Basic busca algún método get/setSheets() o una
> propiedad Sheets], de ahí el error "Propiedad o método no encontrados"
>
>
>
> Por otro lado, es mejor no emplear XDesktop.getCurrentComponent(), para
> las razones cf. Dev's Guide 20. GUI
>
> http://api.openoffice.org/docs/DevelopersGuide/GUI/GUI.xhtml#1_5_3_The_Toolkit_Service
> "There are several ways to retrieve a frame. The easiest way to retrieve
> a frame is to query the frame that has the focus: [...]
> XDesktop.getCurrentFrame() [...] This should only be used for debugging
> purposes. The method getCurrentFrame is based on the implementation of
> the window handler of the operating system and you cannot be sure that
> the returned frame is always the desired one on all supported platforms,
> or that a valid frame is returned at all."
>
> y el comentario de as@ en
> http://www.openoffice.org/issues/show_bug.cgi?id=84767
> "Using of any API related to the focus (getActiveFrame(),
> getCurrentComponent() etc) should be supressed. It works sometimes ...
> but not always and even not on all platforms in the same way. Its always
> better to make thinks more explicit. You can travel the frames
> hierarchie .. analyzing controlls/models to find the right (in your
> example forms) component - and it will work always."
>
> De forma tal que obtener una referencia mediante getCurrentComponent(),
> getCurrentFrame(), getActiveFrame() no es aconsejable.
>
>
> En OOo Basic tienes en gral. otras dos formas de obtener una referencia
> al documento con el cual deseas trabajar:
>
> * cargar el documento y guardar una referencia a él en una variable con
> la cual trabajarás en el resto de la macro
>
>        Dim oDoc as Object
>        oDoc = StarDesktop.loadComponentFromURL(_
>                "private:factory/scalc", "_default", 0, Array())
>
>        Dim oSheets as Object
>        oSheets = oDoc.getSheets()
>
>        '...
>
>
> * emplear ThisComponent para referirte al documento activo. También aquí
> debes guardar el valor en una variable al comienzo de tu macro. A veces
> se ve código como el siguiente
>
> oAlgo = ThisComponent.getXxx()
> '...
> oAlgo2 = ThisComponent.getXxx2()
>
> Esto es bastante impropio, pues entre la asignación a oAlgo y la
> asignación a oAlgo2, ThisComponent puede hacer referencia a diferentes
> componentes, y por ende tendrás resultados inesperados. Más apropiado es:
>
> Dim oDoc as Object
> oDoc = ThisComponent
> '...
> oAlgo = oDoc.getXxx()
> '...
> oAlgo2 = oDoc.getXxx2()
>
>
>
> La regla es:
>
> * si la macro está dentro de un documento, ThisComponent *siempre* se
> refiere a ese documento
> * si la macro está en el contenedor de macros de OOo o del usuario, todo
> depende de qué documento está activo, cuál haya tenido en último lugar
> el foco, ... Si comienzas a ejecutar la macro desde el IDE de OOo Basic,
> los resultados pueden ser inesperados.
>
> Así que para ejecutar una macro te conviene hacerlo desde el documento
> mismo; si quieres estudiar la macro, te conviene (hasta que le hayas
> tomado la mano al asunto) poner un punto de ruptura en la línea que le
> sigue a la asignación de ThisComponent a tu variable, ejecutar la macro
> desde el documento al que quieres que se refiera ThisComponent, y luego
> volver al IDE y continuar la ejecución de la macro paso a paso para
> estudiarla.
>
>  De paso -por si alguien tiene el tiempo como para ver el código del final-
>>
>
> hoy imposible (este mail me ha tomado bastante tiempo), y como Mauricio
> ya se ofreció, le dejamos el trabajo a él
>
>  para seleccionar una celda he leido que se
>> usa getCelByPosition(1,1), que sería B2, pero no pude encontrar cómo hacer
>> para usar el nombre de la celda "B2" en vez de (1, 1).
>>
>
> tienes diferentes métodos para obtener una celda o un rangos de celdas,
> algunos los puedes emplear con la colección de hojas (
> ThisComponent.getSheets() ) de OOo Calc, otros los empleas con una hoja
> de cálculo en particular:
>
>
> getCellByPosition( nColumn, nRow)
> - función de la interfaz ::com::sun::star::table::XCellRange
> - retorna: XCell
> - emplear en la hoja de cálculo, et. al. v.
>
> http://api.openoffice.org/docs/common/ref/com/sun/star/table/XCellRange-xref.html#SupportingServices
> [si sigues los vínculos, tal vez (o seguro) sea chino básico... pero igual
> los pongo por las dudas]
>
> getCellByPosition( nColumn, nRow, nSheet )
> - función de la interfaz ::com::sun::star::sheet::XCellRangesAccess
> - retorna: XCell
> - emplear con la colleción de hojas v.
>
> http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XCellRangesAccess-xref.html#SupportingServices
>
>
> getCellRangeByName( sRangeName )
> - función de la interfaz ::com::sun::star::table::XCellRange
> - retorna: XCellRange
> - emplear con la hoja et. al. v.
>
> http://api.openoffice.org/docs/common/ref/com/sun/star/table/XCellRange-xref.html#SupportingServices
>
>
> getCellRangeByPosition( nLeft, nTop, nRight, nBottom)
> - función de la interfaz ::com::sun::star::table::XCellRange
> - retorna: XCellRange
> - emplear con la hoja et. al. v.
>
> http://api.openoffice.org/docs/common/ref/com/sun/star/table/XCellRange-xref.html#SupportingServices
>
>
> getCellRangeByPosition( nLeft, nTop, nRight, nBottom, nSheet)
> - función de la interfaz ::com::sun::star::sheet::XCellRangesAccess
> - retorna: XCellRange
> - emplear con la colleción de hojas v.
>
> http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XCellRangesAccess-xref.html#SupportingServices
>
>
> getCellRangesByName( sRangesName)
> - función de la interfaz ::com::sun::star::sheet::XCellRangesAccess
> - retorna: sequence< XCellRange >
> - emplear con la colleción de hojas v.
>
> http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XCellRangesAccess-xref.html#SupportingServices
>
>
>
> getCellByName() es una función de la interfaz
> ::com::sun::star::text::XTextTable, por ende sólo es válida para las
> tablas de documentos de OOo Writer, *no* para las hojas de cálculo de
> OOo Calc
>
>
> Un ejemplo que muestra cada método:
>
> '**************************************************************************
> Sub Demo
>
>        Dim oDoc as Object, oHojas as Object, oHoja1 as Object
>        Dim oCell as Object, oCellRange as Object
>
>        oDoc = ThisComponent
>        oHojas = oDoc.getSheets()
>        oHoja = oHojas.getByIndex(0)
>
>        'css.table.XCellRange.getCellByPosition( nColumn, nRow )
>        oCell = oHoja.getCellByPosition( 0, 0)
>        oCell.setFormula("getCellByPosition( 0, 0)")
>
>
>        'css.sheet.XCellRangesAccess.getCellByPosition( _
>        '                               nColumn, nRow, nSheet )
>        oCell = oHojas.getCellByPosition( 2, 3, 0 )
>        oCell.setFormula("getCellByPosition( 2, 3, 0 )")
>
>        'css.table.XCellRange.getCellRangeByName()
>        oCellRange = oHoja.getCellRangeByName("$B$2")
>        oCellRange.setFormula("$B$2")
>        'aca funciona porque $B$2 referencia UNA celda
>        oCellRange.CellBackColor = RGB(250, 128, 128)
>
>        oCellRange = oHoja.getCellRangeByName("H4:I9")
>        oCellRange.CellBackColor = RGB(128, 0, 128)
>        'oCellRange.setFormula("H4:I9")
>        'aca NO funciona: H4:I9 referencia a un conjunto de celdas
>
>
>        'css.table.XCellRange.getCellRangeByPosition( _
>        '                       nLeft, nTop, nRight, nBottom)
>        'nLeft  is the column index of the first cell inside the range.
>        'nTop  is the row index of the first cell inside the range.
>        'nRight is the column index of the last cell inside the range.
>        'nBottom  is the row index of the last cell inside the range.
>
>        oCellRange = oHoja.getCellRangeByPosition( 1, 8, 3, 20)' B9:D21
>        oCellRange.CellBackColor = RGB(250, 250, 128)
>
>        'css.sheet.XCellRangesAccess.getCellRangeByPosition( _
>        '                       nLeft, nTop, nRight, nBottom, nSheet)
>        oCellRange = oHojas.getCellRangeByPosition( 5, 10, 8, 30, 0)
>        ' Hoja1.F11:I31
>        oCellRange.CellBackColor = RGB(250, 0, 250)
>
>
>        'css.sheet.XCellRangesAccess.getCellRangesByName( sRangesName)
>        Dim oCellRanges()
>        oCellRanges = oHojas.getCellRangesByName("Sheet1.B27:D30")
>        '"Hoja1.B27:D30"
>        oCellRange = oCellRanges(0)
>        oCellRange.CellBackColor = RGB(0, 250, 250)
>
> End Sub
> '**************************************************************************
>
>  PD1: he intentado usar la grabadora de macro y luego mirar el código pero
>> su
>> estructura es muy distinta a lo que conozco en VBA y no logro entender su
>> lógica para luego adaptarlo a lo que quiero.
>>
>
> oh, no, no! no te recomiendo que emplees la grabadora para estudiar OOo
> Basic (la grabadora sólo emplea el mecanismo de "dispatch")
>
>
>  PD2: otra cosa que me resulta dificil de comprender de la Guía de
>> Programación es eso de los servicios "com.sun.star.(...)"
>>
>
> esto ya requiere otra respuesta tan larga como todo lo que he escrito en
> este mail...
> Te recomiendo que estudies la documentación apropiada, antes de
> aventurarte a escribir código.
> Como ya has seguro experimentado con el caso de VBA, el andar buscando
> retozos de explicaciones, ejemplos aislados, etc. al final de cuentas te
> va a llevar más tiempo que sentarte con paciencia a leer la
> documentación adecuada.
>
> ¿Cuál es la documentación apropiada?
>
>> Alexandro Colorado escribió:
>>
>>> Bajate la guia de Macros de Andrew Pitonyak. Es como un recetario con
>>> pedazos de codigo para hacer multiples cosas desde Basic.
>>> http://www.pitonyak.org/oo.php
>>>
>>
> esto no te lo recomiendo en absoluto: es una rapsodia de ejemplos, muy
> buenos por cierto, pero terminarán dejándote más perdido de lo que
> puedas estar; otra cosa complette. diferente es el *libro* (debes
> pagarlo) de Pitonyak, que está mejor estructurado, pero ese documento es
> un laberinto para un principiante...
>
> Puedes descargarlo y comprobarlo vos mismo...
>
>  Otra recomendacion es leer la ayuda. La ayuda de Basic es muy buena ya que
>>> parte de lo muy basico de Basic. Tambien pues tienes la facilidad de la
>>> ayuda que incluye  marcadores y una buena estructuracion de la informacion.
>>>
>>
> la Ayuda tiene algunos/varios errores (algunos son de traducción), no
> obstante puede ser útil en general; aunque tampoco está estructurada
> como un libro/guía, y esto puede resultar algo caótico.
>
>  Finalmente si sabes ingles esta el foro de oooforum.org donde hay
>>> muuuuucho codigo para aprender. Solo leer los titulos y ver los snippets de
>>> codigo te dara un panorama de que cosas esta haciendo mucha gente con
>>> OpenOffice.org.
>>> http://oooforum.org
>>>
>>
> te desaconsejo por completo que pierdas el tiempo buscando ejemplos por
> aquí y por allí; creo que esta experiencia ya la has aprendido con VBA:
> a la larga, perderás mucho más tiempo buscando, tratando de entender
> ejemplos inconexos/aislados, etc. que el te tomará sentarte a
> estudiar una buena guía.
>
>  mauriciobaeza escribió:
>>
>>> Si, hay bastante documentación, casi toda en ingles, puedes empezar con
>>> lo siguiente:
>>>
>>> El compañero Ariel tiene en su sitio un apartado de OpenOffice.org con
>>> cosas muy interesantes
>>>
>>> http://www.arielconstenlahaile.com.ar/ooo/index.php
>>>
>>
> gracias por la flores Mauricio, pero tampoco le recomendaría mis ejemplos.
> Primeros debes saber cómo se emplean los objectos, servicios,
> interfaces, cuáles son los tipos de datos, etc.
>
>  Puedes descargar unos apuntes que estoy preparando de programar con OOo
>>> Basic, ojo, son notas solo para noveles en la programación
>>>
>>>
>>> http://www.esnips.com/doc/d92d3790-17a7-4184-a594-4f6b7f499540/Aprendiendo-OOo-Basic
>>>
>>
> ¡este documento está realmente muy bueno!
> Te recomiendo que leas el documento del amigo Mauricio, sobre todo debes
> aprender PRIMERO BIEN lo básico: el tipo de datos que hay en OOo Basic,
> cómo se emplea el IDE; LUEGO pasar a estudiar la API (desde el cap. 10
> del doc. de Mauricio).
> El doc. de Mauricio está mucho mejor estructurado que ese laberinto de
> Pitonyak.
>
> Si sabes inglés, la literatura oficial de OOo Basic es
> http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide
>
> Si sabes francés, el doc. de Bernard Marcelly está muy bien ordenado,
> progresivamente
> http://fr.openoffice.org/Documentation/How-to/Basic/OOo_API_intro-07.sxw
>
> Una herramienta indispensable es Xray de Bernard Marcelly
> http://es.openoffice.org/files/documents/73/3981/XrayTool_es.odt
>
>
> Una vez que sepas bien OOo Basic, y tengas el conocimiento básico de la
> API, la biblia de la API es su referencia y la Developer's Guide:
>
>
> http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide
> http://api.openoffice.org/docs/common/ref/com/sun/star/module-ix.html
>
> Pero ambas son CHINO básico si antes no estudias lo elemental.
>
>
> Para concluir, creo que ya es hora de tener una lista dedicada a
> programación, para consultas de usuarios en general, sin conocimientos de
> programación pero que desean automatizar OOo con macros.
> En el proyecto en Francés la tienen ya hace rato.
> Creo que Mauricio también era de esta idea, será cuestión de convencer a
> quienes toman decisiones por aquí...
>
> Saludos
> Ariel.
>
>
> --
> Ariel Constenla-Haile
> La Plata, Argentina
>
> [EMAIL PROTECTED]
> [EMAIL PROTECTED]
>
> http://www.ArielConstenlaHaile.com.ar/ooo/
>
>
>
> "Aus der Kriegsschule des Lebens
>                - Was mich nicht umbringt,
>        macht mich härter."
>                Nietzsche Götzendämmerung, Sprüche und Pfeile, 8.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Responder a