[RESUELTO] Macro abra una hoja con una plantilla y color

Discute sobre la aplicación de hojas de cálculo

[RESUELTO] Macro abra una hoja con una plantilla y color

Notapor labotica » Lun Abr 16, 2018 6:37 pm

Hola. Tengo una macro, que conseguí gracias a este foro, que al escribir en cualquier celda de una columna me crea una hoja nueva con el nombre de esa celda. Ahora lo que quisiera es poder darle un color específico a esa hoja y si pudiese ser, que esa hoja se abriese con una plantilla que ya tengo hecha. Imagino que se debe poder hacer, pero no tengo ni idea de como hacerlo. Cualquier sugerencia será bienvenida, y como siempre muchas gracias por adelantado
Última edición por labotica el Mar Abr 17, 2018 6:16 pm, editado 1 vez en total
OpenOffice 4.0 en Ubuntu 14.04
labotica
 
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: Macro que abra una hoja con una plantilla y color de pes

Notapor PepeOooSevilla » Mar Abr 17, 2018 9:33 am

Hola.
Adjunto una posible solución (versión 2).

Código: Seleccionar todo   Expandir vistaContraer vista
REM  *****  BASIC  *****
Option Explicit

Sub CrearHojaSegunColumna()
   Dim DocCalc As Object
   Dim Seleccion As Object
   Dim NombreNuevaHoja As String
   Dim HojasEnLibro As Object
   Dim ArchivoPlantilla As String
   Dim HojaCreada As Object
   
   On Error Goto CONTROL_ERRORES
   DocCalc = ThisComponent
   Seleccion = DocCalc.getCurrentSelection()
   With Seleccion
      'Solo si es una sola celda
      If .supportsService("com.sun.star.sheet.SheetCell") Then
         'También If .getImplementationName() = "ScCellObj" Then
         'Si no es la columna A sale del procedimiento
         'En OOBasic las columnas y filas comienzan en 0 (cero)
         If .getCellAddress.Column <> 0 Then Exit Sub
         NombreNuevaHoja = .getString()
         'Si la celda está vacía sale del procedimiento
         If NombreNuevaHoja = "" Then Exit Sub
         NombreNuevaHoja = "Ficha Técnica " & NombreNuevaHoja
         HojasEnLibro = DocCalc.getSheets()
         With HojasEnLibro
            If Not .hasByName(NombreNuevaHoja) Then
               'Si no existe la insertamos el final de acuerdo al modelo de hoja que se encuentra
               'en el archivo cuya ruta es la siguiente:
               '¡¡¡Cambiar la ruta!!!
               ArchivoPlantilla = "K:\PEPE_16GB\FORO OOO\FORO CALC\FORO_CALC_EJEMPLO_PLANTILLA.ods"
               .insertNewByName(NombreNuevaHoja, .getCount())
               HojaCreada = .getByIndex(.getCount()-1)
               With HojaCreada
                  'PLANTILLA_01: es el nombre de la hoja que va a servir de modelo. El archivo modelo puede
                  'tener varias hojas y podemos seleccionar la que nos interese
                  .link(ConvertToURL(ArchivoPlantilla), "PLANTILLA_01", "", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
                  .setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
                  'El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado
                  'tendrías que poner los números apropiados de 0 a 255 siendo:
                  'RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
                  'RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
                  'RGB(0, 0, 255) el color AZUL; etc, etc.
                  .TabColor = RGB(AleatorioEntre(0, 255), AleatorioEntre(0, 255), AleatorioEntre(0, 255))
               End With
            Else
               MsgBox "Esta hoja ya existe", 16, "¡Atención!"
            End If
         End With
      End If
   End With
   Exit Sub
CONTROL_ERRORES:
   MsgBox "Se ha producido un error ...", 16, "¡Atención!"
End Sub

Function AleatorioEntre(nDesde As Long, nHasta As Long) As Long
' Devuelve un valor aleatorio entre nDesde y nHasta
' Ver http://blog.open-office.es/basic/macro-aleatorio-entre-para-openoffice-y-libreoffice-basic#more535
   AleatorioEntre = Int((nHasta - nDesde + 1)*Rnd() + nDesde)
End Function


A tener en cuenta:

    - Debes modificar la ruta de la variable "ArchivoPlantilla" por la ruta correcta del archivo que va a servir como modelo o plantilla.
    - "PLANTILLA_01" es el nombre de la hoja que va a servir de modelo dentro del "ArchivoPlantilla". El archivo modelo/plantilla puede tener varias hojas y podemos seleccionar la que nos interese.
    - El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado tendrías que poner los números apropiados de 0 a 255 siendo:
      - RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
      - RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
      - RGB(0, 0, 255) el color AZUL; etc, etc..
Saludos cordiales.
Adjuntos
FORO_CALC_Crear hojas a partir de una columna_v2.ods
LibreOffice Calc
(12.14 KiB) 37 veces
FORO_CALC_EJEMPLO_PLANTILLA.ods
LibreOffice Calc
(9.85 KiB) 37 veces
LibreOffice 6.1.5 en Windows 7 / 10
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Avatar de Usuario
PepeOooSevilla
 
Mensajes: 1066
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Macro que abra una hoja con una plantilla y color de pes

Notapor mauricio » Mar Abr 17, 2018 5:36 pm

Veo más sencillo que tengas la hoja/plantilla en el mismo documento, de forma oculta, y solo se copia y listo...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5827
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Macro que abra una hoja con una plantilla y color de pes

Notapor mauricio » Mar Abr 17, 2018 6:05 pm

Para los que usamos Python e EasyMacro:
https://gitlab.com/mauriciobaeza/easy-m ... s/index-es

Versión con una hoja como plantilla en el mismo documento:
Código: Seleccionar todo   Expandir vistaContraer vista
from libo import LIBO
import random


def main():
    app = LIBO()
    doc = app.doc
    sel = doc.selection
    if not sel.is_cell or sel.column or not sel.value:
        return

    nuevo_nombre = 'Ficha Técnica {}'.format(sel.value)
    if doc.sheets.exists(nuevo_nombre):
        msg = 'La hoja ya existe'
        app.msgbox(msg)
        return

    nueva_hoja = doc.sheets.copy('plantilla', nuevo_nombre)
    nueva_hoja.obj.TabColor = random.randint(10000, 100000)
    return
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5827
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Macro que abra una hoja con una plantilla y color de pes

Notapor labotica » Mar Abr 17, 2018 6:10 pm

Hola, hola y hola!! Y gracias, gracias, gracias! Muchisimas gracias!!! Ya casi lo tengo, y sólo me queda una duda, que en caso de no poder solucionarla, tendría fácil solución. Con esta macro que me has mandado, la he adaptado a lo que realmente necesito que es:
Cada vez que escribo en una casilla de una columna, al darle intro, me abre dos hojas nuevas. Una con la Ficha Técnica y otra con un Escandallo, la primera de color verde y la segunda de color rojo. Tanto en la hoja de la ficha técnica como en la del escandallo, quiero que me abra una plantilla que tengo guardada en mis plantillas, y que uso siempre, para otros archivos también.
Ahora bien, he hecho algun cambio en lo que me has mandado, y funciona todo a la perfección menos una cosa. Como ves, en la macro tengo puesto que el archivo/plantilla del escandallo que me abre en la hoja del escandallo, es un archivo .ods, que está guardado en mi carpeta de Documentos, en cambio, la de la Ficha Técnica, es un archivo .ots, guardado en la carpeta de /Template de libreoffice.
Código: Seleccionar todo   Expandir vistaContraer vista
Sub CrearFichaTecnica()
   Dim DocCalc As Object
   Dim Seleccion As Object
   Dim NombreNuevaHoja As String
   Dim HojasEnLibro As Object
   Dim ArchivoPlantilla As String
   Dim HojaCreada As Object
   
   On Error Goto CONTROL_ERRORES
   DocCalc = ThisComponent
   Seleccion = DocCalc.getCurrentSelection()
   With Seleccion
      'Solo si es una sola celda
      If .supportsService("com.sun.star.sheet.SheetCell") Then
         'También If .getImplementationName() = "ScCellObj" Then
         'Si no es la columna A sale del procedimiento
         'En OOBasic las columnas y filas comienzan en 0 (cero)
         If .getCellAddress.Column <> 2 Then Exit Sub
         NombreNuevaHoja = .getString()
         'Si la celda está vacía sale del procedimiento
         If NombreNuevaHoja = "" Then Exit Sub
         NombreNuevaHoja = "FT " & NombreNuevaHoja
         HojasEnLibro = DocCalc.getSheets()
         With HojasEnLibro
            If Not .hasByName(NombreNuevaHoja) Then
               'Si no existe la insertamos al final
               ArchivoPlantilla = "∕home∕xavi∕.config∕libreoffice∕4∕user∕template∕FichaTecnica2.ods"
               .insertNewByName(NombreNuevaHoja, .getCount())
               HojaCreada = .getByIndex(.getCount()-1)
               With HojaCreada
                  'PLANTILLA_01: es el nombre de la hoja que va a servir de modelo. El archivo modelo puede
                  'tener varias hojas y podemos seleccionar la que nos interese
                  .link(ConvertToURL(ArchivoPlantilla), "FichaTecnica", "", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
                  .setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
                  'El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado
                  'tendrías que poner los números apropiados de 0 a 255 siendo:
                  'RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
                  'RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
                  'RGB(0, 0, 255) el color AZUL; etc, etc.
                  .TabColor = RGB(0, 255, 0)
               End With
            Else
               MsgBox "Esta hoja ya existe", 16, "¡Atención!"
            End If
         End With
         End If
         
      If .supportsService("com.sun.star.sheet.SheetCell") Then
         'También If .getImplementationName() = "ScCellObj" Then
         'Si no es la columna A sale del procedimiento
         'En OOBasic las columnas y filas comienzan en 0 (cero)
         If .getCellAddress.Column <> 2 Then Exit Sub
         NombreNuevaHoja = .getString()
         'Si la celda está vacía sale del procedimiento
         If NombreNuevaHoja = "" Then Exit Sub
         NombreNuevaHoja = "Esc " & NombreNuevaHoja
         HojasEnLibro = DocCalc.getSheets()
         With HojasEnLibro
            If Not .hasByName(NombreNuevaHoja) Then
               'Si no existe la insertamos al final
               ArchivoPlantilla = "/home/xavi/Documentos/Escandallo.ots"
               .insertNewByName(NombreNuevaHoja, .getCount())
               HojaCreada = .getByIndex(.getCount()-1)
               With HojaCreada
                  'PLANTILLA_01: es el nombre de la hoja que va a servir de modelo. El archivo modelo puede
                  'tener varias hojas y podemos seleccionar la que nos interese
                  .link(ConvertToURL(ArchivoPlantilla), "Hoja1", "", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
                  .setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
                  'El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado
                  'tendrías que poner los números apropiados de 0 a 255 siendo:
                  'RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
                  'RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
                  'RGB(0, 0, 255) el color AZUL; etc, etc.
                  .TabColor = RGB(255, 0, 0)
               End With
            Else
               MsgBox "Esta hoja ya existe", 16, "¡Atención!"
            End If
         End With
      End If
     
   End With
   Exit Sub
CONTROL_ERRORES:
   MsgBox "Se ha producido un error ...", 16, "¡Atención!"
End Sub



Pues bien, sólo me funciona la primera (el archivo .ods). Imagino que debe ser porque en donde dice "HojasEnLibro = DocCalc.getSheets()" debo cambiarlo por algo conmo "HojasEnLibro = TemplateCalc.getSheets()" o algo así? Puede ser? No tengo mucha idea, pero como funciona todo perfectamente, menos este pequeño detalle, imaginno que debe ser algo que vaya por ahí.
Es imposible no repetirme: Muchísimas gracias por todo!
OpenOffice 4.0 en Ubuntu 14.04
labotica
 
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: Macro que abra una hoja con una plantilla y color de pes

Notapor labotica » Mar Abr 17, 2018 6:14 pm

Perdón, ya está, ni template ni nada. Era un fallo mío: como no me funcionaba he estado haciendo cambios, y como fallaba justo a partir de donde le decía la ruta del archivo he probado de cambiar la barra /home/... por la que tengo en el teclado numérico ∕home∕...
Loi he cambiado y funciona todo perfecto! Muchas gracias y ahora edito el tema
OpenOffice 4.0 en Ubuntu 14.04
labotica
 
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: [RESUELTO]Macro que abra una hoja con una plantilla y co

Notapor labotica » Mar Abr 17, 2018 6:24 pm

Hola Mauricio, como ya he dicho, no tengo mucha idea, pero eso no quita que me pase las horas que haga falta! Ahora me miraré esto que me has mandado, porque parece la bomba. Sólo por la cantidad de código que se ahorra ya me parece increíble. Gracias y hasta pronto
OpenOffice 4.0 en Ubuntu 14.04
labotica
 
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: [RESUELTO] Macro abra una hoja con una plantilla y color

Notapor mauricio » Mar Abr 17, 2018 6:30 pm

Por acá puedes ver un video de como instalar EasyMacro:
https://forum.openoffice.org/es/forum/v ... 50&t=13062

para poder usar la macro que te muestro, en la misma te pase la documentación de la misma, y aquí estamos por cualquier duda con su uso.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5827
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX


Volver a Calc

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados