När du funderar på att automatiskt öppna Excel-arbetsböcker, fundera på vad som kan hända om du försöker öppna en bok som redan är öppen. I icke-VBA-världen försöker Excel att öppna filen igen, med meddelandet som varnar för att alla osparade ändringar kommer att gå förlorade. Du kan skydda dig mot en sådan händelse genom att kontrollera om en given fil redan är öppen innan du försöker öppna den igen.
Undvik detta varningsmeddelande.
Hur makrot fungerar
Det första man bör lägga märke till med detta makro är att det är en funktion, inte en Sub-procedur. Som du kommer att se, gör det här makrot till en funktion att du kan skicka vilket filnamn som helst till det för att testa om filen redan är öppen.
Kontentan av denna kod är enkel. Du testar ett givet filnamn för att se om det kan tilldelas en objektvariabel. Endast öppnade arbetsböcker kan tilldelas en objektvariabel. När du försöker tilldela en stängd arbetsbok till variabeln uppstår ett fel.
Om den givna arbetsboken kan tilldelas är arbetsboken öppen; om ett fel uppstår stängs arbetsboken.
Funktion FileIsOpenTest(TargetWorkbook As String) Som Boolean
'Steg 1: Deklarera dina variabler
Dim testbok som arbetsbok
'Steg 2: Be Excel att återuppta vid fel
Vid fel Resume Next
'Steg 3: Försök att tilldela målarbetsboken till TestBook
Set TestBook = Workbooks(TargetWorkbook)
'Steg 4: Om inget fel inträffade är arbetsboken redan öppen
Om Err.Number = 0 Då
FileIsOpenTest = Sant
Annan
FileIsOpenTest = Falskt
Avsluta om
Avsluta funktion
Det första makrot gör är att deklarera en String-variabel som kommer att hålla filnamnet som användaren väljer. TestBook är namnet på din strängvariabel.
I steg 2 berättar du för Excel att det kan finnas ett fel när den här koden körs och, i händelse av ett fel, återupptar koden. Utan denna rad skulle koden helt enkelt stanna när ett fel uppstår. Återigen testar du ett givet filnamn för att se om det kan tilldelas en objektvariabel. Om den givna arbetsboken kan tilldelas är den öppen; om ett fel uppstår är det stängt.
I steg 3 försöker du tilldela den givna arbetsboken till variabeln TestBook Object. Arbetsboken du försöker tilldela är en strängvariabel som heter TargetWorkbook. TargetWorkbook skickas till funktionen i funktionsdeklarationerna (se första raden i koden). Denna struktur eliminerar behovet av att hårdkoda ett arbetsboksnamn, vilket gör att du kan skicka det som en variabel istället.
I steg 4 kontrollerar du helt enkelt om ett fel uppstod. Om ett fel inte uppstod är arbetsboken öppen, så du ställer in FileIsOpenTest på True. Om ett fel inträffade är arbetsboken inte öppen och du ställer in FileIsOpenTest på False.
Återigen, den här funktionen kan användas för att utvärdera vilken fil som helst som du skickar till den, via dess TargetWorkbook-argument. Det här är det fina med att sätta makrot i en funktion.
Följande makro visar hur man implementerar denna funktion. Här anropar du den nya FileIsOpenTest-funktionen för att säkerställa att användaren inte kan öppna en redan öppnad fil:
Sub Macro1()
'Steg 1: Definiera en strängvariabel
Dim FName som variant
Dim FnFileOnly As String
'Steg 2: GetOpenFilename Method aktiverar dialogrutan
FName = Application.GetOpenFilename( _
FileFilter:="Excel-arbetsböcker,*.xl*", _
Title:="Välj en arbetsbok att öppna", _
MultiSelect:=False)
'Steg 3: Öppna den valda filen om den inte redan har öppnats
Om FName <> False Då
FNFileOnly = StrReverse(Left(StrReverse(FName), _
InStr(StrReverse(FName), ") - 1))