Speichern unter Offenhalten des Originals - Excel-Tipps

Inhaltsverzeichnis

Es gibt viele Male in einem Monat, in denen ich eine Excel-Arbeitsmappe benötige, um viele Kopien von sich selbst zu erstellen. Normalerweise gerate ich durch Öffnen der * Arbeitsmappe * in einen logischen Fehler und beginne, Code zu schreiben, um eine Liste zu durchlaufen und Datei, Speichern unter zu verwenden, um eine Kopie der Arbeitsmappe zu speichern.

Hier ist das Flussdiagramm:

Logikfehler beim Schließen der Arbeitsmappe

Sehen Sie das Problem oben? Das Makro wird in WorkbookA ausgeführt. Wenn ich die Datei als RegionEast.xlsx speichere und dann RegionEast.xlsx schließe, wird das Makro nicht mehr ausgeführt.

Ich bin normalerweise tief im Pseudocode, bevor ich das Problem sehe.

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

Hätte ich vorausgedacht, hätte ich eine Lösung mit zwei Arbeitsmappen erstellt. Fügen Sie alle Makros in WorkbookA ein. Fügen Sie alle Daten in WorkbookB ein. Lassen Sie WorkbookA WorkbookB wiederholt öffnen, ändern Sie die Daten, SaveAs, Close.

Etwas komplizierter

Wenn ich älter und launischer werde, stelle ich fest, dass ich weniger in der Stimmung bin, etwas komplizierter zu werden. Zumal ich den größten Teil des Codes für den ursprünglichen SaveAs-Befehl habe.

Der heutige Artikel handelt von der großartigen VBA-Methode für SaveAsCopy. Dieser Befehl hält WorkbookA geöffnet und heißt WorkbookA. Das Makro kann weiter ausgeführt werden. Der aktuelle Status der Arbeitsmappe wird jedoch in eine neue geschlossene Arbeitsmappe namens WorkbookB geschrieben.

Dadurch kann ich zum ursprünglichen Flussdiagramm zurückkehren:

Einfachere Logik, alles in sich geschlossen

Ich habe jedoch ein Problem mit SaveAsCopy entdeckt. Wenn ich ThisWorkbook.SaveAs mache, kann ich wählen, ob ich als XLSX oder XLSM speichern möchte. Wenn die Makros in der neuen Arbeitsmappe verfügbar sein sollen, verwende ich XLSM. Ansonsten benutze ich XLSX und die Makros verschwinden.

Wenn Sie sich in einer XLSM-Arbeitsmappe befinden, können Sie .SaveAsCopy leider nicht erfolgreich ausführen und zu XLSX wechseln. Der Code wird funktionieren. Die resultierende Arbeitsmappe wird jedoch nicht geöffnet, da Excel eine Nichtübereinstimmung zwischen Dateityp und Dateierweiterung feststellt.

Meine Lösung ist SaveAsCopy als XLSM. Sobald die Kopie gespeichert ist, kann ich die Arbeitsmappe öffnen (zwei Kopien der Arbeitsmappe im Speicher erstellen) und dann 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

Schau Video

Video-Transkript

Lernen Sie Excel aus Podcast, Episode 2213: Speichern unter Verwendung von VBA, aber lassen Sie das Original offen.

Hey, willkommen zurück im Netcast. Ich bin Bill Jelen. Nun, Sie haben vielleicht bemerkt, dass ich kürzlich den Download jedes Podcasts angeboten habe, weil mich viele Leute danach gefragt haben, und deshalb habe ich versucht, das Leben so einfach wie möglich zu gestalten. Das ganze Ziel war es, eine Kopie zu speichern, die Sie herunterladen können, aber ich wollte nicht die zusätzlichen Dinge - wissen Sie, die Dinge, die für meinen eigenen internen Gebrauch bestimmt sind - dort, also wollte ich sie loswerden.

Nehmen wir an, ich hatte eine Situation, in der ich 12 Arbeitsmappen schreiben musste, oder? Jeweils mit einem anderen Produkt. Also werde ich diese Produkte durchlaufen und sie dort an A2 schreiben und dann die Arbeitsmappe speichern und vielleicht ein paar Dinge aufräumen. In Ordung. Mein erster Durchgang hier ist also ein Makro wie dieses, okay? Also definieren wir die aktuelle Arbeitsmappe - Arbeitsblätter ("Daten), Arbeitsblätter (" Bericht "), um diese zu finden - und finden dann heraus, wie viele Datenzeilen wir heute haben. Wir werden von Zeile 2 bis hinunter schleifen Kopieren Sie in der letzten Zeile das Produkt aus der Datenarbeitsmappe in die Berichtsarbeitsmappe.

Okay, und jetzt werde ich hier in Schwierigkeiten geraten. Die neue Arbeitsmappe heißt also "C: aaa " und dann Apple.xlsx, und ich werde mit Apple.xlsx als speichern, wissen Sie, und zu XML wechseln - öffnen Sie die XML-Arbeitsmappe. - wodurch die Makros entfernt werden. In Ordung. Aber jetzt möchte ich diese Arbeitsmappe schließen, aber leider, wenn Sie ein Speichern unter durchführen - siehe jetzt, ich bin im Podcast 2013 -, wenn ich nach diesem Punkt im Code ein Speichern unter mache, bin ich nein wird länger im Podcast 2013 sein; Ich werde in Apple.xlsx sein. In Ordung? Wenn ich jetzt mit dem Löschen von Inhalten beginnen möchte, werde ich sie in der Kopie löschen, aber wenn ich die Kopie schließe, kann ich nicht zur ursprünglichen Datei zurückkehren. In Ordung? Und dieses Makro - tatsächlich explodiert mein Kopf und versucht herauszufinden, ob die Schleife noch funktioniert oder nicht.Recht? Daher denke ich, dass Speichern unter der falsche Weg ist, um hierher zu gelangen.

Nun, eigentlich, warte. Wir könnten zwei Wege gehen: Erstens könnte ich eine andere Arbeitsmappe haben, die Podcast 2213 öffnet, das Zeug macht und dann mit dem neuen Namen speichert, oder ich gehe diesen Weg, okay, und dies ist die Methode, die ich am Ende gefunden habe using-- in Ordnung, und wir werden diese Arbeitsmappe definieren, aber dann auch eine neue Arbeitsmappe. Recht. Und hier unten ist alles gleich, bis wir zu dem Punkt kommen, an dem ich WBT.SaveAs machen wollte. Schauen Sie sich das an: SaveCopyAs - jetzt existiert dies, soweit ich das beurteilen kann, in normalem Excel nicht … dies ist nur VBA. SaveCopyAs sagt: "Hey, schauen Sie, wir befinden uns in einer Datei namens 2213, und ich möchte, dass Sie diese Datei 2213 in ihrem aktuellen Zustand nehmen, auf der Festplatte speichern und schließen." Lassen Sie die Originaldatei offen - 2213 bleibt offen - aber jetzt haben wir eine brandneue Datei auf der Festplatte namens Apple.xlsm. Eigentlich habe ich zuerst 'Ich werde es einfach DeleteMe.xlsm nennen. In Ordung. Aber es erstellt eine identische Kopie und hält die Originaldatei - die Datei, in der das Makro ausgeführt wird - offen, und das ist der wichtige Teil, oder? Jetzt, wo ich DeleteMe da draußen habe, öffne ich es, weise es WBN zu, mache die Dinge, die ich tun muss, entferne alle zusätzlichen Blätter - ich weiß, was ich habe. Beachten Sie, dass Sie vor dem Löschen der Blätter DisplayAlerts = False ausführen möchten. Andernfalls werden Sie immer wieder gefragt: "Hey, Sie erhalten das Blatt nicht zurück." Ich verstehe es. Und dann, schließlich hier, wählen Sie das erste Arbeitsblatt aus, das FN Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros. Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 2213.Aber es erstellt eine identische Kopie und hält die Originaldatei - die Datei, in der das Makro ausgeführt wird - offen, und das ist der wichtige Teil, oder? Jetzt, wo ich DeleteMe da draußen habe, öffne ich es, weise es WBN zu, mache die Dinge, die ich tun muss, entferne alle zusätzlichen Blätter - ich weiß, was ich habe. Beachten Sie, dass Sie vor dem Löschen der Blätter DisplayAlerts = False ausführen möchten. Andernfalls werden Sie immer wieder gefragt: "Hey, Sie erhalten das Blatt nicht zurück." Ich verstehe es. Und dann, schließlich hier, wählen Sie das erste Arbeitsblatt aus, das FN Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros. Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 2213.Aber es erstellt eine identische Kopie und hält die Originaldatei - die Datei, in der das Makro ausgeführt wird - offen, und das ist der wichtige Teil, oder? Jetzt, wo ich DeleteMe da draußen habe, öffne ich es, weise es WBN zu, mache die Dinge, die ich tun muss, entferne alle zusätzlichen Blätter - ich weiß, was ich habe. Beachten Sie, dass Sie vor dem Löschen der Blätter DisplayAlerts = False ausführen möchten. Andernfalls werden Sie immer wieder gefragt: "Hey, Sie erhalten das Blatt nicht zurück." Ich verstehe es. Und dann, schließlich hier, wählen Sie das erste Arbeitsblatt aus, das FN Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros. Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 2213.Recht? Jetzt, wo ich DeleteMe da draußen habe, öffne ich es, weise es WBN zu, mache die Dinge, die ich tun muss, entferne alle zusätzlichen Blätter - ich weiß, was ich habe. Beachten Sie, dass Sie vor dem Löschen der Blätter DisplayAlerts = False ausführen möchten. Andernfalls werden Sie immer wieder gefragt: "Hey, Sie erhalten das Blatt nicht zurück." Ich verstehe es. Und dann, schließlich hier, wählen Sie das erste Arbeitsblatt aus, das FN Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros. Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 2213.Recht? Jetzt, wo ich DeleteMe da draußen habe, öffne ich es, weise es WBN zu, mache die Dinge, die ich tun muss, entferne alle zusätzlichen Blätter - ich weiß, was ich habe. Beachten Sie, dass Sie vor dem Löschen der Blätter DisplayAlerts = False ausführen möchten. Andernfalls werden Sie immer wieder gefragt: "Hey, Sie erhalten das Blatt nicht zurück." Ich verstehe es. Und dann, schließlich hier, wählen Sie das erste Arbeitsblatt aus, das FN Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros. Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 2213.Ich werde das Blatt nicht zurückbekommen. "Ich verstehe. Und schließlich wählen Sie hier das erste Arbeitsblatt aus, das FN als Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 2213.Ich werde das Blatt nicht zurückbekommen. "Ich verstehe. Und schließlich wählen Sie hier das erste Arbeitsblatt aus, das FN als Apple.xlsx sein wird, und dann können wir WBN.SaveAs Apple als Open XMLWorkbook ausführen. Keine Makros Und dann Close - das Schöne an Close ist, dass ich jetzt wieder in dieser Arbeitsmappe bin, 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.

Zusammenfassung von heute: Sie möchten, dass VBA mehrere Kopien der aktuellen Arbeitsmappe schreibt. Speichern unter verursacht Probleme, da die ursprüngliche Arbeitsmappe nicht mehr geöffnet ist. Stattdessen verwenden Sie .SaveAsCopy, um eine Kopie der Arbeitsmappe zu speichern. Wenn Sie die Arbeitsmappe aus dem heutigen Video einschließlich des Makros herunterladen möchten, besuchen Sie die URL in der YouTube-Beschreibung.

Ich möchte, dass Sie vorbeischauen, wir sehen uns beim nächsten Mal für einen weiteren Netcast von.

Laden Sie die Excel-Datei herunter

So laden Sie die Excel-Datei herunter: save-as-Keeping-Original-Open.xlsm

Excel-Gedanke des Tages

Ich habe meine Excel Master-Freunde um Rat zu Excel gebeten. Der heutige Gedanke zum Nachdenken:

"Daten sind Zahlen, keine Wörter."

Duane Aubin

Interessante Beiträge...