Visual Basic para Aplicaciones - Cerrar otros archivos excel desde VBA

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Cerrar otros archivos excel desde VBA

Publicado por Eduardol (35 intervenciones) el 10/01/2018 00:39:31
Hola.

Tengo un problema con mi codigo.

Les comento, tengo un Libro de Excel, que ejecuta una macro que vincula datos a unos formularios de Word y excel. Aqui solamente voy a escribir la parte del código que involucra a EXCEL.

El código basicamente lo que hace es llamar a los unos archivos Excel, y los imprime. La primera parte del código abre un archivo que se llama F63160 y llama a una macro que tiene ese archivo. Esta macro se llama ImprimeComisiones.

El problema es que una vez que ejecuta esa parte del codigo y una vez que cierra ese archivo la macro se interrumpe como si nada, sin revelar ningún error. Creo que lo que hace es cerrar el ObjExcel que esta declarado en la variable y no lo vuelve a ejecutar.

He intentado declarar otro objExcel pero no tuve exito.

También he eliminado la linea de código que cierra el archivo y he puesto ActiveWorkbook.Close SaveChanges:=False, al final de la macro principal, pero ademas de cerrar los dos archivos abiertos, cierra ademas el archivo principal, que es desde donde se ejecuta la macro y no debería cerrarse.

Espero sus comentarios.




Dim ObjExcel As Excel.Application
Dim relativePath As String
Dim F63160 As String

relativePath = ThisWorkbook.Path & "\" & "F63160" & ".xlsm"

If Worksheets("Solicitud").Range("Z14").Value = True Then

Set ObjExcel = CreateObject("Excel.Application")
ObjExcel.Application.Visible = False

Application.PrintCommunication = False

Workbooks.Open Filename:=relativePath, UpdateLinks:=3

Application.Run ("'" & relativePath & "'!ImprimeComisiones")

Sub ImprimeComisiones()

'ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
Dim T1 As String, T2 As String, T3 As String, T4 As String, T5 As String, T6 As String, T7 As String, T8 As String, T9 As String, T10 As String, T11 As String


T1 = "Ctas.Ctes": T2 = "C.deAh.": T3 = "Cta.Esp. y a la vista": T4 = "T.Débito": T5 = "Gs.y Tr.": T6 = "Tar.Crédito"
T7 = "Paquetes": T8 = "C.Seguridad": T9 = "Títulos y Valores": T10 = "O-Com-Cargos": T11 = "Hoja1"


Select Case Worksheets(T11).Range("A1").Value
Case 1: Sheets(Array(T1, T4, T5, T10)).Select 'Cuentas Corrientes
Case 2: Sheets(Array(T2, T4, T5, T10)).Select 'Cuentas Caja de Ahorros
Case 3: Sheets(Array(T3, T4, T5, T10)).Select 'Cuentas Corrientes Especiales
Case 4: Sheets(Array(T2, T4, T5, T6, T7, T10)).Select 'Paquete Cuenta Simple
Case 5: Sheets(Array(T1, T2, T4, T5, T6, T7, T10)).Select 'Paquete Cuenta Estilo Con Cta Cte
Case 6: Sheets(Array(T2, T4, T5, T10)).Select 'Caja de Ahorros y Cuenta Comitente
Case 7: Sheets(Array(T6, T2, T4, , T5, T10)).Select 'Tarjeta de Credito Con Caja de Ahorros
Case 8: Sheets(Array(T6)).Select 'Tarjeta de Credito Con Caja de Ahorros


End Select
'Sheets(T11).Activate

Application.PrintCommunication = False



ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False
Sheets(T11).Select

Workbooks("F63160.xlsm").Close SaveChanges:=False



End Sub

´Hasta aca es la Macro llamada ImprimeComisiones


End If <<------------------------EL ERROR COMIENZA AQUI

'Aqui deberia ejecutar el siguiente IF, pero no hace nada


If Worksheets("Solicitud").Range("Z21").Value = True Then

Set ObjExcel = CreateObject("Excel.Application")
ObjExcel.Application.Visible = False

Application.PrintCommunication = False

Workbooks.Open Filename:=Rutaxls2, UpdateLinks:=3

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False


End If

'Workbook.Close SaveChanges:=0


End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Cerrar otros archivos excel desde VBA

Publicado por Antoni Masana (498 intervenciones) el 10/01/2018 11:59:31
El problema que tienes es de concepto, de entender que hace exactamente.

Te pongo tu código de forma que se lea un poco mejor y para poder indicar la línea donde esta el fallo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Macro_1()
    Dim ObjExcel As Excel.Application
    Dim relativePath As String
    Dim F63160 As String
 
    relativePath = ThisWorkbook.Path & "\" & "F63160" & ".xlsm"
 
    If Worksheets("Solicitud").Range("Z14").Value = True Then
        Set ObjExcel = CreateObject("Excel.Application")
        ObjExcel.Application.Visible = False
        Application.PrintCommunication = False
        Workbooks.Open Filename:=relativePath, UpdateLinks:=3
        Application.Run ("'" & relativePath & "'!ImprimeComisiones")
        ' --- Hasta aca es la Macro llamada ImprimeComisiones
    End If <<------------------------EL ERROR COMIENZA AQUI
 
    ' --- Aqui deberia ejecutar el siguiente IF, pero no hace nada
 
    If Worksheets("Solicitud").Range("Z21").Value = True Then
        Set ObjExcel = CreateObject("Excel.Application")
        ObjExcel.Application.Visible = False
        Application.PrintCommunication = False
        Workbooks.Open Filename:=Rutaxls2, UpdateLinks:=3
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
    End If
    'Workbook.Close SaveChanges:=0
End Sub

Hasta aquí la primera macro que abre un libro le pasa el control al libro y espera que se lo devuelvan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub ImprimeComisiones()
    ' ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
 
    Dim T1 As String, T2 As String, T3 As String, T4 As String, T5 As String, _
        T6 As String, T7 As String, T8 As String, T9 As String, T10 As String, _
        T11 As String
 
    T1 = "Ctas.Ctes"
    T2 = "C.deAh."
    T3 = "Cta.Esp. y a la vista"
    T4 = "T.Débito"
    T5 = "Gs.y Tr."
    T6 = "Tar.Crédito"
    T7 = "Paquetes"
    T8 = "C.Seguridad"
    T9 = "Títulos y Valores"
    T10 = "O-Com-Cargos"
    T11 = "Hoja1"
 
    Select Case Worksheets(T11).Range("A1").Value
        Case 1: Sheets(Array(T1, T4, T5, T10)).Select             'Cuentas Corrientes
        Case 2: Sheets(Array(T2, T4, T5, T10)).Select             'Cuentas Caja de Ahorros
        Case 3: Sheets(Array(T3, T4, T5, T10)).Select             'Cuentas Corrientes Especiales
        Case 4: Sheets(Array(T2, T4, T5, T6, T7, T10)).Select     'Paquete Cuenta Simple
        Case 5: Sheets(Array(T1, T2, T4, T5, T6, T7, T10)).Select 'Paquete Cuenta Estilo Con Cta Cte
        Case 6: Sheets(Array(T2, T4, T5, T10)).Select             'Caja de Ahorros y Cuenta Comitente
        Case 7: Sheets(Array(T6, T2, T4, , T5, T10)).Select       'Tarjeta de Credito Con Caja de Ahorros
        Case 8: Sheets(Array(T6)).Select                          'Tarjeta de Credito Con Caja de Ahorros
    End Select
 
    'Sheets(T11).Activate
 
    Application.PrintCommunication = False
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False
    Sheets(T11).Select
 
    Workbooks("F63160.xlsm").Close SaveChanges:=False
End Sub

Y esta es la segunda macro. y el problema esta en la línea 38

¿Que hace esta macro después de cerrar el libro F63160.xlsm? NADA

ABSOLUTAMENTE NADA. y ese es el problema que no vuelve a la macro que la llamo.

Ahora que ya sabemos la causa la pregunta ¿Como se soluciona?
La solución depende la siguiente cuestión: ¿Si abre el libro F63160.xlsm de forma manual, se ejecuta la macro ImprimeComisiones y al finalizar debe cerrar el libro?


Si la respuesta es NO cambiamos el cierre de sitio

1
2
3
4
5
6
7
8
9
10
11
12
Sub Macro_1()
...
    If Worksheets("Solicitud").Range("Z14").Value = True Then
        Set ObjExcel = CreateObject("Excel.Application")
        ObjExcel.Application.Visible = False
        Application.PrintCommunication = False
        Workbooks.Open Filename:=relativePath, UpdateLinks:=3
        Application.Run ("'" & relativePath & "'!ImprimeComisiones")
        Workbooks("F63160.xlsm").Close SaveChanges:=False
    End If
...
End Sub

1
2
3
4
Sub ImprimeComisiones()
...
    Sheets(T11).Select
End Sub

Cambiamos de sitio el cierre del libro.


Si la respuesta es SI

1
2
3
4
5
6
7
8
9
10
11
12
Sub Macro_1()
...
    If Worksheets("Solicitud").Range("Z14").Value = True Then
        Set ObjExcel = CreateObject("Excel.Application")
        ObjExcel.Application.Visible = False
        Application.PrintCommunication = False
        Workbooks.Open Filename:=relativePath, UpdateLinks:=3
        Application.Run ("'" & relativePath & "'!Imprime_Comisiones_2(0)")
        Workbooks("F63160.xlsm").Close SaveChanges:=False
    End If
...
End Sub

1
2
3
4
5
6
7
8
9
Sub ImprimeComisiones()
    Call Imprime_Comisiones_2 (0)
    Workbooks("F63160.xlsm").Close SaveChanges:=False
End Sub
 
Sub Imprime_Comisiones_2 (Nulo as Byte)
...
    Sheets(T11).Select
End Sub

El libro F63160.xlsm solo vera la macro ImprimeComisiones la segunda macro no se ve porque tiene parametros.
Lo que no se es como llamar a la macro de otro libro pasando parametros y si funciona.
Tuve este problema y la solución fue crear un fichero temporal antes de llamar a la segunda macro y borrarlo después.
La segunda macro verificaba si existía la marca y hacia una cosa si existia y otras si no existáa, por ejemplo Cerra el libro o mostrar ciertos mensajes.

No se si queda claro la explicación.

Un detalle: Cuando en una macro pone ... es para indicar que hay codigo que omito para que no sea muy largo el mensaje.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Cerrar otros archivos excel desde VBA

Publicado por Eduardol (35 intervenciones) el 24/01/2018 02:36:08
Gracias Antoni. Por suerte pude solucionarlo de otra forma. Al terminar, lo escribi asi y funciona bien

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
If Worksheets("Solicitud").Range("Z14").Value = True Then
 
    Set ObjExcel = Workbooks.Open(relativePath, UpdateLinks:=3)
 
    'Set ObjExcel = CreateObject("Excel.Application")
        'ObjExcel.Application.Visible = False
 
        Application.PrintCommunication = False
        'Workbooks.Open Filename:=relativePath, UpdateLinks:=3
        Application.Run ("'" & relativePath & "'!ImprimeComisiones")
        ActiveWorkbook.Close SaveChanges:=0
 
End If
 
If Worksheets("Solicitud").Range("Z21").Value = True Then
 
    Set ObjExcel = Workbooks.Open(Rutaxls2, UpdateLinks:=3)
        Application.PrintCommunication = False
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
        ActiveWorkbook.Close SaveChanges:=0
 
End If
 
If Worksheets("Solicitud").Range("Z26").Value = True Then
 
    Set ObjExcel = Workbooks.Open(Rutaxls3, UpdateLinks:=3)
        Application.PrintCommunication = False
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
        ActiveWorkbook.Close SaveChanges:=0
 
End If
 
If Worksheets("Solicitud").Range("Z12").Value = True Then
 
    Set ObjExcel = Workbooks.Open(Rutaxls1, UpdateLinks:=3)
        Application.PrintCommunication = False
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
        ActiveWorkbook.Close SaveChanges:=0
 
End If

Como siempre MUCHAS GRACIAS!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar