Macro: seleccionar campo de una lista e imprimir de a uno

Discute sobre la aplicación de hojas de cálculo
Responder
droplon
Mensajes: 80
Registrado: Mié May 04, 2011 12:44 pm
Ubicación: Posadas, Misiones

Macro: seleccionar campo de una lista e imprimir de a uno

Mensaje por droplon »

Estimados, tengo una libreta de calificaciones donde al seleccionar el nombre del alumno, me trae toooodas las notas y calificaciones del mismo. Luego selecciono el nombre del alumno e imprimo el archivo en formato PDF, pegando el nombre del alumno como nombre del archivo antes de darle click a Guardar.

Existe alguna manera de crear una macro que haga de manera automática este proceso hasta completar toda la lista de alumnos?
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
Neftali R
Mensajes: 169
Registrado: Mar Jun 15, 2021 12:48 pm
Ubicación: Venezuela

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por Neftali R »

Hice esto, no lo hace completamente automático, pero creo que lo hace muchísimo más fácil que hacerlo completamente manual.

Lo que tienes que hacer es:

1. Seleccionar la lista de estudiantes.
2. Apretar el “botón” que dice “Ejecutar”
3. Apretar “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea.
4. En el interfaz de impresión, seleccionar “doPDF v6”, seleccionar las hojas que quieres “imprimir”, y apretar aceptar.
5. En el interfaz de doPDF, marcar la ruta que aparece por defecto y reemplazarla con la que tienes en el porta papeles.
6. Repetir el paso 3.

Lo que hace es básicamente tomar todos los elementos de la lista, uno por uno, los coloca en la celda donde debe ir el alumno para que se formule la hoja, copia la ruta donde debería guardarse el nuevo archivo y ejecuta el interfaz de impresión de LibreOffice.

No sé como acceder a las opciones del interfaz de impresión de LibreOffice desde código, lo segundo mejor que podía hacer era acceder a la interfaz desde código y de ahí que se haga manual.

Ahora, notas importantes:

Yo uso LibreOffice, no sé si saltará algún error en OpenOffice.

Para convertir a PDF desde el interfaz de impresión, utilizo la opción “doPDF V6” no sé si OpenOffice también tiene la misma opción disponible, me parece que es un programa aparte de LibreOffice, pero la verdad no lo sé, desconozco.

Una cosa súper importante que tienes que tener en cuenta, hay un error loco pero ni medio normal cuando se abre el interfaz de doPDF, si apreto aceptar y abro el interfaz, cuando trato de copiar lo que tengo en el porta papeles, LibreOffice colapsa, y eso es porque en el porta papeles tengo… no sé lo que sea, pero es como si estuviera en blanco y colapsa cualquier cosa en la que lo pegué, (cualquier cosa, fuera de juego), pero si antes de abrir el interfaz de doPDF, pego lo que tiengo en el porta papeles en cualquier lugar, entonces cuando se abro el interfaz de doPDF, si tengo la información en el porta papeles. No tengo idea de porque ocurre eso. Conclusión: Antes de abrir el interfaz de doPDF, apreta “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea, y después abres el interfaz de doPDF.

Podría haberlo hecho para que se adaptara específicamente al formato de tu archivo, pero no no tengo dicho formato, hice el mio propio, sin embargo, es sumamente simple de adaptar para cualquier formato, solo hay 2 referencias que deben ser cambiadas y están señaladas en el macro, así que no debería ser ninguna complicación adaptarlo para tu archivo específico.
Adjuntos
Importar Varios PDFs.ods
(11 KiB) Descargado 134 veces
LibreOffice 7.2.6.2 | Windows 7 Ultimate
droplon
Mensajes: 80
Registrado: Mié May 04, 2011 12:44 pm
Ubicación: Posadas, Misiones

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por droplon »

respondí más abajo citando
Última edición por droplon el Jue Ago 05, 2021 5:28 pm, editado 1 vez en total.
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
droplon
Mensajes: 80
Registrado: Mié May 04, 2011 12:44 pm
Ubicación: Posadas, Misiones

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por droplon »

Neftali R escribió:Hice esto, no lo hace completamente automático, pero creo que lo hace muchísimo más fácil que hacerlo completamente manual.

Lo que tienes que hacer es:

1. Seleccionar la lista de estudiantes.
2. Apretar el “botón” que dice “Ejecutar”
3. Apretar “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea.
4. En el interfaz de impresión, seleccionar “doPDF v6”, seleccionar las hojas que quieres “imprimir”, y apretar aceptar.
5. En el interfaz de doPDF, marcar la ruta que aparece por defecto y reemplazarla con la que tienes en el porta papeles.
6. Repetir el paso 3....................

Muchísimas gracias por tu ayuda, pero debo confesar que no logré entender todo el proceso que me explicas. Incluso lo intenté pero me parece que no es posible porque no tengo instalado el "doPDF".
Yo también utilizo LibreOffice Calc (V7.1.4.2=

Intentaré explicar el paso a paso de todo el proceso y el resultado final al que quiero lograr.
Mi intención era poder poner un Botón que diga "GENERAR LIBRETAS" y que todo el proceso que detallo más abajo, se lo pueda hacer automáticamente

Mi documento está compuesto por dos hojas
Hoja 1 = "Alumnos y Notas"
Hoja 2 = "Libreta" (Boletin de calificaciones)
Imagen


Paso 1:
Desde la hoja "Libreta", selecciono el alumno desde una lista desplegable. (Lista desplegable generada a partir de la lista de alumnos en la Hoja 1)
Imagen
Imagen 01

Imagen
Imagen 02



Paso 2:
Selecciono el nombre del alumno en cuestión para poder usarlo como nombre de archivo al momento de imprimir en PDF
Imagen
Imagen 03


Paso 3:
Desde la interfaz de impresión, selecciono una de las dos impresoras PDF. (por defecto siempre uso la "Microsoft Print to PDF")
Imagen
Imagen 04


Paso 4:
Elijo la ruta donde voy a guardar el PDF y el nombre del documento, pego el nombre del alumno copiado en el "paso 2"
Imagen
Imagen 05


IMAGEN FINAL - RESULTADO DEL BOLETIN EN DPDF
Imagen
Imagen 06
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
Neftali R
Mensajes: 169
Registrado: Mar Jun 15, 2021 12:48 pm
Ubicación: Venezuela

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por Neftali R »

Yo no tengo esa opción para crear el PDF, pero puedo modificar el macro para que se adapte a lo que vi en las imágenes.

Lo que tienes que hacer es:

1.copiar este código.

Código: Seleccionar todo

Sub VariosPDFs()
Dim oLibretaSheet, oName, oSel As Object
Dim c As Integer, mNames()

oLibretaSheet = ThisComponent.Sheets.getByIndex(1)
oName = oLibretaSheet.getCellRangeByName("C6") 'Colocar aquí la celda en la que debe ir el nombre del alumno.
oSel = ThisComponent.getCurrentSelection
	If Not (oSel.getImplementationName = "ScCellRangeObj") Then
	MsgBox "Por favor seleccione un rango de celdas contiguas"
	Else
	mNames() = oSel.getDataArray
		For c = 0 to UBound(mNames)
			If mNames(c)(0) <> "" Then
			oName.String = mNames(c)(0)
			Wait 100
			ThisComponent.getCurrentController.SetActiveSheet(oLibretaSheet)
			Call ElPrint
			End If
		Next
	End If
End Sub

Sub ElPrint
Dim document, dispatcher As Object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args1(0) As New com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6" 'Aquí colocar la celda donde estará formulada la ruta del archivo PDF

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Wait 300
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
Wait 100
End Sub
2.Pegarlo en cualquier Módulo de tu archivo.
3.Seleccionar algunos de los alumnos de la hoja "Alumnos y Notas" así como se muestra en la imagen.
Captura.PNG
Captura.PNG (11.6 KiB) Visto 2178 veces
4. Ejecutar el macro que previamente copiaste y pegaste.
5. Hacer lo que siempre haces en el interfaz de impresión.
6. Repetir el paso 4 hasta que se termine la lista.

Prueba lo a ver si funciona.
LibreOffice 7.2.6.2 | Windows 7 Ultimate
droplon
Mensajes: 80
Registrado: Mié May 04, 2011 12:44 pm
Ubicación: Posadas, Misiones

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por droplon »

No funcionó. estoy haciendo un video para mostrarte
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
droplon
Mensajes: 80
Registrado: Mié May 04, 2011 12:44 pm
Ubicación: Posadas, Misiones

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por droplon »

Neftali R escribió:Yo no tengo esa opción para crear el PDF, pero puedo modificar el macro para que se adapte a lo que vi en las imágenes.

Lo que tienes que hacer es:

1.copiar este código.

Código: Seleccionar todo

Sub VariosPDFs()
Dim oLibretaSheet, oName, oSel As Object
Dim c As Integer, mNames()

oLibretaSheet = ThisComponent.Sheets.getByIndex(1)
oName = oLibretaSheet.getCellRangeByName("C6") 'Colocar aquí la celda en la que debe ir el nombre del alumno.
oSel = ThisComponent.getCurrentSelection
	If Not (oSel.getImplementationName = "ScCellRangeObj") Then
	MsgBox "Por favor seleccione un rango de celdas contiguas"
	Else
	mNames() = oSel.getDataArray
		For c = 0 to UBound(mNames)
			If mNames(c)(0) <> "" Then
			oName.String = mNames(c)(0)
			Wait 100
			ThisComponent.getCurrentController.SetActiveSheet(oLibretaSheet)
			Call ElPrint
			End If
		Next
	End If
End Sub

Sub ElPrint
Dim document, dispatcher As Object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args1(0) As New com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6" 'Aquí colocar la celda donde estará formulada la ruta del archivo PDF

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Wait 300
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
Wait 100
End Sub
2.Pegarlo en cualquier Módulo de tu archivo.
3.Seleccionar algunos de los alumnos de la hoja "Alumnos y Notas" así como se muestra en la imagen.
Captura.PNG
4. Ejecutar el macro que previamente copiaste y pegaste.
5. Hacer lo que siempre haces en el interfaz de impresión.
6. Repetir el paso 4 hasta que se termine la lista.

Prueba lo a ver si funciona.

Te compartí este video: https://youtu.be/Q_bBEIuzdvs
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
Neftali R
Mensajes: 169
Registrado: Mar Jun 15, 2021 12:48 pm
Ubicación: Venezuela

Re: Macro: seleccionar campo de una lista e imprimir de a un

Mensaje por Neftali R »

Eso de que no funcione el macro en absoluto es raro, muy raro, yo uso LibreOffice 6.3.2.2, pero la verdad dudo que sea un problema de incompatibilidad con la versión de LibreOffice.

El macro que es el que tiene todas las acciones, es VariosPDFs, ElPrint solo son las declaraciones de algunas variables y 3 acciones, es un macro hecho con la grabadora de macros de LibreOffice, además, hay un llamado explicito de ElPrint desde VariosPDFs. Como sea.

Ya has usado macros antes? Cómo está la configuración de seguridad para las macros en tu computadora? Revisa en “Herramientas”, “Opciones...”, “LibreOffice”, “Seguridad”, “Seguridad de Macros”, Y configura la como “Medio”, después de eso es que debes abrir tu archivo y seleccionar la opción de activar macros, si con eso todavía no funciona ningún macro, graba un macro haciendo lo que sea y mandalo en el siguiente mensaje a ver si los servicios invocados son diferentes, sin embargo, no me explico porque el macro que te pasé no funciona en absoluto, si la configuración de seguridad de macros no está bloqueando las macros, no tiene sentido.

Aquí una nueva versión del macro que obitne la lista directamente de los datos de validación de la celda C6 (ya no tienes que selccionar la lista de alumnos para que el macro sepa donde está la lista).

Código: Seleccionar todo

Sub VariosPDFs()
Dim oAlumYNotSheet, oName As Object
Dim sFormula, sPos1, sPos2 As String
Dim p, dp, c As Integer, mNames()

oName = ThisComponent.Sheets.getByIndex(1).getCellRangeByName("C6")
sFormula = oName.ValidationLocal.getFormula1
p = InStr(1,sFormula,".")+1
dp = InStr(1,sFormula,":")
sPos1 = Mid(sFormula,p,dp-p)
p = InStr(dp,sFormula,".")+1
sPos2 = Mid(sFormula,p,Len(sFormula))
oAlumYNotSheet = ThisComponent.Sheets.getByIndex(0)
mNames() = oAlumYNotSheet.getCellRangeByName(sPos1 & ":" & sPos2).getDataArray()
	For c = 0 to UBound(mNames)
		If mNames(c)(0) <> "" Then
		oName.String = mNames(c)(0)
		Wait 100
		Call ElPrint
		End If
	Next
End Sub

Sub ElPrint
Dim document, dispatcher As Object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args1(0) As New com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6" 'Aquí colocar la celda donde estará formulada la ruta del archivo PDF

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Wait 300
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
Wait 100
End Sub
LibreOffice 7.2.6.2 | Windows 7 Ultimate
Responder