Shrani kot ohraniti originalno odprto - nasveti za Excel

V mesecu velikokrat potrebujem Excelov delovni zvezek, da ustvarim veliko kopij. Običajno naletim na logično napako tako, da odprem * delovni zvezek * in začnem pisati kodo, da se preletim po seznamu in uporabim Datoteka, Shrani kot, da shranim kopijo delovnega zvezka.

Tu je diagram poteka:

Logična napaka, ko zaprem delovni zvezek

Ali vidite težavo zgoraj? Makro se izvaja v programu WorkbookA. Ko shranim datoteko kot RegionEast.xlsx in nato zaprem RegionEast.xlsx, se makro preneha izvajati.

Običajno sem globoko v psevdokod, preden vidim težavo.

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

Če bi razmišljal naprej, bi ustvaril rešitev za dva delovna zvezka. Vse makre vstavite v WorkbookA. Vse podatke shranite v WorkbookB. Naj WorkbookA večkrat odpre WorkbookB, spremeni podatke, SaveAs, Close.

Nekoliko bolj zapleteno

Ko se staram in postajam bolj razdražljiv, ugotavljam, da sem manj razpoložen za nekoliko bolj zapletene. Še posebej, ker imam večino kode za originalni ukaz SaveAs.

Današnji članek govori o izjemni metodi VBA za SaveAsCopy. S tem ukazom bo WorkbookA odprt in se bo imenoval WorkbookA. Makro se lahko še naprej izvaja. Toda trenutno stanje delovnega zvezka bo zapisal v nov zaprt delovni zvezek, imenovan WorkbookB.

To mi omogoča vrnitev na prvotni diagram poteka:

Preprostejša logika, vsa samostojna

Vendar sem odkril eno težavo s programom SaveAsCopy. Ko delam ThisWorkbook.SaveAs, lahko izbiram, ali želim shraniti kot XLSX ali XLSM. Če potrebujem makre, ki bodo na voljo v novem delovnem zvezku, potem uporabim XLSM. V nasprotnem primeru uporabim XLSX in makri izginejo.

Če ste v delovnem zvezku XLSM, ne morete uspešno .SaveAsCopy in spremenite v XLSX. Koda bo delovala. Toda delovni zvezek se ne bo odprl, saj Excel zazna napačno ujemanje med vrsto datoteke in pripono datoteke.

Moja rešitev je shranitiAsCopy kot XLSM. Ko je kopija shranjena, lahko odprem delovni zvezek (ustvarim dve kopiji delovnega zvezka v pomnilniku) in nato 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

Oglejte si video

Video zapis

Naučite se Excela iz Podcasta, Epizoda 2213: Shranite kot z uporabo VBA, original pa naj bo odprt.

Hej, dobrodošli nazaj v oddaji. Jaz sem Bill Jelen. No, morda ste opazili, da v zadnjem času ponujam prenos vsakega podcasta, ker me veliko ljudi prosi za to, zato sem si poskušal čim bolj olajšati življenje. In celoten cilj je bil shraniti kopijo, ki jo lahko prenesete, vendar nisem hotel dodatnih stvari - veste, stvari, ki so za mojo interno uporabo - tam, zato sem se tega želel znebiti.

In veste, recimo, da sem imel situacijo, ko sem moral napisati 12 delovnih zvezkov, kajne? Vsak z drugačnim izdelkom. Torej, poizkušal bom te izdelke in jih zapisal tja v A2, nato shranil delovni zvezek in morda pospravil nekaj stvari. Vredu. Torej, moj prvi prehod skozi je takšen makro, v redu? Torej definiramo trenutno delovno knjigo - Delovni listi ("Podatki), Delovni listi (" Poročilo "), da jih najdemo - in nato ugotovimo, koliko vrstic podatkov imamo danes, bomo zavili od vrstice 2 navzdol do v zadnji vrstici kopirajte izdelek iz delovnega zvezka s podatki v delovni zvezek poročila.

V redu, zdaj pa bom tukaj zašel v težave. Tako se bo novi delovni zvezek imenoval "C: aaa " in nato Apple.xlsx, shranil pa bom, kot veste, z Apple.xlsx in se spremenil v XML - odprti delovni zvezek xml - ki bo odstranil makre. Vredu. Zdaj pa bi rad zaprl ta delovni zvezek, toda na žalost, ko naredite Save As - glejte zdaj, sem v podcastu 2013 - ko naredim Save As po tej točki v kodi, nisem dlje bo v Podcast 2013; Bom v Apple.xlsx. Vredu? Torej, če želim začeti brisati stvari, jih bom izbrisal v kopiji, toda ko zaprem kopijo, se ne morem vrniti v izvirno datoteko. Vredu? In ta makro-- pravzaprav bo moja glava eksplodirala, da bi ugotovila, ali zanka še vedno deluje ali ne,prav? Torej mislim, da je Save As napačna pot sem.

No, pravzaprav, počakajte. Lahko gremo po dveh poteh: najprej bi lahko dobil še en delovni zvezek, ki odpre Podcast 2213, naredi stvari in nato shrani Kot pri novem imenu, ali pa grem po tej poti, prav, in to je metoda, ki sem jo končal z uporabo - v redu in opredelili bomo ta delovni zvezek, nato pa tudi nov delovni zvezek. Prav. In tu je vse nekako enako, dokler ne pridemo do točke, ko sem nameraval narediti WBT.SaveAs. Oglejte si to: SaveCopyAs-- zdaj to, kolikor vem, ne obstaja v običajnem Excelu … to je samo VBA. SaveCopyAs pravi: "Hej, glej, imamo datoteko z imenom 2213 in želim, da to datoteko 2213 vzamete v trenutnem stanju, jo shranite na disk in zaprete." Prvotno datoteko imejte odprto - 2213 ostane odprtih, zdaj pa imamo na disku povsem novo datoteko z imenom Apple.xlsm. Pravzaprav sem sprvaPoklical ga bom samo DeleteMe.xlsm. Vredu. Toda ustvari identično kopijo in ohrani izvirno datoteko - datoteko, v kateri se izvaja makro - odprto, in to je pomemben del, kajne? Zdaj, ko imam tam DeleteMe, ga odprem, dodelim WBN-u, naredim stvari, ki jih moram narediti, znebim se vseh dodatnih listov - vem, kaj imam. Preden izbrišete liste, želite narediti DisplayAlerts = False, sicer vas nenehno sprašuje: "Hej, lista ne boš dobil nazaj." Razumem. In nato, končno tukaj, izberite prvi delovni list FN bo Apple.xlsx, nato pa lahko naredimo WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov. In potem Zapri - čudovito pri Zapri je, da sem zdaj spet v tem delovnem zvezku, 2213.Toda ustvari identično kopijo in ohrani izvirno datoteko - datoteko, v kateri se izvaja makro - odprto, in to je pomemben del, kajne? Zdaj, ko imam tam DeleteMe, ga odprem, dodelim WBN-u, naredim stvari, ki jih moram narediti, znebim se vseh dodatnih listov - vem, kaj imam. Preden izbrišete liste, želite narediti DisplayAlerts = False, sicer vas nenehno sprašuje: "Hej, lista ne boš dobil nazaj." Razumem. In nato, končno tukaj, izberite prvi delovni list FN bo Apple.xlsx, nato pa lahko naredimo WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov. In potem Close - čudovito pri Close je to, da sem zdaj spet v tem delovnem zvezku, 2213.Toda ustvari identično kopijo in ohrani izvirno datoteko - datoteko, v kateri se izvaja makro - odprto, in to je pomemben del, kajne? Zdaj, ko imam tam DeleteMe, ga odprem, dodelim WBN-u, naredim stvari, ki jih moram narediti, znebim se vseh dodatnih listov - vem, kaj imam. Preden izbrišete liste, želite narediti DisplayAlerts = False, sicer vas nenehno sprašuje: "Hej, lista ne boš dobil nazaj." Razumem. In nato, končno tukaj, izberite prvi delovni list FN bo Apple.xlsx, nato pa lahko naredimo WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov. In potem Close - čudovito pri Close je to, da sem zdaj spet v tem delovnem zvezku, 2213.prav? Zdaj, ko imam tam DeleteMe, ga odprem, dodelim WBN-u, naredim stvari, ki jih moram narediti, znebim se vseh dodatnih listov - vem, kaj imam. Preden izbrišete liste, želite narediti DisplayAlerts = False, sicer vas nenehno sprašuje: "Hej, lista ne boš dobil nazaj." Razumem. In nato, končno tukaj, izberite prvi delovni list FN bo Apple.xlsx, nato pa lahko naredimo WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov. In potem Close - čudovito pri Close je to, da sem zdaj spet v tem delovnem zvezku, 2213.prav? Zdaj, ko imam tam DeleteMe, ga odprem, dodelim WBN-u, naredim stvari, ki jih moram narediti, znebim se vseh dodatnih listov - vem, kaj imam. Preden izbrišete liste, želite narediti DisplayAlerts = False, sicer vas nenehno sprašuje: "Hej, lista ne boš dobil nazaj." Razumem. In nato, končno tukaj, izberite prvi delovni list FN bo Apple.xlsx, nato pa lahko naredimo WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov. In potem Close - čudovito pri Close je to, da sem zdaj spet v tem delovnem zvezku, 2213.lista ne boste dobili nazaj. "Razumem. In končno tukaj izberite prvi delovni list FN, ki bo Apple.xlsx, nato pa lahko WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov In potem Close - čudovito pri Close je to, da sem zdaj spet v tem delovnem zvezku, 2213.lista ne boste dobili nazaj. "Razumem. In končno tukaj izberite prvi delovni list FN, ki bo Apple.xlsx, nato pa lahko naredimo WBN.SaveAs Apple kot Open XMLWorkbook. Brez makrov In potem Close - čudovito pri Close je to, da sem zdaj spet v tem delovnem zvezku, 2213.

V redu, zelo dobro je delovalo in ključ vsega tega je SaveCopyAs-- SaveCopyAs. Torej, zame - no, to obstaja že dolgo časa - nikoli je nisem uporabljal in zdaj se zavedam, da bi jo v preteklosti verjetno morali velikokrat uporabiti. In morda, veste, morali bi ga uporabljati ali razmisliti tudi o tem.

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ček od danes: želite, da VBA napiše več kopij trenutnega delovnega zvezka; Shrani kot povzroča težave, ker izvirni delovni zvezek ni več odprt; namesto tega uporabite .SaveAsCopy za shranjevanje kopije delovnega zvezka. Če želite iz današnjega videoposnetka prenesti delovni zvezek, vključno z makrom, obiščite URL v opisu YouTube.

Želim vas, da se ustavite, se vidimo naslednjič za še eno oddajo od.

Prenesite datoteko Excel

Če želite prenesti datoteko excel: save-as-keep-original-open.xlsm

Excel Misel dneva

Za nasvet glede Excela sem prosil prijatelje Excel Excel. Današnja misel o premišljevanju:

"Datumi so številke in ne besede."

Duane Aubin

Zanimive Članki...