Se puede ejecutar una macro dentro de otra macro?

De todoexpertos, perdónenme que sea tan recalcitrante con el tema, pero es que igual a ustedes me gusta la excelencia y me he dado cuenta que a través de Excel, se puede hacer muchas cosas que jamás uno se puede imaginar.

Tengo un libro el cual cuenta con 9 hojas así: Crear Empresa, Análisis Vertical, Análisis Horizontal, Ratios de la Empresa, P.Equilibrio, Diagnóstico, Informe en PDF, Dato Base, PUC.

Este es el cuadro que se abriría al darle clic al botón Empresas.

En resumen necesito que desde el botón empresas, pueda abrir un cuadro de dialogo, escriba el nombre de la empresa, que a su vez sera el nombre del archivo, copie la plantilla con las hojas que requiera y me las guarde en una carpeta especifica.

Respuesta
2

Si se puede, te lo explico con el uso de 2 Userforms: UF1 y UF2.

El UF1 tiene en el botón Empresa una instrucción de este tipo:

Private Sub CommandButton1_Click()   
Me.Hide          'oculta el UF1
Userform2.Show   'muestra el UF2
End Sub

El UF2 hace su tarea con total normalidad como si fuese el único formulario abierto. Solo debes tener en cuenta que ante el botón u opción de cierre o fin de tareas, debes volver a mostrar el UF1.

Por ej, si el UF2 se puede cerrar desde la X del extremo superior derecho, necesitarás estas instrucciones:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Userform1.Show     'volver a mostrar el UF1 oculto
End Sub

Es decir que se cierra el UF2 y se vuelve a mostrar el UF1 con todos sus controles tal como los dejaste.

Si por alguna razón necesitas que algún valor debe ser pasado de un UF a otro, deja una nueva consulta puntual y con mucho gusto seguiré con el ejemplo.

Olvidé mencionar: que si no se trata de un UF1 sino de un botón dibujado en la misma hoja, la instrucción es llamar al UF2. Y allí debes diseñar lo que mostrás como 'cuadro'.

Y este formulario cuando termine de realizar todas sus tareas se cierra sin más. Solo tené presente a qué hoja debe volver: por ejemplo:


Sheets("Empresa").Select
End Sub

Sdos!

Elsa muchas gracias por tu aporte. Esta macro me la envío mi amigo Dante amor, cuya función es copiar una plantilla con las hojas que requiera y me las guarda en una hoja especifica.

Sub CopiarHojas()

'Por.Dante Amor

    Application.ScreenUpdating = False

    Application.DisplayAlerts = False

    '

    'Carpeta específica

    ruta = "D:\INFORMACION\Desktop\Empresas\"

    'ruta = "C:\trabajo\"

    '

    'Escribir hojas

    Sheets(Array("Análisis Vertical", _

    "Análisis Horizontal", "Ratios de la Empresa", "P.Equilibrio", _

    "Diagnóstico", ”Informe en PDF”, ”Dato Base”,  "PUC")). Copy

    '

    p = InStrRev(ThisWorkbook.Name, ".")

    arch = Left(ThisWorkbook.Name, p - 1)

    '

    n = 1

    Do While True

        nombre = ruta & arch & " " & n & ".xls"

        If Dir(nombre) = "" Then

            Exit Do

        End If

        n = n + 1

    Loop

    ActiveWorkbook.SaveAs Filename:=nombre, _

        FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

    ActiveWorkbook.Close

End Sub

Lo que necesito es que antes que se ejecute esta macro, pueda hacer lo que dije en la consulta

Bien, te dejo la macro explicada y los pasos para crear un Userform: Si nunca has diseñado un Userform podes solicitarme el modelo a mi correo.

Public arch As String
Sub CopiarHojas()
'Por.Dante Amor - ajustada x Elsamatilde
'EM:se llama al UF para establecer el nombre del archivo a guardar
UserForm1.Show
'EM:se comprueba si textbox está vacío y en ese caso cancela el proceso
If arch = "" Then
    MsgBox "No se ingresó nombre para la archivo. El proceso se cancela."
    Exit Sub
End If
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    'Carpeta específica
    ruta = "D:\INFORMACION\Desktop\Empresas\"     'EM:confirmar ruta
    'Escribir hojas
    Sheets(Array("Análisis Vertical", _
    "Análisis Horizontal", "Ratios de la Empresa", "P.Equilibrio", _
    "Diagnóstico", "Informe en PDF", "Dato Base", "PUC")).Copy
'EM: ya se tiene el nombre del archivo
'si se necesita guardar con un índice mantener las líneas siguientes,
'sino retirarlas hasta ----------------
    Do While True
        nombre = ruta & arch & " " & n & ".xls"
        If Dir(nombre) = "" Then
            Exit Do
        End If
        n = n + 1
    Loop
'-------------------
'EM:controlar posible error en el nombre
On Error GoTo sinCopia
    ActiveWorkbook.SaveAs Filename:=nombre, _
        FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    ActiveWorkbook.Close
Exit Sub
sinCopia:
MsgBox "No se pudo guardar la copia con ese nombre. Ejecute el proceso nuevamente."
'EM: se cierra el libro creado sin guardarlo 'ver *
ActiveWorkbook.Close False
End Sub
'* se puede dejarlo abierto y guardarlo manualmente asignandole el nombre correcto

 Es importante que dejes la primer línea donde se define una variable pública que guardará el texto ingresado en el Userform para trabajarlo en la macro.

Para crear un Userform:

Entrar al Editor y desde menú Insertar, Userform.

Dibujar dentro un control Label (instrucciones), un Textbox y un botón de comando.

Doble clic sobre el botón y copiar estas instrucciones:

Private Sub CommandButton1_Click()
'x Elsamatilde
'al aceptar se guarda el valor del textbox en
'una variable pública y se cierra el UF
arch = TextBox1
Unload Me
End Sub

Solo controlar en la macro que el nombre del Userform que se llama coincida con el que acabas de diseñar.

Ya te envié modelo de formulario con explicaciones. Confirma si lo recibiste. Luego no olvides valorar esta respuesta.

Sdos!

¡Gracias! Elsa, verdaderamente personas como tu hacen que cada día se sienta uno más motivado en aprender mucho sobre el maravilloso mundo de las macros. Gracias, gracias. Dios te bendiga abundantemente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas