Spara som att hålla originalet öppet - Excel-tips

Innehållsförteckning

Det finns många gånger på en månad där jag behöver en Excel-arbetsbok för att skapa många kopior av sig själv. Jag brukar komma in i ett logiskt fel genom att öppna * arbetsboken * och jag börjar skriva kod för att gå igenom en lista och använda Arkiv, Spara som för att spara en kopia av arbetsboken.

Här är flödesschemat:

Logikfel när jag stänger arbetsboken

Ser du problemet ovan? Makrot körs i WorkbookA. När jag sparar filen som RegionEast.xlsx och sedan stänger RegionEast.xlsx slutar makrot att köras.

Jag är vanligtvis djupt inne i pseudokoden innan jag ser problemet.

Sub MakeCopies() Dim WBT As Workbook Dim WSD As Worksheet Dim WSR As Worksheet Set WBT = ThisWorkbook Set WSD = WBT.Worksheets("Data") Set WSR = WBT.Worksheets("Report") FinalRow = WSD.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To FinalRow ' Copy this product to WSR.B2 WSR.Cells(2, 1).Value = WSD.Cells(i, 1).Value ' Save this workbook with a new name NewFN = "C:aaa " & WSD.Cells(i, 1).Value & ".xlsx" ' Save As a file type without macros WBT.SaveAs Filename:=NewFN, FileFormat:=xlOpenXMLWorkbook ' Close the new workbook ' But that won't work because I need this workbook to stay open End Sub

Hade jag tänkt framåt skulle jag ha skapat en lösning med två arbetsböcker. Lägg alla makron i WorkbookA. Lägg alla data i WorkbookB. Har WorkbookA öppna WorkbookB upprepade gånger, ändra data, SaveAs, Close.

Något mer komplicerat

När jag blir äldre och vredare upptäcker jag att jag är mindre på humör att gå med lite mer komplicerat. Speciellt eftersom jag har det mesta av koden som fungerar för det ursprungliga SaveAs-kommandot.

Dagens artikel handlar om den fantastiska VBA-metoden för SaveAsCopy. Detta kommando kommer att hålla WorkbookA öppen och kallas WorkbookA. Makronet kan fortsätta springa. Men det kommer att skriva ut arbetsbokens nuvarande tillstånd till en ny sluten arbetsbok som heter WorkbookB.

Detta gör att jag kan gå tillbaka till det ursprungliga flödesschemat:

Enklare logik, allt fristående

Men jag upptäckte ett problem med SaveAsCopy. När jag gör ThisWorkbook.SaveAs kan jag välja om jag vill spara som XLSX eller XLSM. Om jag behöver att makron ska vara tillgängliga i den nya arbetsboken, använder jag XLSM. Annars använder jag XLSX och makron försvinner.

Tyvärr, om du är i en XLSM-arbetsbok, kan du inte lyckas .SaveAsCopy och ändra till XLSX. Koden fungerar. Men den resulterande arbetsboken öppnas inte eftersom Excel upptäcker en felaktig matchning mellan filtyp och filtillägg.

Min lösning är att SaveAsCopy som XLSM. När kopian har sparats kan jag öppna arbetsboken (skapa två kopior av arbetsboken i minnet) och sedan SaveAs XLSX.

Sub MakeCopies() Dim WBT As Workbook Dim WBN As Workbook Dim WSD As Worksheet Dim WSR As Worksheet Set WBT = ThisWorkbook Set WSD = WBT.Worksheets("Data") Set WSR = WBT.Worksheets("Report") FinalRow = WSD.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To FinalRow ' Copy this product to WSR.B2 WSR.Cells(2, 1).Value = WSD.Cells(i, 1).Value ' Save this workbook with a new name FN = "C:aaa " & WSD.Cells(i, 1).Value & ".xlsx" ' Save a Temp Copy of this workbook NewFN = "C:aaaDeleteMe.xlsm" ' Delete any previous copy left over from before On Error Resume Next Kill (NewFN) On Error GoTo 0 ' **************************************** ' Use SaveCopyAs instead of SaveAs WBT.SaveCopyAs Filename:=NewFN ' Open the workbook we just saved Set WBN = Workbooks.Open(NewFN) ' Delete the worksheets that we don't need Application.DisplayAlerts = False For Each WS In WBN.Worksheets Select Case WS.Name Case "BuyTheBook", "Info", "Form", "Template", "Article", "NotesForApp", "Data" WS.Delete End Select Next WS Application.DisplayAlerts = True NewFN = FN WBN.Worksheets(1).Select On Error Resume Next Kill (NewFN) On Error GoTo 0 Application.DisplayAlerts = False WBN.SaveAs NewFN, FileFormat:=xlOpenXMLWorkbook Application.DisplayAlerts = True WBN.Close False ' Delete the temporary copy NewFN = "C:aaaDeleteMe.xlsm" On Error Resume Next Kill (NewFN) On Error GoTo 0 End Sub

Kolla på video

Videoutskrift

Lär dig Excel från Podcast, avsnitt 2213: Spara som att använda VBA, men håll originalet öppet.

Hej, välkommen tillbaka till netcast. Jag heter Bill Jelen. Du kanske har lagt märke till att jag nyligen har erbjudit nedladdning av varje podcast eftersom många människor har bett mig om det, och därför försökte jag göra livet så enkelt som möjligt. Och hela målet var att spara en kopia som du kan ladda ner, men jag ville inte ha de extra sakerna - du vet, de saker som är för mitt eget interna bruk - där, så jag ville bli av med det.

Och du vet, låt oss säga att jag hade en situation där jag var tvungen att skriva 12 arbetsböcker, eller hur? Var och en med en annan produkt. Så jag ska gå igenom dessa produkter och jag kommer att skriva det där till A2 och sedan spara arbetsboken och kanske rensa upp några saker. OK. Så mitt första pass här är ett makro som det här, okej? Så vi definierar den nuvarande arbetsboken - Kalkylblad ("Data), Kalkylblad (" Rapport ") för att hitta dessa - och räknar sedan ut hur många rader med data vi har idag, vi kommer att slinga från rad 2 ner till den sista raden, kopiera produkten från dataarboken till rapportarbetsboken.

Okej, och nu är det här jag ska hamna i trubbel. Så den nya arbetsboken kommer att kallas "C: aaa " och sedan Apple.xlsx, och jag ska spara som en, du vet, med Apple.xlsx, och byta till XML - öppna xml-arbetsbok- - som kommer att ta bort makron. OK. Men nu vill jag stänga den arbetsboken, men tyvärr när du gör en Spara som - se just nu är jag i podcast 2013 - när jag gör en Spara som efter den punkten i koden, är jag inte längre kommer att vara i Podcast 2013; Jag ska vara i Apple.xlsx. OK? Så nu, om jag vill börja radera saker, kommer jag att radera det i kopian, men när jag stänger kopian kan jag inte komma tillbaka till originalfilen. OK? Och detta makro - faktiskt, mitt huvud är på väg att explodera och försöker lista ut om slingan fortfarande kommer att fungera eller inte fungerar,rätt? Så jag tror att Save As är fel väg att gå här.

Häng på, faktiskt. Vi kan gå två vägar: För det första kunde jag ha en annan arbetsbok som öppnar Podcast 2213, gör saker och sedan sparar som med det nya namnet, eller så går jag den här vägen, okej, och det här är metoden jag hamnade på använder-- okej, och vi ska definiera den här arbetsboken, men sedan också en ny arbetsbok. Rätt. Och allt är ungefär samma här nere tills vi kommer till den punkt där jag skulle göra WBT.SaveAs. Kolla in det här: SaveCopyAs-- nu existerar det, så vitt jag kan säga, i vanlig Excel … det här är bara VBA. SaveCopyAs säger, "Hej, se, vi finns i en fil som heter 2213 och jag vill att du tar den filen 2213 i sitt nuvarande tillstånd och sparar den på hårddisken och stänger." Håll originalfilen öppen - 2213 förblir öppen - men nu har vi en helt ny fil på disken som heter Apple.xlsm. Egentligen först, jag 'jag ska bara kalla det DeleteMe.xlsm. OK. Men det skapar en identisk kopia och håller originalfilen - filen som makrot körs i - öppen, och det är den viktiga delen, eller hur? Så nu när jag har DeleteMe där ute öppnar jag den, tilldelar den till WBN, gör de saker jag behöver göra, blir av med alla extra ark - jag vet vad jag har. Observera att innan du raderar arken vill du göra DisplayAlerts = Falskt, annars frågar det dig ständigt: "Hej, du kommer inte att få tillbaka arket." Jag fattar. Och slutligen här, välj det första kalkylbladet FN kommer att bli Apple.xlsx, och då kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron. Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.Men det skapar en identisk kopia och håller originalfilen - filen som makrot körs i - öppen, och det är den viktiga delen, eller hur? Så nu när jag har DeleteMe där ute öppnar jag den, tilldelar den till WBN, gör de saker jag behöver göra, blir av med alla extra ark - jag vet vad jag har. Observera att innan du raderar arken vill du göra DisplayAlerts = Falskt, annars frågar det dig ständigt: "Hej, du kommer inte att få tillbaka arket." Jag fattar. Och sedan, slutligen här, välj det första kalkylbladet FN kommer att bli Apple.xlsx, och sedan kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron. Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.Men det skapar en identisk kopia och håller originalfilen - filen som makrot körs i - öppen, och det är den viktiga delen, eller hur? Så nu när jag har DeleteMe där ute öppnar jag den, tilldelar den till WBN, gör de saker jag behöver göra, blir av med alla extra ark - jag vet vad jag har. Observera att innan du raderar arken vill du göra DisplayAlerts = Falskt, annars frågar det dig ständigt: "Hej, du kommer inte att få tillbaka arket." Jag fattar. Och sedan, slutligen här, välj det första kalkylbladet FN kommer att bli Apple.xlsx, och sedan kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron. Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.rätt? Så nu när jag har DeleteMe där ute öppnar jag den, tilldelar den till WBN, gör de saker jag behöver göra, blir av med alla extra ark - jag vet vad jag har. Observera att innan du raderar arken vill du göra DisplayAlerts = Falskt, annars frågar det dig ständigt: "Hej, du kommer inte att få tillbaka arket." Jag fattar. Och slutligen här, välj det första kalkylbladet FN kommer att bli Apple.xlsx, och då kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron. Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.rätt? Så nu när jag har DeleteMe där ute öppnar jag den, tilldelar den till WBN, gör de saker jag behöver göra, blir av med alla extra ark - jag vet vad jag har. Observera att innan du raderar arken vill du göra DisplayAlerts = Falskt, annars frågar det dig ständigt: "Hej, du kommer inte att få tillbaka arket." Jag fattar. Och slutligen här, välj det första kalkylbladet FN kommer att bli Apple.xlsx, och då kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron. Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.kommer inte att få tillbaka arket. "Jag förstår det. Och välj slutligen här det första kalkylbladet FN kommer att bli Apple.xlsx, och sedan kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.kommer inte att få tillbaka arket. "Jag förstår det. Och välj slutligen här det första kalkylbladet FN kommer att bli Apple.xlsx, och sedan kan vi göra WBN.SaveAs Apple, som en öppen XMLWorkbook. Inga makron Och sedan Stäng - det vackra med Stäng är att jag nu är tillbaka i den här arbetsboken, 2213.

Alright, it's been working really, really well, and the key to this whole thing is SaveCopyAs-- SaveCopyAs. So, to me-- well that's been around for a long time-- I never used it, and now I realize there's probably been a lot of times in the past where I should have used it. And maybe, you know, you should be using it or consider using it as well.

Okay, I forgot to mention one thing: the important thing is, with Save As Copy-- Save As Copy-- so when I do the Save As Copy, if I try to change to an xslx file type, I cannot change the file type here just by changing the extension in NewFN and when trying to open that subsequent workbook, they'll detect that it has macros, and it has the wrong extension, and it will yell at you. Right? So, you have to save it as xlsm and then later come back, reopen it, and save it as xlsx. But that all works with this macro.

So, hey, when I'm updating this book, Excel 2016, this summer, for Excel 2019, I'll make sure to include this tip. I think it's a useful tip to SaveCopyAs.

Avslutning från idag: Du vill att VBA ska skriva flera exemplar av den aktuella arbetsboken; Spara som orsakar problem eftersom den ursprungliga arbetsboken inte längre är öppen. istället använder du .SaveAsCopy för att spara en kopia av arbetsboken. Om du vill ladda ner arbetsboken från dagens video, inklusive makrot, besök webbadressen i YouTube-beskrivningen.

Jag vill att du stannar förbi, vi ses nästa gång för en ny netcast från.

Ladda ner Excel-fil

För att ladda ner excel-filen: spara-som-håller-original-open.xlsm

Excel-tanke på dagen

Jag har frågat mina Excel Master-vänner om deras råd om Excel. Dagens tanke att fundera på:

"Datum är siffror, inte ord."

Duane Aubin

Intressanta artiklar...