Macro: al abrir libro que se abra otro si no está ya abierto.

El tema es el siguiente: Tengo un libro llamado Control en el que se ejecuta un BUSCARV en una matriz de otro libro ( =SI.ERROR(BUSCARV([@[Núm.]];CLIENTS;F$2);"") ) donde CLIENTS  es un nombre que hace referencia a ( ='00 - CLIENTS.xlsm'!Tabla1[#Datos] ); pero con esta función para que se actualicen los datos de forma inmmediata tengo te tener los dos libros abiertos...
He probado la otra opción de sustituir CLIENTS por la ruta i el rango de la tabla ('C:\Users\Fede\Desktop\00 - GESTIO CLIENTS\[00 - CLIENTS.xlsm]CLIENTS'!$B$6:$BH$5006) y en esta ocasión los datos se actualizan immediatamente sin necesidad de que estén abiertos los 2 libros.

El problema de esta opción es que cuando quiero cambiar los archivos de carpetas, tengo que cambiar todas las formulas con la nueva ruta, mientas que en la primera opción, con solo cambiar la ruta del nombre de la matriz soluciona el problema.
Entonces, para que se abra el libro 00 - CLIENTS. Xlsm automaticamente al abrir el libro Control he añadido esta macro en Workbook_open:

Private Sub Workbook_Open()
Set ARCHIVO = CreateObject("Scripting.FilesystemObject")
NOMBRE_ARCHIVO = Sheets("Conf.").Range("E8")
If ARCHIVO.FILEEXISTS(NOMBRE_ARCHIVO) Then
    Workbooks.Open NOMBRE_ARCHIVO
End If
ThisWorkbook.Activate
End Sub

Y lo que quisiera es que si ese libro ya se encontrara abierto, directamente que ignorara este procedimiento. ¿Cuál sería la instrucción que debiera utilizar?

Por otro lado, existe alguna forma de disponer de forma permanente los datos del libro 00 - CLIENTS. ¿xlsm en otros libros de forma que aunque se cambien de carpeta (incluso de PC) sigan existiendo los vinculos creados entre ellos?

1 respuesta

Respuesta
1

Podés probar intentando acceder al archivo controlando el error, te dejo como podrías modificar el código

Private Sub Workbook_Open()
On Error Goto archivoCerrado
NOMBRE_ARCHIVO = Sheets("Conf.").Range("E8")
WorkBooks(NOMBRE_ARCHIVO).Select
ThisWorkBook.Activate
Exit Sub
archivoCerrado:
 Set ARCHIVO = CreateObject("Scripting.FilesystemObject")
 If ARCHIVO.FILEEXISTS(NOMBRE_ARCHIVO) Then
     Workbooks.Open NOMBRE_ARCHIVO
 End If
 Set ARCHIVO = Nothing
 ThisWorkbook.Activate
End Sub

Ups... Algo no acaba de funcionar.
Sigue indicando que el archivo ya está abierto y que si lo vuelvo a abrir perderé los cambios no guardados. Por lo tanto en ese codigo no ignora el hecho de que esté abierto el segundo libro.
Al clicar sobre el no volver a abrir  el archivo, me lanza un error 1004 en tiempo de ejecución que al depurarlo me manda a la línea

Workbooks.Open NOMBRE_ARCHIVO

¿Que estamos haciendo mal?

¿El código está bien pero lo que no estoy seguro es en que archivo lo estás poniendo? Esa macro debe estar en el libro "Control" y para que te funcione lo tienes que cerrar y volver a abrir (porque esté en el evento Open del libro).

Lo que puedes hacer para estar seguros de como está funcionando es poner la instrucción Stop que detendrá tu código para que puedas hacer un seguimiento "paso a paso". Esta instrucción una vez que estés seguro que funciones la quitas y ya. El código quedaría

Private Sub Workbook_Open()
On Error Goto archivoCerrado
Stop
Err.Clear          'limpia el código de error (en caso que haya alguno)
NOMBRE_ARCHIVO = Sheets("Conf.").Range("E8")
WorkBooks(NOMBRE_ARCHIVO).Select
ThisWorkBook.Activate
Exit Sub
archivoCerrado:
 Set ARCHIVO = CreateObject("Scripting.FilesystemObject")
 If ARCHIVO.FILEEXISTS(NOMBRE_ARCHIVO) Then
     Workbooks.Open NOMBRE_ARCHIVO
 End If
 Set ARCHIVO = Nothing
 ThisWorkbook.Activate
End Sub

Porque lo que puede ser es que detecto "otro error", pero como está armado el código igual lo mandaría a abrir el libro (Por eso además agregué la instrucción Err.Clear

Ciertamente el código lo coloco en el archivo Control. Y tras probar el Stop y avanzar "paso a paso" (F8) me sigue lanzando el error 1004 en tiempo de ejecución: Error en el método 'Open' de objeto 'Workbooks'.
No debería de ser otra instrucción If para el caso de que el archivo ya estuviera abierto?

Es que si el archivo ya está abierto no debería llegar a ese lugar porque saldría antes por el "Exit Sub", pero creo que ya se donde está el error. Reemplaza la instrucción

WorkBooks(NOMBRE_ARCHIVO).Select

por 

WorkBooks(NOMBRE_ARCHIVO).Activate

Hola de nuevo. Negativo. Por alguna razón no debería llegar a ese lugar, pero sigue llegando. Incluso habiendo hecho escambio del Select por el Activate.
Lamento ser tu pesadilla! ;)

Para que llegue a ese lugar, se tiene que "disparar" la instrucción del error. Fijate cual es la instrucción que tiene el error (estoy casi seguro que tenés algún error en el nombre del archivo y eso es lo que falla)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas