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