Excel - Cambiar de libro excel con vba

   
Vista:

Cambiar de libro excel con vba

Publicado por Javier (1 intervención) el 06/02/2018 09:43:43
Hola y gracias de antemano.

El problema que tengo es al manipular diferentes libros con vba.

Libro1, mediante una macro, abre Libro2 con la instrucción Workbooks.Open. Lo que necesito es que una macro que se ejecuta desde Libro2 al mismo tiempo en que este se abre, cierre Libro1 y lo elimine.

El problema es que cuando Libro2 cierra Libro1 se detiene la ejecucción del código y no pasa de ahí.
He probado a activar Libro2 con la instrucción Workbooks(Libro2.Name ).Activate antes de cerrar Libro1, pero sigue ocurriendo lo mismo.

He probado con las instrucciones Run y Call para ejecutar macros que se encuentran en distintos libros del que tienes seleccionado.

Call no funciona porque la macro que se tiene que ejecutar se encuentra en Libro2 pero se la llamaria desde Libro1.

Y Run si funciona pero surge el problema que he comentado.

Gracias.
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

Cambiar de libro excel con vba

Publicado por Antoni Masana (889 intervenciones) el 06/02/2018 12:14:17
Como bien has podido comprobar lo que quieres hacer no funciona.

Para hacer un símil te subes a un árbol te montas en una rama e intentas cortar el árbol sin caerte, y aunque pongas otro árbol, este cuelga del primero y no puedes cortar el primero sin que caiga el segundo.

Ahora la cuestión es ¿Para qué quieres hacer esto? o dicho de otra forma ¿Que pretendes hacer? se podría hacer otras cosas que si funcionarían pero hace falta saber la finalidad.

Saludos.
\\//_
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

Cambiar de libro excel con vba

Publicado por Javier (7 intervenciones) el 06/02/2018 12:57:46
Hola Antoni Masana, gracias por tu respuesta.

Veras, en mi empresa me ha pedido construir un programa en excel que utlizará mucha gente, este programa consta de diferentes archivos, uno principal del que cada usuario tendrá una copia en su ordenador . Este archivo principal consta de varios botones que ponen en marcha diferentes macros. Esta macros a su vez exportan e importan datos de diferentes libros que se guardan en la intranet de la empresa.

Lo que pasa, es que si yo modifico algo del programa principal, todo el mundo debe descargarse la nueva copia, y eso sería un follon pues somos más de 80. Lo que quiero es hacer que el programa principal, al abrirse, detecte si hay una nueva versión en la intranet de la empresa, y si la hay, elimine el archivo del ordendador del usuario y se descargue una nueva copia.

Tengo ya casi todos los pasos construidos, el único que me falta es hacer lo que digo en la pregunta, conseguir que el libro que se abre, elimine al primero que estaba abierto.

Gracias por su tiempo.
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
Imágen de perfil de Antoni Masana

Cambiar de libro excel con vba

Publicado por Antoni Masana (889 intervenciones) el 08/02/2018 11:23:00
Te envío dos libros con los que he realizado la prueba.

A mi me ha funcionado.

Te cuento como funciona porque es rebuscado.

Tenemos el Libro1 y el Libro2 con dos versiones diferente, un texto en la celda A1 de la Hoja1.

Abrimos el Libro1

- Comprueba s1 se llema Libro2 que es la actualización en caso afirmativo finaliza.
- Comprueba si hay un actualización disponible (Libro2) en caso negativo finaliza.
- Abre el libro2 y verifica las versiones. En mi ejemplo la Celda A1

Voy a explicar primero si Son diferentes para entender mejor si son iguales

- Crea un BAT que se llama LiveUpdate.bat que espera 5 segundos para dar tiempo a que se cierre el excel, copia el Libro2 como Libro1 y lo vuelve a abrir el Excel con el Libro1
- Cierra el Libro2
- Ejecuta el BAT con un START para sevíncularlo del Excel y no se muera
- Cierra el Excel

Cuando se vuelve a abrir el Libro1 vuelve a comprobar si hay una actualización y en este caso no la hay porque lo acabamos de actualizar, es decir Libro1 y Libro2 son la misma versión

- Si existe el fichero LiveUpdate.BAT es que me acaban de actualizar y confirmo la actualización y borro el LiveUpdate.bat.
- En caso contrario informo que no hay cambios

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Option Explicit
 
Private Sub Workbook_Open()
    Dim Mi_Nombre As String, Mi_Version As String, Mi_Fichero
 
    Mi_Nombre = ActiveSheet.Parent.Name
    Mi_Fichero = ActiveSheet.Parent.FullName
    Mi_Version = Sheets("Hoja1").Range("A1")                                   '<--
 
    ' --- Soy yo mismo
 
    If Mi_Nombre = "Libro2.xlsm" Then Exit Sub                                 '<--
 
    ' --- No encuentro una actualizacion
 
    If Dir("C:\zzz\Libro2.xlsm") = "" Then Exit Sub                            '<--
 
    ' --- Abro la actualizacion
 
    Workbooks.Open Filename:="C:\zzz\Libro2.xlsm", _                           '<--
                   Origin:=xlWindows
 
    ' --- Comparo la Version
 
    If Mi_Version = Workbooks("Libro2.xlsm").Sheets("Hoja1").Range("A1") Then  '<--
 
       ' --- Si hay LIVUPDATE es que soy nuevo por aqui
 
       If Dir("C:\Tmp\LiveUpdate.bat") = "" Then                               '<--
          MsgBox "Son de la misma Version"                                     '<--
          Workbooks(Mi_Nombre).Activate
          Workbooks("Libro2.xlsm").Close                                       '<--
       Else
          MsgBox "Se ha actualizado la Version", vbInformation + vbOKOnly
          Kill ("C:\Tmp\LiveUpdate.bat")                                       '<--
 
          Workbooks(Mi_Nombre).Activate
          Workbooks("Libro2.xlsm").Close                                       '<--
 
          Workbooks(Mi_Nombre).Activate
       End If
 
    Else      ' --- Prepado el IiveUpdate para actualizar
 
       Open "C:\Tmp\LiveUpdate.bat" For Output As #1                           '<--
          Print #1, "@echo off"
          Print #1, "TimeOut /T 5 /NoBreak >nul"
          Print #1, "copy C:\zzz\Libro2.xlsm " & Mi_Fichero & " >nul"          '<--
          Print #1, "START Excel " & Mi_Fichero
          Print #1, "Exit"
       Close #1
 
       Workbooks("Libro2.xlsm").Close                                          '<--
 
       Shell "CMD /C Start /MIN C:\Tmp\LiveUpdate.bat"                         '<--
 
       Application.Quit
    End If
End Sub

Te marco las líneas en las que has de poner especial atención para adaptarlo a tus necesidades

En la MACRO falta un parámetro en el START, no lo he puesto para ver que funciona bien. Si le pones el /MIN no se vera la ventana de MSDOS.

Lo primero de todo copia el Libro1 en un directorio de trabajo. Abrelo y revisa la macro. Copia el Libro2 en el directorio C:\ZZZ. Cierra el Libro1 y vuelve a abrirlo, si todo esta bien se actualizada.

El Libro1 en la celda A1 de la hoja1 pone: "Soy el libro 1"
El Libro2 en la celda A1 de la hoja1 pone: "Soy el libro 2"

Esto te servida como referencia para ver si actualiza

Ya me contaras como te va.

Saludos.
\\//_
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

Cambiar de libro excel con vba

Publicado por Javier (7 intervenciones) el 13/02/2018 10:27:13
Hola Antoni, muchas gracias por tu respuesta.

He tardado un poco porque he tenido unos días bastante ajetreados en el trabajo.

He descargado los libros y voy a comenzar a hacer pruebas, te voy contando.

Saludos.
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

Cambiar de libro excel con vba

Publicado por Javier (7 intervenciones) el 14/02/2018 14:03:08
Hola Antoni.

El código funciona perfectamente, muchas gracias, me has salvado la vida, me estaba volviendo loco, la verdad que ni se me había ocurrido usar DOS.

Pero ocurre una cosa, al modificarlo para adaptarlo a lo que tengo hecho, en la última parte

1
2
3
4
5
6
7
Open "C:\Users\Downloads\Nueva\LiveUpdate.bat" For Output As #1
	Print #1, "@echo off"
	Print #1, "TimeOut /T 5 /NoBreak >nul"
	Print #1, "copy C:\Users\Downloads\Nueva\Libro2.xlsm " & ActiveSheet.Parent.FullName & " >nul"
	Print #1, "START Excel " & ActiveSheet.Parent.FullName
	Print #1, "Exit"
Close #1

Si el nombre de la carpeta donde está guardado Libro1 contiene espacios, del tipo "Nueva Carpeta (1)" por ejemplo,
el código intenta hacer una copia del Libro2 por cada palabra del nombre de la carpeta.

Me explico, si guardo Libro1 en una carpeta que se llame Nueva Carpeta 1 por ejemplo, al ejecutarlo aparece un error que dice:
- lo sentimos, no hemos encontrado C:\Users\Downloads\Nueva.xlsx . . .
Al cerrar este recuadro aparece otro que dice:
- lo sentimos, no hemos encontrado C:\Users\Downloads\Carpeta.xlsx . . .

Y así sucesivamente. Tengo que pedir disculpas por mi total desconocimiento en DOS

Podría decirme si hay alguna forma de resolver esto??

Muchas gracias por su tiempo, saludos.
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
Imágen de perfil de Antoni Masana

Cambiar de libro excel con vba

Publicado por Antoni Masana (889 intervenciones) el 14/02/2018 16:09:18
Te pongo parte del código para indicar los cambios. Los cambios los pongo en negrita.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Private Sub Workbook_Open()
    Dim Origen as String, Mi_Fichero as String, Mi_Nombre As String, _
        Destin as String, Mi_Version As String
    ...
        ' ---&--- Chr$(34) es el carácter Comillas "
 
        Origen = Chr$(34) & "C:\Users\Downloads\Nueva\Libro2.xlsm" & Chr$(34)
        Destin = Chr$(34) & Mi_Fichero & Chr$(34)
 
       Open "C:\Users\Downloads\Nueva\LiveUpdate.bat" For Output As #1
          Print #1, "@echo off"
          Print #1, "TimeOut /T 5 /NoBreak >nul"
          Print #1, "copy " & Origen & " " & Destin & " >nul" 
          Print #1, "START Excel " & Destin
          Print #1, "Exit"
       Close #1
       ...
       Application.Quit
    End If
End Sub

Para probar que este bien Prueba esta macro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Option Explicit
 
Private Sub Prueba()
    Dim Origen as String, Mi_Fichero as String, Mi_Nombre As String, _
        Destin as String, Mi_Version As String
 
    Mi_Nombre = ActiveSheet.Parent.Name
    Mi_Fichero = ActiveSheet.Parent.FullName
    Mi_Version = Sheets("Hoja1").Range("A1")                                   '<--
 
    Origen = Chr$(34) & "C:\Users\Downloads\Nueva\Libro2.xlsm" & Chr$(34)
    Destin = Chr$(34) & Mi_Fichero & Chr$(34)
 
    MsgBox "copy " & Origen & " " & Destin & " >nul"
End Sub


Deberías de ver algo así, los nombre de fichero origen y destino entre comillas

1
COPY  "C:\Users\Downloads\Nueva\Libro2.xlsm"  "C:\Users\Downloads\Nueva Carpeta(1)\libro1.xlsm" >nul

Y esto soluciona el problema de los espacios.

Saludos.
\\//_
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

Cambiar de libro excel con vba

Publicado por Javier (7 intervenciones) el 15/02/2018 14:56:28
Hola Antoni, funciona perfectamente, ya lo he adaptado a lo que tengo y todo perfecto.

Esto me ha recordado que tengo que estudiar a fondo las instrucciones y comandos DOS.

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
Revisar política de publicidad