Quan penseu a obrir automàticament els llibres d'Excel, tingueu en compte què pot passar si intenteu obrir un llibre que ja està obert. Al món que no és VBA, Excel intenta obrir el fitxer de nou, amb el missatge que es mostra advertint que es perdran els canvis no desats. Podeu protegir-vos d'aquesta ocurrència comprovant si un fitxer ja està obert abans d'intentar-lo de nou.

Eviteu aquest missatge d'advertència.
Com funciona la macro
El primer que cal notar d'aquesta macro és que és una funció, no un procediment Sub. Com veureu, fer d'aquesta macro una funció us permet passar-li qualsevol nom de fitxer per comprovar si aquest fitxer ja està obert.
L'essencial d'aquest codi és senzill. Esteu provant un nom de fitxer determinat per veure si es pot assignar a una variable Object. Només els llibres de treball oberts es poden assignar a una variable Object. Quan intenteu assignar un llibre de treball tancat a la variable, es produeix un error.
Si es pot assignar el llibre de treball donat, el llibre de treball està obert; si es produeix un error, el llibre de treball es tanca.
Funció FileIsOpenTest(TargetWorkbook As String) Com a booleà
"Pas 1: declara les teves variables
Dim TestBook com a llibre de treball
"Pas 2: digueu a Excel que reprendrà en cas d'error
En cas d'error Reprèn Següent
"Pas 3: intenteu assignar el llibre de treball de destinació a TestBook
Set TestBook = Llibres de treball (TargetWorkbook)
"Pas 4: si no s'ha produït cap error, el llibre de treball ja està obert
Si Err.Number = 0 Aleshores
FileIsOpenTest = Veritable
Altrament
FileIsOpenTest = Fals
Acaba si
Funció final
El primer que fa la macro és declarar una variable String que contindrà el nom del fitxer que tria l'usuari. TestBook és el nom de la vostra variable String.
Al pas 2, indiqueu a Excel que pot haver-hi un error executant aquest codi i, en cas d'error, reinicieu el codi. Sense aquesta línia, el codi simplement s'aturaria quan es produeix un error. De nou, proveu un nom de fitxer determinat per veure si es pot assignar a una variable Object. Si es pot assignar el llibre de treball donat, està obert; si es produeix un error, es tanca.
Al pas 3, intenteu assignar el llibre de treball donat a la variable TestBook Object. El llibre de treball que intenteu assignar és una variable de cadena anomenada TargetWorkbook. TargetWorkbook es passa a la funció a les declaracions de funció (vegeu la primera línia del codi). Aquesta estructura elimina la necessitat de codificar el nom d'un llibre de treball, cosa que us permet passar-lo com a variable.
Al pas 4, simplement comproveu si s'ha produït un error. Si no s'ha produït cap error, el llibre de treball està obert, de manera que configureu FileIsOpenTest en True. Si s'ha produït un error, el llibre de treball no està obert i establiu FileIsOpenTest a False.
De nou, aquesta funció es pot utilitzar per avaluar qualsevol fitxer que li passeu, mitjançant el seu argument TargetWorkbook. Aquesta és la bellesa de posar la macro en una funció.
La macro següent mostra com implementar aquesta funció. Aquí, truqueu a la nova funció FileIsOpenTest per assegurar-vos que l'usuari no pot obrir un fitxer ja obert:
Sub macro1()
"Pas 1: defineix una variable de cadena
Dim FName com a variant
Dim FNFileOnly com a cadena
"Pas 2: el mètode GetOpenFilename activa el quadre de diàleg
FName = Application.GetOpenFilename (_
FileFilter:="Llibres de treball d'Excel,*.xl*", _
Títol:="Tria un llibre de treball per obrir", _
Selecció múltiple:=fals)
"Pas 3: obriu el fitxer escollit si encara no s'ha obert
Si FName <> False Aleshores
FNFileOnly = StrReverse(Esquerra(StrReverse(FName), _
InStr(StrReverse(FName), ") - 1))