Запазване като запазване на оригинала отворен - Съвети на Excel

Съдържание

Много пъти в месеца имам нужда от работна книга на Excel, за да създам много копия от себе си. Обикновено влизам в логическа грешка, като отворя * работната книга * и започвам да пиша код, за да прегледам списък и да използвам File, Save As, за да запазя копие на работната книга.

Ето схемата:

Логическа грешка, когато затворя работната книга

Виждате ли проблема по-горе? Макросът се изпълнява в WorkbookA. Когато запиша като файл като RegionEast.xlsx и след това затворя RegionEast.xlsx, макросът ще спре да работи.

Обикновено съм дълбоко в псевдокода, преди да видя проблема.

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

Ако мислех напред, щях да създам решение за две работни книги. Поставете всички макроси в WorkbookA. Поставете всички данни в WorkbookB. Нека WorkbookA отваря многократно WorkbookB, променя данните, SaveAs, Close.

Малко по-сложно

С напредването на възрастта и раздразнението откривам, че съм в по-малко настроение да отида с малко по-сложно. Особено след като имам по-голямата част от кода, работещ за оригиналната команда SaveAs.

Днешната статия е за страхотния VBA метод за SaveAsCopy. Тази команда ще запази WorkbookA отворена и наречена WorkbookA. Макросът може да продължи да работи. Но ще запише текущото състояние на работната книга в нова затворена работна книга, наречена WorkbookB.

Това ми позволява да се върна към първоначалната диаграма:

По-проста логика, всички самостоятелни

Открих обаче един проблем със SaveAsCopy. Когато правя ThisWorkbook.SaveAs, мога да избера дали да запазя като XLSX или XLSM. Ако имам нужда макросите да са налични в новата работна книга, тогава използвам XLSM. В противен случай използвам XLSX и макросите ще изчезнат.

За съжаление, ако сте в работна книга на XLSM, не можете успешно .SaveAsCopy и променете на XLSX. Кодът ще работи. Но получената работна книга няма да се отвори, тъй като Excel открива несъответствие между типа на файла и разширението на файла.

Моето решение е SaveAsCopy като XLSM. След като копието бъде запазено, мога да отворя работната книга (създавайки две копия на работната книга в паметта) и след това 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

Гледам видео

Видео транскрипция

Научете Excel от Podcast, епизод 2213: Запазете като използвате VBA, но запазете оригинала отворен.

Хей, добре дошъл отново в netcast. Аз съм Бил Джелен. Е, може би сте забелязали, че наскоро предлагам изтеглянето на всеки подкаст, защото много хора ме молят за това и затова се опитвах да улесня живота възможно най-много. И цялата цел беше да запазя копие, което можете да изтеглите, но не исках допълнителни неща - знаете ли, нещата, които са за моя вътрешна употреба - там, така че исках да се отърва от това.

И знаете ли, да кажем, че имах ситуация, в която трябваше да напиша 12 работни книги, нали? Всеки с различен продукт. Така че, ще прегледам тези продукти и ще го напиша там в A2 и след това ще запазя работната книга и може би ще изчистя някои неща. Добре. Така че първото ми преминаване тук е макрос като този, нали? И така, ние дефинираме текущата работна книга - Работни листове ("Данни), Работни листове (" Отчет "), за да ги намерим - и след това да разберем колко реда данни имаме днес, ще преминем от ред 2 до последния ред, копирайте продукта от работната книга с данни в работната книга на отчета.

Добре, а сега ето къде ще вляза в неприятности. Така че новата работна книга ще се нарича "C: aaa " и след това Apple.xlsx и ще запазя като, знаете ли, с Apple.xlsx и ще се промени на XML - отворена xml работна книга- - което ще премахне макросите. Добре. Но сега бих искал да затворя тази работна книга, но за съжаление, когато направите Save As - вижте точно сега, аз съм в подкаст 2013 - когато направя Save As след тази точка в кода, аз не съм по-дълго ще бъде в Podcast 2013; Ще бъда в Apple.xlsx. Добре? И така, сега, ако искам да започна да изтривам неща, ще ги изтрия в копието, но когато затворя копието, е, не мога да се върна към оригиналния файл. Добре? И този макрос - всъщност главата ми е на път да избухне, опитвайки се да разбера дали цикълът все още ще работи или не,нали? Така че мисля, че Save As е грешният начин да отида тук.

Е, всъщност, изчакайте. Бихме могли да отидем по два маршрута: Първо, бих могъл да имам друга работна книга, която отваря Podcast 2213, прави нещата и след това записва Както при новото име, или ще тръгна по този път, добре, и това е методът, който завърших използвайки - добре, и ще определим тази работна книга, но след това и нова работна книга. Нали. И всичко тук е все едно, докато стигнем до точката, в която щях да направя WBT.SaveAs. Вижте това: SaveCopyAs-- сега, доколкото мога да разбера, това не съществува в обикновения Excel … това е само VBA. SaveCopyAs казва, "Хей, вижте, намираме се във файл, наречен 2213, и искам да вземете този файл 2213 в сегашното му състояние и да го запишете на диск и да го затворите." Дръжте оригиналния файл отворен - 2213 остава отворен, но сега имаме чисто нов файл на диска, наречен Apple.xlsm. Всъщност отначало азпросто ще го нарека DeleteMe.xlsm. Добре. Но той създава идентично копие и запазва оригиналния файл - файлът, в който се изпълнява макросът - отворен и това е важната част, нали? Така че сега, когато имам DeleteMe там, аз го отварям, присвоявам го на WBN, правя нещата, които трябва да правя, да се отърва от всички излишни листове - знам какво имам. Забележете, преди да изтриете листовете, искате да направите DisplayAlerts = False, в противен случай той продължава да ви пита: "Хей, няма да си върнеш листа." Разбрах. И тогава, накрая тук, изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple, като Open XMLWorkbook. Без макроси. И тогава Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 2213.Но той създава идентично копие и запазва оригиналния файл - файлът, в който се изпълнява макросът - отворен и това е важната част, нали? Така че сега, когато имам DeleteMe там, аз го отварям, присвоявам го на WBN, правя нещата, които трябва да правя, да се отърва от всички излишни листове - знам какво имам. Забележете, преди да изтриете листовете, искате да направите DisplayAlerts = False, в противен случай той продължава да ви пита: "Хей, няма да си върнеш листа." Разбрах. И тогава, накрая тук, изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple, като Open XMLWorkbook. Без макроси. И тогава Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 2213.Но той създава идентично копие и запазва оригиналния файл - файлът, в който се изпълнява макросът - отворен и това е важната част, нали? Така че сега, когато имам DeleteMe там, аз го отварям, присвоявам го на WBN, правя нещата, които трябва да правя, да се отърва от всички излишни листове - знам какво имам. Забележете, преди да изтриете листовете, искате да направите DisplayAlerts = False, в противен случай той продължава да ви пита: "Хей, няма да си върнеш листа." Разбрах. И тогава, накрая тук, изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple, като Open XMLWorkbook. Без макроси. И тогава Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 2213.нали? Така че сега, когато имам DeleteMe там, аз го отварям, присвоявам го на WBN, правя нещата, които трябва да правя, да се отърва от всички излишни листове - знам какво имам. Забележете, преди да изтриете листовете, искате да направите DisplayAlerts = False, в противен случай той продължава да ви пита: "Хей, няма да си върнеш листа." Разбрах. И тогава, накрая тук, изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple, като Open XMLWorkbook. Без макроси. И тогава Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 2213.нали? Така че сега, когато имам DeleteMe там, аз го отварям, присвоявам го на WBN, правя нещата, които трябва да правя, да се отърва от всички излишни листове - знам какво имам. Забележете, преди да изтриете листовете, искате да направите DisplayAlerts = False, в противен случай той продължава да ви пита: "Хей, няма да си върнеш листа." Разбрах. И тогава, накрая тук, изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple, като Open XMLWorkbook. Без макроси. И тогава Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 2213.няма да си върна листа. "Разбрах го. И накрая тук изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple като Open XMLWorkbook. Без макроси И след това Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 2213.няма да си върна листа. "Разбрах го. И накрая тук изберете първия работен лист FN ще бъде Apple.xlsx и тогава можем да направим WBN.SaveAs Apple като Open XMLWorkbook. Без макроси И след това Close - красивото нещо за Close е, че сега съм отново в тази работна книга, 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.

Приключване от днес: Искате VBA да напише няколко копия на текущата работна книга; Save As създава проблеми, тъй като оригиналната работна книга вече не е отворена; вместо това използвате .SaveAsCopy, за да запазите копие на работната книга. Ако искате да изтеглите работната книга от днешното видео, включително макроса, посетете URL адреса в описанието на YouTube.

Искам да се отбиете, ще се видим следващия път за поредното излъчване от.

Изтеглете Excel файла

За да изтеглите файла на Excel: save-as-keep-original-open.xlsm

Мисъл на деня в Excel

Помолих приятелите си в Excel Master за съвети относно Excel. Днешната мисъл за размисъл:

„Датите са числа, а не думи.“

Дуейн Обен

Интересни статии...