Uložit jako zachovat původní otevřené - Excel tipy

Existuje mnohokrát za měsíc, kdy potřebuji sešit aplikace Excel, abych vytvořil mnoho vlastních kopií. Obvykle se dostanu do logické chyby otevřením * sešitu * a začnu psát kód, abych procházel seznamem a pomocí Soubor, Uložit jako uložil kopii sešitu.

Zde je vývojový diagram:

Logická chyba při zavření sešitu

Vidíte výše uvedený problém? Makro běží v WorkbookA. Když uložím jako soubor jako RegionEast.xlsx a poté zavřete RegionEast.xlsx, makro přestane fungovat.

Než vidím problém, jsem obvykle hluboko v pseudokódu.

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

Kdybych přemýšlel dopředu, vytvořil bych řešení pro dva sešity. Vložte všechna makra do WorkbookA. Vložte všechna data do WorkbookB. Nechte WorkbookA opakovaně otevřít WorkbookB, změňte data, SaveAs, Zavřít.

Mírně komplikovanější

Jak stárnu a rozzuřuji se, zjišťuji, že mám méně nálady na to, abych to zvládl trochu komplikovaněji. Zejména proto, že většinu kódu pracuji pro původní příkaz SaveAs.

Dnešní článek pojednává o úžasné metodě VBA pro SaveAsCopy. Tento příkaz ponechá WorkbookA otevřený a nazvaný WorkbookA. Makro může běžet dál. Ale zapíše aktuální stav sešitu do nového uzavřeného sešitu s názvem WorkbookB.

To mi umožňuje vrátit se k původnímu vývojovému diagramu:

Jednodušší logika, vše samostatné

Zjistil jsem však jeden problém s SaveAsCopy. Když udělám ThisWorkbook.SaveAs, můžu si vybrat, jestli chci uložit jako XLSX nebo XLSM. Pokud potřebuji, aby makra byla k dispozici v novém sešitu, použiji XLSM. Jinak použiji XLSX a makra zmizí.

Bohužel, pokud jste v sešitu XLSM, nemůžete úspěšně .SaveAsCopy a změnit na XLSX. Kód bude fungovat. Výsledný sešit se ale neotevře, protože Excel detekuje nesprávnou shodu mezi typem souboru a příponou souboru.

Mým řešením je SaveAsCopy jako XLSM. Jakmile je kopie uložena, můžu otevřít sešit (vytvoření dvou kopií sešitu v paměti) a poté 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

Sledovat video

Přepis videa

Naučte se Excel z Podcastu, epizoda 2213: Uložit jako pomocí VBA, ale ponechat původní otevřený.

Hej, vítej zpět na netcastu. Jsem Bill Jelen. Možná jste si všimli, že v poslední době nabízím stažení každého podcastu, protože mě o to mnoho lidí žádalo, a tak jsem se snažil co nejvíce usnadnit život. Celým cílem bylo uložit kopii, kterou si můžete stáhnout, ale já jsem nechtěl ty extra věci - víte, ty, které jsou pro mé vlastní interní použití - tam, tak jsem se toho chtěl zbavit.

A víte, řekněme, že jsem měl situaci, že jsem musel napsat 12 sešitů, že? Každý s jiným produktem. Takže se projdu těmito produkty a napíšu to tam do A2 a pak uložím sešit a možná vyčistím nějaké věci. V pořádku. Takže můj první průchod je toto makro, dobře? Definujeme tedy aktuální sešit - Pracovní listy („Data“, Pracovní listy („Sestava“), abychom je našli - a poté zjistíme, kolik řádků dat dnes máme. poslední řádek, zkopírujte produkt z datového sešitu do sešitu sestavy.

Dobře, a teď se dostanu do problémů. Nový sešit se tedy bude jmenovat „C: aaa “ a potom Apple.xlsx a já se chystám uložit jako, víte, s Apple.xlsx a přejít na XML - otevřít xml sešit- - který odstraní makra. V pořádku. Ale teď bych ten sešit chtěl zavřít, ale bohužel, když uděláte Uložit jako - viz právě teď, jsem v podcastu 2013 - když udělám Uložit jako po tomto bodě v kódu, nejsem již bude v Podcastu 2013; Budu v Apple.xlsx. V pořádku? Takže teď, když chci začít mazat věci, budu to mazat v kopii, ale když zavřu kopii, nemohu se vrátit k původnímu souboru. V pořádku? A toto makro - ve skutečnosti se moje hlava chystá explodovat při pokusu zjistit, zda smyčka bude stále fungovat nebo nebude fungovat,že jo? Takže si myslím, že Save As je špatný způsob, jak jít sem.

No, vlastně vydrž. Mohli bychom jít dvěma cestami: Nejprve bych mohl mít další sešit, který otevře Podcast 2213, udělá věci a pak uloží Stejně jako u nového názvu, nebo jdu touto cestou, dobře, a to je metoda, kterou jsem skončil using-- v pořádku, a budeme definovat tento sešit, ale také nový sešit. Že jo. A tady dole je všechno trochu stejné, dokud se nedostaneme do bodu, kdy jsem se chystal udělat WBT.SaveAs. Podívejte se na toto: SaveCopyAs - nyní, pokud vím, v běžném Excelu neexistuje … toto je pouze VBA. SaveCopyAs říká: „Hele, podívej, jsme v souboru s názvem 2213 a chci, abys vzal tento soubor 2213 v jeho aktuálním stavu, uložil jej na disk a zavřel.“ Ponechte původní soubor otevřený - 2213 zůstane otevřených - ale nyní máme na disku zcela nový soubor s názvem Apple.xlsm. Vlastně nejprveProstě to nazvu DeleteMe.xlsm. V pořádku. Ale vytváří identickou kopii a udržuje původní soubor - soubor, ve kterém je spuštěno makro - otevřený, a to je důležitá část, že? Takže teď, když tam mám DeleteMe, otevřu to, přiřadím to WBN, udělám věci, které musím udělat, zbavím se všech dalších listů - vím, co mám. Všimněte si, že předtím, než odstraníte listy, chcete udělat DisplayAlerts = False, jinak se vás stále ptá: „Hej, nedostaneš list zpět.“ Chápu to. A konečně zde vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra. A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.Ale vytváří identickou kopii a udržuje původní soubor - soubor, ve kterém je spuštěno makro - otevřený, a to je důležitá část, že? Takže teď, když tam mám DeleteMe, otevřu to, přiřadím to WBN, udělám věci, které musím udělat, zbavím se všech dalších listů - vím, co mám. Všimněte si, že předtím, než odstraníte listy, chcete udělat DisplayAlerts = False, jinak se vás stále ptá: „Hej, nedostaneš list zpět.“ Chápu to. A konečně zde vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra. A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.Ale vytváří identickou kopii a udržuje původní soubor - soubor, ve kterém je spuštěno makro - otevřený, a to je důležitá část, že? Takže teď, když tam mám DeleteMe, otevřu to, přiřadím to WBN, udělám věci, které musím udělat, zbavím se všech dalších listů - vím, co mám. Všimněte si, že předtím, než odstraníte listy, chcete udělat DisplayAlerts = False, jinak se vás stále ptá: „Hej, nedostaneš list zpět.“ Chápu to. A konečně zde vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra. A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.že jo? Takže teď, když tam mám DeleteMe, otevřu to, přiřadím to WBN, udělám věci, které musím udělat, zbavím se všech dalších listů - vím, co mám. Všimněte si, že předtím, než odstraníte listy, chcete udělat DisplayAlerts = False, jinak se vás stále ptá: „Hej, nedostaneš list zpět.“ Chápu to. A konečně zde vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra. A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.že jo? Takže teď, když tam mám DeleteMe, otevřu to, přiřadím to WBN, udělám věci, které musím udělat, zbavím se všech dalších listů - vím, co mám. Všimněte si, že předtím, než odstraníte listy, chcete udělat DisplayAlerts = False, jinak se vás stále ptá: „Hej, nedostaneš list zpět.“ Chápu to. A konečně zde vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra. A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.nechystám se dostat list zpět. "Chápu to. A konečně tady, vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.nechystám se dostat list zpět. "Chápu to. A konečně tady, vyberte první list FN, který bude Apple.xlsx, a pak můžeme udělat WBN.SaveAs Apple jako Open XMLWorkbook. Žádná makra A pak Zavřít - krásná věc na Zavřít je, že jsem teď zpátky v tomto sešitu, 2213.

Dobře, funguje to opravdu, opravdu dobře a klíčem k celé této věci je SaveCopyAs-- SaveCopyAs. Takže pro mě - no, je to už dlouho - nikdy jsem to nepoužil, a teď si uvědomuji, že v minulosti to bylo pravděpodobně mnohokrát, kdy jsem to měl použít. A možná, víte, byste jej měli používat nebo také zvážit jeho použití.

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.

Shrnutí dneška: Chcete, aby VBA napsala několik kopií aktuálního sešitu; Uložit jako způsobuje problémy, protože původní sešit již není otevřený; místo toho použijete .SaveAsCopy k uložení kopie sešitu. Pokud si chcete stáhnout sešit z dnešního videa, včetně makra, navštivte adresu URL v popisu YouTube.

Chci, abyste se zastavili, uvidíme se příště na dalším netcastu z.

Stáhněte si soubor Excel

Stažení souboru aplikace Excel: save-as-keep-original-open.xlsm

Excel myšlenka dne

Požádal jsem své přátele Excel Master o radu ohledně Excelu. Dnešní myšlenka k zamyšlení:

„Data jsou čísla, ne slova.“

Duane Aubin

Zajímavé články...