Αποθήκευση ως διατηρώντας το πρωτότυπο ανοιχτό - Συμβουλές 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. Όταν κάνω αυτό τοWorkbook.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, Episode 2213: Save as Using VBA, but Keep the Original Open.

Γεια σας, καλώς ήλθατε πίσω στο δίκτυο. Είμαι ο Μπιλ Τζέλεν. Λοιπόν, ίσως έχετε παρατηρήσει ότι προσφέρω τη λήψη κάθε podcast πρόσφατα επειδή πολλοί άνθρωποι με ρωτούν γι 'αυτό, και έτσι προσπαθούσα να κάνω τη ζωή όσο το δυνατόν πιο εύκολη. Και ολόκληρος ο στόχος ήταν να αποθηκεύσω ένα αντίγραφο που μπορείτε να κατεβάσετε, αλλά δεν ήθελα τα επιπλέον πράγματα - ξέρετε, τα πράγματα που προορίζονται για δική μου εσωτερική χρήση - εκεί, γι 'αυτό ήθελα να το ξεφορτωθώ.

Και, ξέρετε, ας πούμε ότι είχα μια κατάσταση όπου έπρεπε να γράψω 12 βιβλία εργασίας, σωστά; Κάθε ένα με ένα διαφορετικό προϊόν. Λοιπόν, θα περάσω από αυτά τα προϊόντα και θα το γράψω εκεί στο A2 και έπειτα θα σώσω το βιβλίο εργασίας και ίσως να καθαρίσω κάποια πράγματα. Καλώς. Έτσι, το πρώτο μου πέρασμα εδώ είναι μια μακροεντολή σαν αυτήν, εντάξει; Έτσι, ορίζουμε το τρέχον βιβλίο εργασίας - Φύλλα εργασίας ("Δεδομένα), Φύλλα εργασίας (" Αναφορά ") για να τα βρούμε - και στη συνέχεια να υπολογίσουμε πόσες σειρές δεδομένων έχουμε σήμερα, θα μεταβούμε από τη Σειρά 2 έως στην τελευταία σειρά, αντιγράψτε το προϊόν από το βιβλίο εργασίας δεδομένων στο βιβλίο εργασίας αναφοράς.

Εντάξει, και τώρα εδώ θα βρω πρόβλημα. Έτσι, το νέο βιβλίο εργασίας θα ονομάζεται "C: aaa " και έπειτα το Apple.xlsx και θα αποθηκεύσω ως, ξέρετε, με το Apple.xlsx και θα αλλάξω σε XML - το οποίο θα αφαιρέσει τις μακροεντολές. Καλώς. Αλλά τώρα θα ήθελα να κλείσω αυτό το βιβλίο εργασίας, αλλά δυστυχώς όταν κάνετε ένα Save As - δείτε τώρα, είμαι στο podcast 2013 - όταν κάνω ένα Save As μετά από αυτό το σημείο στον κώδικα, δεν είμαι θα είναι πλέον στο Podcast 2013. Θα είμαι στο Apple.xlsx. Καλώς? Έτσι, τώρα, αν θέλω να αρχίσω να διαγράφω πράγματα, θα το διαγράψω στο αντίγραφο, αλλά όταν κλείσω το αντίγραφο, λοιπόν, δεν μπορώ να επιστρέψω στο αρχικό αρχείο. Καλώς? Και αυτή η μακροεντολή - στην πραγματικότητα, το κεφάλι μου πρόκειται να εκραγεί προσπαθώντας να καταλάβω εάν ο βρόχος θα συνεχίσει να λειτουργεί ή όχι,σωστά? Πιστεύω λοιπόν ότι το Save As είναι ο λανθασμένος τρόπος να πάτε εδώ.

Λοιπόν, στην πραγματικότητα, περίμενε. Θα μπορούσαμε να ακολουθήσουμε δύο διαδρομές: Πρώτον, θα μπορούσα να έχω ένα άλλο βιβλίο εργασίας που ανοίγει το Podcast 2213, κάνει τα πράγματα και έπειτα Saves As με το νέο όνομα, ή θα πάω έτσι, εντάξει, και αυτή είναι η μέθοδος που κατέληξα χρησιμοποιώντας-- εντάξει, και θα ορίσουμε αυτό το βιβλίο εργασίας, αλλά και επίσης ένα νέο βιβλίο εργασίας. Σωστά. Και όλα είναι παρόμοια εδώ μέχρι να φτάσουμε στο σημείο που επρόκειτο να κάνω WBT.SaveAs. Δείτε το: SaveCopyAs-- τώρα, αυτό δεν υπάρχει, όσο μπορώ να πω, στο κανονικό Excel… αυτό είναι μόνο το VBA. Το SaveCopyAs λέει, "Γεια, κοίτα είμαστε σε ένα αρχείο που ονομάζεται 2213 και θέλω να πάρετε αυτό το αρχείο 2213 στην τρέχουσα κατάσταση και να το αποθηκεύσετε στο δίσκο και να κλείσετε." Κρατήστε ανοιχτό το αρχικό αρχείο - 2213 παραμένει ανοιχτό - αλλά τώρα έχουμε ένα ολοκαίνουργιο αρχείο στο δίσκο που ονομάζεται Apple.xlsm. Στην πραγματικότητα, στην αρχή, εγώ "απλώς θα το ονομάσω DeleteMe.xlsm. Καλώς. Αλλά δημιουργεί ένα πανομοιότυπο αντίγραφο και διατηρεί το αρχικό αρχείο - το αρχείο στο οποίο εκτελείται η μακροεντολή - ανοιχτό και αυτό είναι το σημαντικό μέρος, σωστά; Τώρα που έχω DeleteMe εκεί έξω, το ανοίγω, το αναθέτω στο WBN, κάνω τα πράγματα που πρέπει να κάνω, ξεφορτωθώ όλα τα επιπλέον φύλλα - ξέρω τι έχω. Παρατηρήστε, προτού διαγράψετε τα φύλλα, θέλετε να κάνετε DisplayAlerts = False, αλλιώς σας ρωτάει, "Γεια, δεν πρόκειται να πάρετε πίσω το φύλλο." Το καταλαβαίνω. Και, τέλος, εδώ, επιλέξτε το πρώτο φύλλο εργασίας που θα είναι το FN Apple.xlsx και, στη συνέχεια, μπορούμε να κάνουμε WBN. Αποθηκεύστε ως Apple, ως Open XMLWorkbook. Χωρίς μακροεντολές. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 2213.Αλλά δημιουργεί ένα πανομοιότυπο αντίγραφο και διατηρεί το αρχικό αρχείο - το αρχείο στο οποίο εκτελείται η μακροεντολή - ανοιχτό και αυτό είναι το σημαντικό μέρος, σωστά; Τώρα που έχω DeleteMe εκεί έξω, το ανοίγω, το αναθέτω στο WBN, κάνω τα πράγματα που πρέπει να κάνω, ξεφορτωθώ όλα τα επιπλέον φύλλα - ξέρω τι έχω. Παρατηρήστε, προτού διαγράψετε τα φύλλα, θέλετε να κάνετε DisplayAlerts = False, αλλιώς σας ρωτάει, "Γεια, δεν πρόκειται να πάρετε πίσω το φύλλο." Το καταλαβαίνω. Και, τέλος, εδώ, επιλέξτε το πρώτο φύλλο εργασίας που θα είναι το FN Apple.xlsx και, στη συνέχεια, μπορούμε να κάνουμε WBN. Αποθηκεύστε ως Apple, ως Open XMLWorkbook. Χωρίς μακροεντολές. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 2213.Αλλά δημιουργεί ένα πανομοιότυπο αντίγραφο και διατηρεί το αρχικό αρχείο - το αρχείο στο οποίο εκτελείται η μακροεντολή - ανοιχτό και αυτό είναι το σημαντικό μέρος, σωστά; Τώρα που έχω DeleteMe εκεί έξω, το ανοίγω, το αναθέτω στο WBN, κάνω τα πράγματα που πρέπει να κάνω, ξεφορτωθώ όλα τα επιπλέον φύλλα - ξέρω τι έχω. Παρατηρήστε, προτού διαγράψετε τα φύλλα, θέλετε να κάνετε DisplayAlerts = False, αλλιώς σας ρωτάει, "Γεια, δεν πρόκειται να πάρετε πίσω το φύλλο." Το καταλαβαίνω. Και, τέλος, εδώ, επιλέξτε το πρώτο φύλλο εργασίας που θα είναι το FN Apple.xlsx και, στη συνέχεια, μπορούμε να κάνουμε WBN. Αποθηκεύστε ως Apple, ως Open XMLWorkbook. Χωρίς μακροεντολές. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 2213.σωστά? Τώρα που έχω DeleteMe εκεί έξω, το ανοίγω, το αναθέτω στο WBN, κάνω τα πράγματα που πρέπει να κάνω, ξεφορτωθώ όλα τα επιπλέον φύλλα - ξέρω τι έχω. Παρατηρήστε, προτού διαγράψετε τα φύλλα, θέλετε να κάνετε DisplayAlerts = False, αλλιώς σας ρωτάει, "Γεια, δεν πρόκειται να πάρετε πίσω το φύλλο." Το καταλαβαίνω. Και, τέλος, εδώ, επιλέξτε το πρώτο φύλλο εργασίας που θα είναι το FN Apple.xlsx και, στη συνέχεια, μπορούμε να κάνουμε WBN. Αποθηκεύστε ως Apple, ως Open XMLWorkbook. Χωρίς μακροεντολές. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 2213.σωστά? Τώρα που έχω DeleteMe εκεί έξω, το ανοίγω, το αναθέτω στο WBN, κάνω τα πράγματα που πρέπει να κάνω, ξεφορτωθώ όλα τα επιπλέον φύλλα - ξέρω τι έχω. Παρατηρήστε, προτού διαγράψετε τα φύλλα, θέλετε να κάνετε DisplayAlerts = False, αλλιώς σας ρωτάει, "Γεια, δεν πρόκειται να πάρετε πίσω το φύλλο." Το καταλαβαίνω. Και, τέλος, εδώ, επιλέξτε το πρώτο φύλλο εργασίας που θα είναι το FN Apple.xlsx και, στη συνέχεια, μπορούμε να κάνουμε WBN. Αποθηκεύστε ως Apple, ως Open XMLWorkbook. Χωρίς μακροεντολές. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 2213.δεν πρόκειται να πάρω το φύλλο πίσω. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 2213.δεν πρόκειται να πάρω το φύλλο πίσω. Και μετά το Κλείσιμο - το όμορφο πράγμα για το Κλείσιμο είναι τώρα επέστρεψα σε αυτό το βιβλίο εργασίας, 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 να γράψει πολλά αντίγραφα του τρέχοντος βιβλίου εργασίας. Η αποθήκευση ως προκαλεί προβλήματα επειδή το αρχικό βιβλίο εργασίας δεν είναι πλέον ανοιχτό. αντ 'αυτού χρησιμοποιείτε το .SaveAsCopy για να αποθηκεύσετε ένα αντίγραφο του βιβλίου εργασίας. Εάν θέλετε να κατεβάσετε το βιβλίο εργασίας από το σημερινό βίντεο, συμπεριλαμβανομένης της μακροεντολής, επισκεφθείτε τη διεύθυνση URL στην περιγραφή του YouTube.

Σε θέλω για να σταματήσεις, θα σε δω την επόμενη φορά για άλλο netcast από.

Λήψη αρχείου Excel

Για να κατεβάσετε το αρχείο excel: save-as-keep-original-open.xlsm

Excel Thought Of the Day

Ζήτησα από τους φίλους μου στο Excel Master τις συμβουλές τους σχετικά με το Excel. Η σημερινή σκέψη να σκεφτούμε:

"Οι ημερομηνίες είναι αριθμοί, όχι λέξεις."

Ντουάν Ομπίν

ενδιαφέροντα άρθρα...