Gem som at holde originalen åben - Excel-tip

Indholdsfortegnelse

Der er mange gange om en måned, hvor jeg har brug for en Excel-projektmappe for at oprette mange kopier af sig selv. Jeg kommer normalt ind i en logisk fejl ved at åbne * projektmappen, og jeg begynder at skrive kode for at løbe gennem en liste og bruge File, Save As til at gemme en kopi af projektmappen.

Her er flowchart:

Logisk fejl, når jeg lukker projektmappen

Kan du se problemet ovenfor? Makroen kører i WorkbookA. Når jeg gemmer som filen som RegionEast.xlsx og derefter lukker RegionEast.xlsx, stopper makroen med at køre.

Jeg er normalt dybt inde i pseudokoden, før jeg 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

Hvis jeg havde tænkt fremad, ville jeg have oprettet en to-projektmappeløsning. Sæt alle makroerne i WorkbookA. Sæt alle data i WorkbookB. Har WorkbookA gentagne gange åbnet WorkbookB, ændret data, SaveAs, Close.

Lidt mere kompliceret

Efterhånden som jeg bliver ældre og crankier, finder jeg ud af, at jeg er mindre i humør til at gå med lidt mere kompliceret. Især da jeg har det meste af koden, der fungerer til den oprindelige SaveAs-kommando.

Dagens artikel handler om den fantastiske VBA-metode til SaveAsCopy. Denne kommando holder WorkbookA åben og kaldes WorkbookA. Makroen kan fortsætte med at køre. Men det vil skrive den aktuelle tilstand af projektmappen ud til en ny lukket projektmappe kaldet WorkbookB.

Dette giver mig mulighed for at gå tilbage til det originale flowdiagram:

Enklere logik, alt sammen selvstændig

Jeg opdagede dog et problem med SaveAsCopy. Når jeg laver ThisWorkbook.SaveAs, kan jeg vælge, om jeg vil gemme som XLSX eller XLSM. Hvis jeg har brug for, at makroerne er tilgængelige i den nye projektmappe, bruger jeg XLSM. Ellers bruger jeg XLSX, og makroerne forsvinder.

Desværre, hvis du er i en XLSM-projektmappe, kan du ikke med succes .SaveAsCopy og skifte til XLSX. Koden fungerer. Men den resulterende projektmappe åbnes ikke, da Excel registrerer et misforhold mellem filtype og filtypen.

Min løsning er at SaveAsCopy som XLSM. Når kopien er gemt, kan jeg åbne projektmappen (oprette to kopier af projektmappen i hukommelsen) og derefter 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

Se video

Videoudskrift

Lær Excel fra Podcast, afsnit 2213: Gem som at bruge VBA, men hold originalen åben.

Hej, velkommen tilbage til netcast. Jeg er Bill Jelen. Nå har du måske bemærket, at jeg for nylig har tilbudt download af hver podcast, fordi mange mennesker har bedt mig om det, og derfor prøvede jeg at gøre livet så let som muligt. Og hele målet var at gemme en kopi, som du kan downloade, men jeg ville ikke have de ekstra ting - du ved, de ting, der er til min egen interne brug - der, så jeg ville slippe af med det.

Og ved du, lad os sige, at jeg havde en situation, hvor jeg skulle skrive 12 projektbøger, ikke? Hver med et andet produkt. Så jeg vil løbe igennem disse produkter, og jeg vil skrive det der til A2 og derefter gemme projektmappen og måske rydde op i nogle ting. I orden. Så min første gennemgang her er en makro som denne, okay? Så vi definerer den aktuelle projektmappe - Arbejdsark ("Data), Arbejdsark (" Rapport ") for at finde dem - og derefter finde ud af, hvor mange datarækker vi har i dag, vi vil løkke fra række 2 ned til den sidste række skal du kopiere produktet fra data-projektmappen over til rapport-projektmappen.

Okay, og nu er det her, hvor jeg er ved at komme i problemer. Så den nye projektmappe hedder "C: aaa " og derefter Apple.xlsx, og jeg vil gemme som en, ved du med Apple.xlsx, og skift til XML - åben xml-projektmappe- - som vil fjerne makroerne. I orden. Men nu vil jeg gerne lukke den projektmappe, men desværre når du laver en Gem som - se lige nu, er jeg i podcast 2013 - når jeg laver en Gem som efter det punkt i koden, er jeg ikke længere vil være i Podcast 2013; Jeg vil være i Apple.xlsx. I orden? Så nu, hvis jeg vil begynde at slette ting, skal jeg slette det i kopien, men når jeg lukker kopien, kan jeg ikke komme tilbage til den originale fil. I orden? Og denne makro - faktisk er mit hoved ved at eksplodere og forsøger at finde ud af, om sløjfen stadig fungerer eller ikke fungerer,ret? Så jeg tror, ​​at Save As er den forkerte vej at gå her.

Nå, faktisk, hæng på. Vi kunne gå to ruter: For det første kunne jeg have en anden projektmappe, der åbner Podcast 2213, gør tingene og derefter Gemmer som med det nye navn, eller jeg går denne vej, okay, og det er den metode, jeg endte med bruger-- okay, og vi definerer denne projektmappe, men så også en ny projektmappe. Ret. Og alt er lidt det samme her nede, indtil vi kommer til det punkt, hvor jeg var ved at lave WBT.SaveAs. Tjek dette ud: SaveCopyAs-- nu eksisterer dette ikke, så vidt jeg kan se, i almindelig Excel … dette er kun VBA. SaveCopyAs siger, "Hej, se, vi er i en fil, der hedder 2213, og jeg vil have dig til at tage filen 2213 i sin nuværende tilstand og gemme den på disken og lukke." Hold den originale fil åben - 2213 forbliver åben - men nu har vi en helt ny fil på disken kaldet Apple.xlsm. Faktisk, i starten, jeg 'Jeg vil bare kalde det DeleteMe.xlsm. I orden. Men det opretter en identisk kopi og holder originalfilen - filen, som makroen kører i - åben, og det er den vigtige del, ikke? Så nu hvor jeg har DeleteMe derude, åbner jeg den, tildeler den til WBN, gør de ting, jeg skal gøre, slipper af med alle de ekstra ark - jeg ved hvad jeg har. Bemærk, inden du sletter arkene, vil du gøre DisplayAlerts = Falsk, ellers bliver det ved med at spørge dig, "Hej, du vil ikke få arket tilbage." Jeg forstår det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi lave WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer. Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 2213.Men det opretter en identisk kopi og holder originalfilen - filen, som makroen kører i - åben, og det er den vigtige del, ikke? Så nu hvor jeg har DeleteMe derude, åbner jeg den, tildeler den til WBN, gør de ting, jeg skal gøre, slipper af med alle de ekstra ark - jeg ved hvad jeg har. Bemærk, inden du sletter arkene, vil du gøre DisplayAlerts = Falsk, ellers bliver det ved med at spørge dig, "Hej, du vil ikke få arket tilbage." Jeg forstår det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi lave WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer. Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 2213.Men det opretter en identisk kopi og holder originalfilen - filen, som makroen kører i - åben, og det er den vigtige del, ikke? Så nu hvor jeg har DeleteMe derude, åbner jeg den, tildeler den til WBN, gør de ting, jeg skal gøre, slipper af med alle de ekstra ark - jeg ved hvad jeg har. Bemærk, inden du sletter arkene, vil du gøre DisplayAlerts = Falsk, ellers bliver det ved med at spørge dig, "Hej, du vil ikke få arket tilbage." Jeg forstår det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi lave WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer. Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 2213.ret? Så nu hvor jeg har DeleteMe derude, åbner jeg den, tildeler den til WBN, gør de ting, jeg skal gøre, slipper af med alle de ekstra ark - jeg ved hvad jeg har. Bemærk, inden du sletter arkene, vil du gøre DisplayAlerts = Falsk, ellers bliver det ved med at spørge dig, "Hej, du vil ikke få arket tilbage." Jeg forstår det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi lave WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer. Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 2213.ret? Så nu hvor jeg har DeleteMe derude, åbner jeg den, tildeler den til WBN, gør de ting, jeg skal gøre, slipper af med alle de ekstra ark - jeg ved hvad jeg har. Bemærk, inden du sletter arkene, vil du gøre DisplayAlerts = Falsk, ellers bliver det ved med at spørge dig, "Hej, du vil ikke få arket tilbage." Jeg forstår det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi lave WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer. Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 2213.vil ikke få arket tilbage. "Jeg får det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi gøre WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 2213.vil ikke få arket tilbage. "Jeg får det. Og så, endelig her, skal du vælge det første regneark, FN skal være Apple.xlsx, og så kan vi gøre WBN.SaveAs Apple, som en åben XMLWorkbook. Ingen makroer Og så Luk - det smukke ved Close er, at jeg nu er tilbage i denne projektmappe, 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.

Afslutning fra i dag: Du ønsker, at VBA skriver flere eksemplarer af den aktuelle projektmappe; Gem som giver problemer, fordi den oprindelige projektmappe ikke længere er åben; I stedet bruger du .SaveAsCopy til at gemme en kopi af projektmappen. Hvis du vil downloade projektmappen fra dagens video, inklusive makroen, skal du besøge URL'en i YouTube-beskrivelsen.

Jeg vil gerne have dig for at komme forbi, vi ses næste gang til endnu en netcast fra.

Download Excel-fil

For at downloade excel-filen: gem-som-holder-original-open.xlsm

Excel-tanken om dagen

Jeg har bedt mine Excel Master-venner om deres råd om Excel. Dagens tanke at tænke over:

"Datoer er tal, ikke ord."

Duane Aubin

Interessante artikler...