Spremi kao zadržavanje izvornika otvorenim - Excel savjeti

Sadržaj

Puno puta u mjesecu trebam Excel radnu knjigu da bih stvorio mnogo kopija. Obično uđem u logičku grešku otvaranjem * radne knjige * i počinjem pisati kod da bih se proširio kroz popis i koristio Datoteka, Spremi kao za spremanje kopije radne knjige.

Evo dijagrama toka:

Logička pogreška kada zatvorim radnu knjigu

Vidite li problem gore? Makronaredba se izvodi u WorkbookA. Kad datoteku spremim kao RegionEast.xlsx, a zatim zatvorim RegionEast.xlsx, makronaredba će se prestati izvoditi.

Obično sam duboko u pseudokod prije nego što vidim problem.

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

Da sam razmišljao unaprijed, stvorio bih rješenje za dvije radne knjige. Stavite sve makronaredbe u WorkbookA. Stavite sve podatke u WorkbookB. Neka WorkbookA više puta otvori WorkB, promijeni podatke, SaveAs, Close.

Nešto složenije

Kako starim i postajem hirovitiji, otkrivam da sam sve manje raspoložen za ići s nešto kompliciranijim. Pogotovo jer imam većinu koda koji radi za izvornu naredbu SaveAs.

Današnji članak govori o strašnoj VBA metodi za SaveAsCopy. Ova naredba će WorkbookA držati otvorenim i zvati WorkbookA. Makronaredba može nastaviti raditi. Ali zapisat će trenutno stanje u radnoj knjižici u novu zatvorenu radnu knjigu pod nazivom WorkbookB.

To mi omogućuje povratak na izvorni dijagram toka:

Jednostavnija logika, sva samostalna

Međutim, otkrio sam jedan problem sa SaveAsCopy. Kada radim ThisWorkbook.SaveAs, mogu odabrati želim li spremiti kao XLSX ili XLSM. Ako trebam da makronaredbe budu dostupne u novoj radnoj knjizi, tada koristim XLSM. Inače koristim XLSX i makronaredbe će nestati.

Nažalost, ako se nalazite u XLSM radnoj knjizi, ne možete uspješno .SaveAsCopy i promijeniti u XLSX. Kôd će raditi. No rezultirajuća radna knjiga neće se otvoriti jer Excel otkriva pogrešno podudaranje između vrste datoteke i nastavka datoteke.

Moje rješenje je SaveAsCopy kao XLSM. Jednom kad je kopija spremljena, mogu otvoriti radnu knjigu (stvaranje dvije kopije radne knjige u memoriji), a zatim 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

Gledaj video

Prijepis videozapisa

Naučite Excel iz Podcasta, epizoda 2213: Spremite kao pomoću VBA-a, ali neka original ostane otvoren.

Hej, dobrodošao natrag na netcast. Ja sam Bill Jelen. Pa, možda ste primijetili da u posljednje vrijeme nudim preuzimanje svakog podcasta jer me puno ljudi to traži, pa sam pokušavao olakšati život što je više moguće. I cijeli je cilj bio spasiti kopiju koju možete preuzeti, ali nisam htio dodatne stvari - znate, stvari koje su za moju internu upotrebu - tamo, pa sam se toga želio riješiti.

I, znate, recimo da sam imao situaciju da sam morao napisati 12 radnih knjiga, zar ne? Svaka s drugim proizvodom. Dakle, prolazit ću kroz ove proizvode i zapisat ću ih tamo u A2, a zatim spremiti radnu knjigu i možda počistiti neke stvari. U redu. Dakle, moj prvi prolazak ovdje je ovakav makro, u redu? Dakle, definiramo trenutnu radnu knjigu - Radne listove ("Podaci), Radne listove (" Izvještaj ") da bismo ih pronašli - i onda shvatimo koliko redova podataka danas imamo, krenut ćemo od reda 2 do posljednji redak, kopirajte proizvod iz radne knjige podataka u radnu knjigu izvješća.

Dobro, a sad ću ovdje upasti u nevolje. Tako će se nova radna knjiga zvati "C: aaa ", a zatim Apple.xlsx, a ja ću spremiti kao, znate, s Apple.xlsx, i promijeniti se u XML - otvoriti xml radnu knjigu- - koji će ukloniti makronaredbe. U redu. Ali sada bih želio zatvoriti tu radnu knjigu, ali nažalost kad napravite Spremi kao-- pogledajte odmah, nalazim se u podcastu 2013 - kad napravim Spremi kao nakon te točke u kodu, nisam dulje će biti u Podcast 2013; Bit ću u Apple.xlsxu. U redu? Dakle, ako želim započeti s brisanjem stvari, izbrisat ću ih u kopiji, ali kad zatvorim kopiju, ne mogu se vratiti na izvornu datoteku. U redu? I ova makronaredba - zapravo, glava će mi eksplodirati pokušavajući shvatiti hoće li petlja i dalje raditi ili neće raditi,pravo? Stoga mislim da je Spremi kao pogrešan put ovdje.

Pa, zapravo, pričekaj. Mogli bismo ići dvije rute: Prvo, mogao bih dobiti drugu radnu knjigu koja otvara Podcast 2213, radi stvari, a zatim sprema Kao i kod novog imena, ili ću ići ovim putem, u redu, i ovo je metoda koju sam završio koristeći-- u redu, i mi ćemo definirati ovu radnu knjigu, ali zatim i novu radnu knjigu. Pravo. I ovdje je sve nekako isto dok ne dođemo do točke kad sam htio raditi WBT.SaveAs. Pogledajte ovo: SaveCopyAs-- ovo sada, koliko znam, ne postoji u uobičajenom Excelu … ovo je samo VBA. SaveCopyAs kaže, "Hej, vidi, nalazimo se u datoteci koja se zove 2213 i želim da tu datoteku 2213 preuzmete u trenutno stanje i spremite na disk i zatvorite." Držite izvornu datoteku otvorenom - 2213 ostaje otvoreno - ali sada na disku imamo potpuno novu datoteku koja se zove Apple.xlsm. Zapravo, u početku,nazvat ću ga DeleteMe.xlsm. U redu. Ali stvara identičnu kopiju i zadržava izvornu datoteku - datoteku u kojoj se pokreće makronaredba - otvorenom, a to je važan dio, zar ne? Dakle, sad kad imam DeleteMe vani, otvorim ga, dodijelim WBN-u, napravim stvari koje trebam učiniti, riješim se svih dodatnih listova - znam što imam. Primijetite, prije nego što izbrišete listove, želite učiniti DisplayAlerts = False, inače vas stalno pita: "Hej, nećeš vratiti list." Razumijem. I onda, konačno ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Nema makronaredbi. A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 2213.Ali stvara identičnu kopiju i zadržava izvornu datoteku - datoteku u kojoj se pokreće makronaredba - otvorenom, a to je važan dio, zar ne? Dakle, sad kad imam DeleteMe vani, otvorim ga, dodijelim WBN-u, napravim stvari koje trebam učiniti, riješim se svih dodatnih listova - znam što imam. Primijetite, prije nego što izbrišete listove, želite učiniti DisplayAlerts = False, inače vas stalno pita: "Hej, nećeš vratiti list." Razumijem. A onda, konačno ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Nema makronaredbi. A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 2213.Ali stvara identičnu kopiju i zadržava izvornu datoteku - datoteku u kojoj se pokreće makronaredba - otvorenom, a to je važan dio, zar ne? Dakle, sad kad imam DeleteMe vani, otvorim ga, dodijelim WBN-u, napravim stvari koje trebam učiniti, riješim se svih dodatnih listova - znam što imam. Primijetite, prije nego što izbrišete listove, želite učiniti DisplayAlerts = False, inače vas stalno pita: "Hej, nećeš vratiti list." Razumijem. A onda, konačno ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Nema makronaredbi. A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 2213.pravo? Dakle, sad kad imam DeleteMe vani, otvorim ga, dodijelim WBN-u, napravim stvari koje trebam učiniti, riješim se svih dodatnih listova - znam što imam. Primijetite, prije nego što izbrišete listove, želite učiniti DisplayAlerts = False, inače vas stalno pita: "Hej, nećeš vratiti list." Razumijem. A onda, konačno ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Nema makronaredbi. A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 2213.pravo? Dakle, sad kad imam DeleteMe vani, otvorim ga, dodijelim WBN-u, napravim stvari koje trebam učiniti, riješim se svih dodatnih listova - znam što imam. Primijetite, prije nego što izbrišete listove, želite učiniti DisplayAlerts = False, inače vas stalno pita: "Hej, nećeš vratiti list." Razumijem. A onda, konačno ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Nema makronaredbi. A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 2213.nećete vratiti list. "Shvaćam. I onda, napokon ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Nema makronaredbi A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 2213.nećete vratiti list. "Shvaćam. I onda, napokon ovdje, odaberite prvi radni list FN koji će biti Apple.xlsx, a zatim možemo raditi WBN.SaveAs Apple, kao otvorenu XMLWorkbook. Bez makronaredbi A onda Close - najljepša stvar u vezi sa Closeom je što sam se vratio u ovu radnu bilježnicu, 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.

Zaključak od danas: želite da VBA napiše nekoliko primjeraka trenutne radne knjige; Spremi kao uzrokuje probleme jer izvorna radna knjiga više nije otvorena; umjesto toga za spremanje kopije radne knjige koristite .SaveAsCopy. Ako želite preuzeti radnu knjigu iz današnjeg videozapisa, uključujući makronaredbu, posjetite URL u opisu YouTubea.

Želim da svratite, vidimo se sljedeći put za još jedno emitiranje od.

Preuzmite datoteku Excel

Da biste preuzeli excel datoteku: spremite-kao-čuvanje-original-otvoren.xlsm

Excel misao dana

Pitao sam svoje prijatelje Excel Master za savjet o Excelu. Današnja misao za razmišljanje:

"Datumi su brojevi, a ne riječi."

Duane Aubin

Zanimljivi članci...