Hola Alejandro,
disculpa la demora: me tomé el fin de semana para responderte y de paso
escribir algunos ejemplos.

La respuesta va dirigida a la lista de usuarios de OOo, de esta forma
más gente puede ayudarte y aportar sus soluciones.

Los documentos con ejemplos puedes encontrarlos en
http://www.arielconstenlahaile.com.ar/ooo/calc.php

Alejandro Rivas escribió:
'============================================================= Gracias extensas por su atención y disculpe lo extenso de esta descripción

El Kid de esto es que califico (muchísimos) examenes hechos en hoja electrónica
(algunos lo hacen el OO115 y otros lo hacen en excel 97). En ocasiones el
alumno (o la alumna) debe crear tres o mas archivos como parte de la práctica.
En cada uno de ellos  Hace una parte de contenido el cual sigue en el otro
archivo y asi sucesivamente.

PRIMERO

¿Es posible que tú les des una PLANTILLA (en Calc o Excel), y los
alumnos se limiten a completarla con datos, de manera tal que todos los
archivos tengan la *misma estructura* y sólo cambien los datos/formato?

           VENTAJA: al tener la misma estructura, el rango de celdas a
comparar será siempre idéntico.


SEGUNDO

¿es posible reducir todos los archivos enviados por un alumno A UN SOLO
DOCUMENTO? Como sabrás, un documento Calc puede tener varias hojas de
cálculo. Tienes dos opciones: (1) que te envíen todo en un solo archivo,
(2) COMBINAR todos los archivos de un mismo alumno EN UNO SOLO para
corregirlo.

              VENTAJA: se reduce la cantidad de archivos a revisar

Para la segunda opción, puedes consultar el ejemplo "Copiar y vincular
hojas de cálculo entre documentos" en mi página

Para calificar, abro los archivos y tego que estar pasando entre uno y otro
para revisar los contenidos (por ejemplo el nombre del alumno, alguna suma, o
algunos datos digitados en celdas específicas.

Aquí hay varias posibilidades
            *   suponiendo que dispongas de la macro que realiza la
                comparación automáticamente, lo mejor es emplear un
                bucle que vaya abriendo UNO A UNO todos los archivos de
                un directorio (según determinados parámetros), lo
                compare con el modelo, y lo corrija, guarde información
                sobre el resultado en otro archivo (alumno, etc.),
                lo guarde y cierre, y abra el siguiente, etc......

Me resulta muy trabajoso.  Entonces, lo que hago es codificar los nombres de
archivo, cuando recibo de c/estudiante.  Luego para calificar, con una macro
abro los archivos, leyendo codigos en una hoja ya abierta, (de tal manera que
sólo digito los códigos en las celdas, luego la macro lee, completa la linea
para abrirlos. Así los abro de un clikso.

Acá ya me perdí un poco :-)  ¿no es más simple guardarlos en una
carpeta? Luego obtienes un array con el contenido de la carpeta, y
puedes generar una lista, por ejemplo, para ir abriéndolos.

En el ejemplo "Copiar y vincular hojas de cálculo entre documentos" y en
mi borrador sobre OOoBasic - Formularios encontrarás cómo emplear el
servicio SimpleFileAccess; en el último caso, el ejemplo "Ejemplo 1" (el
único :-(  ), tiene una macro que lee todo los archivos de una carpeta
dentro de un array, a partir de ahí se genera una lista, al
seleccionarla ...

Ya abiertos. Lo que hago (o necesito) es trasladarme entre una y otra ventana
de los archivos abiertos para revisar los contenidos.

SIN MACROS: verifica si tu sistema operativo no tiene una combinación de
teclas para realizar eso. MSWin tiene ALT + TAB que abre un recuadro con
todas las ventanas abiertas (creo que hay distros Linux que tienen la
misma funcionalidad - ahora estoy en WinXP y no puedo pasarme a SuSe,
pero después te cuento).

CON MACROS: Esto puedes tal vez realizarlo con una enumeración de
los componentes abiertos en el escritorio (Desktop) de OOo: si el doc.
es XXX y XXX ... entonces generas una lista con los archivos, al
seleccionar un ítem, ...

De paso, que estoy en
una ventana de un archivo, leer los datos de ciertas celdas y compararlos con
los del ejericio para determinar si el alumno (o la alumna) lo hizo bien o no,
y calificar.

Como ya te dije, lo mejor es que la estructura de los diferentes
archivos sea idéntica ...

Por ejemplo, en el primer archivo se le pide que digite entre las celdas C3 a
C5 cantidades de dinero.  Es costumbre que ellos digiten $ 2,000.00 en lugar de
2000.00 (incorrecto!).

Si pudiera recuperar el dato de C3 del archivo 1 con macro, lo puedo comparar
con 2000.00 y determinar si esta bueno (y asi con los demas) para calificar.

Me paso al segundo archivo. Por ejemplo ahí tiene que llenar numeros entre las
celdas D3 y D7 para calcular la suma en D8. Así con la macro podría leer el
valor de D8 y establecer si corresponde a la suma.

Me paso al archivo 3 y ahí tienen un peque?o cuadro en el que deben colocar
letra negrilla, centrada en los títulos de columnas de datos. Es una lista
peque?a y suponiendo que la inician en B2. Luego con la macro podría leer el
dato de B2 y ver si es Negrilla.

esto ya complica bastante la solución pues el bucle,
además de comparar los datos (valores/fórmulas) debería comparar
formatos del contenido de las celdas. Esto es posible, pero más
complicado y lento (si se lo realiza con macro que compare celda a
celda automáticamente).

En resumen,  lo que busco es ..

Digamos algo así como la forma de reemplazar el “Thiscomponent” del archivo
actual por el archivo que tengo al frente

Si te entiendo bien, presta atención a:

       *   si la macro está dentro de un documento,
           *ThisComponent* se refiere SIEMPRE a ese documento
       *   si la macro está dentro de "Mis macros",
           ThisComponent se refiere al *documento activo*
           PERO si estás trabajando en el IDE de OOo Basic,
           se refiere al *último documento activo* ANTES de pasar al IDE

A diferencia de *ThisComponent* que puede referirse a diversos objetos
según el contexto ya citado, *StarDesktop.CurrentComponent* se refiere
siempre al componente ACTIVO: si estás en el IDE examinando tu código
que ejecutas p.e. en un doc. Writer, StarDesktop.CurrentComponent generará
un error si aplicas métodos válidos para Writer, porque se refiere al
COMPONENTE EFECTIVAMENTE ACTIVO: el IDE de OOo BASIC.

A) Como una prueba, abre varios archivos distintos (puedes ser nuevos,
es más fácil). Luego en TUS macros (no las de alguno de los docs) escribe

oDoc = ThisComponent
oCurrComp = StarDesktop.CurrentComponent

verás que si examinas las variables en el IDE, la última siempre se
refiere al IDE, en cambio oDoc se refiere al último doc. que haya estado
activo antes de ir al IDE (haz el experimento activando distintos doc. y
regresando al IDE)

B) algo más completo y que responde lo que preguntas luego:

Sub Doc_Info_Titulo_URL
      rem StarDesktop.CurrentComponent <> ThisComponent
      GlobalScope.BasicLibraries.loadLibrary("Tools")
      oDoc = StarDesktop.CurrentComponent 'ThisComponent '
      If HasUnoInterfaces(oDoc ,_
           "com.sun.star.document.XDocumentInfoSupplier") Then
          oDocInfo = oDoc.getDocumentInfo()
          MsgBox "Título: " & oDocInfo.Title & chr(10) &_
               "URL: " & oDoc.URL & chr(10) &_
              "Nombre: " & GetFileNameWithoutExtension(oDoc.URL, "/")_
              , 64, "Titulo - URL - Nombre"
      End If
End Sub

(Supongo que podría asignar una pulsación de tecla para que corra una macro
deteminada para que me vaya guiando en el proceso).
'----------------------------------

Para pasar de un archivo a otro SIN emplear macros, verifica si tu SO no
dispone de una combinación de teclas.

Para pasear por las hojas de cálculo de un doc ODS, OOo dispone de CTRL
+ RePág y CONTROL + AvPág. No obstante, la navegación no es cíclica
(cuando llega a la última NO pasa a la primera).
Una solución más útil (creo) puedes encontrar en

http://www.arielconstenlahaile.com.ar/ooo/docs/ARIEL_OOoBASIC_MANIPULAR_VISTA.ods

junto con otros ejemplos que tratan el controlador de los docs Calc.


'----------------------------------
'Captar el nombre del archivo actual ' ?? esto si no tengo ni idea
' oNombreArchActual=..?
msgbox oNombreArchActual

¿el título del archivo o su nombre (== la URL sin el directorio ni la
extensión)?

Para el TÍTULO (menú archivo - propiedades), debes verificar que sea un
componente de oficina y soporte el método getDocumentInfo(), como en el
ejemplo de arriba

Para el NOMBRE sin extensión, debes manipular la cadena de la URL, o
(más fácil) emplear las herramientas que vienen con OOo en la biblioteca
Tools.Strings:
          FileNameoutofPath
          GetFileNameExtension
          GetFileNameWithoutExtension ver ejemplo arriba
          DirectoryNameoutofPath

'------------------------------
'Captar el nombre de hoja actual
oHojaActual3=ThisComponent.CurrentController.ActiveSheet.Name
'o en este
oHojaActual3=ThisComponent.getsheets().getbyindex(0).getspreadsheet().getname()

msgbox oHojaActual3+" “Es correcto ? '"

Todo lo que se refiera a lo que ves actualmente en la pantalla está
relacionado con el controlador del documento. El método correcto es el
primero , NO el segundo, porque en tiempo de ejecución NO puedes
adivinar de antemano cuál es el índice de la hoja que estás viendo en
pantalla SIN ACCEDER AL CONTROLADOR (en realidad a la VISTA, por cada
VISTA del documento hay un controlador _ cf. Ver - Nueva ventana):

ThisComponent.Sheets.getByIndex(X)

Para conocer la X debes recurrir al controlador con el método de la
interfaz XSpreadsheetView :: getActiveSheet()
http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XSpreadsheetView.html#getActiveSheet

'-----------------------------------------
' Pasarme de una hoja a otra en el documento actual Thiscomponent.getcurrentcontroller().Setactivesheet(thiscomponent.getsheets().getbyname(oHojaActual3))

hay ejemplos en el doc ya citado
http://www.arielconstenlahaile.com.ar/ooo/docs/ARIEL_OOoBASIC_MANIPULAR_VISTA.ods

Revisa los ejemplos, tal vez algo te sirva.

Para más detalles, comenta si puedes implementar alguna de las
sugerencias (sobre todo: que todos los alumnos empleen una
plantilla==misma estructura, que los archivos de un mismo alumno se
agrupen en UN SOLO ODS)

En la semana veo si puedo escribir un ejemplo de comparación automática
de rangos entre dos docs. de Calc.

Saludos,
Ariel.


LaPlata
Argentina.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Responder a