Salva con nome mantenendo l'originale aperto - Suggerimenti per Excel

Sommario

Ci sono molte volte in un mese in cui ho bisogno di una cartella di lavoro di Excel per creare molte copie di se stessa. Di solito entro in un bug logico aprendo * la * cartella di lavoro e inizio a scrivere codice per scorrere un elenco e utilizzare File, Salva con nome per salvare una copia della cartella di lavoro.

Ecco il diagramma di flusso:

Errore logico quando chiudo la cartella di lavoro

Vedi il problema sopra? La macro è in esecuzione in WorkbookA. Quando salvo il file come RegionEast.xlsx e quindi chiudo RegionEast.xlsx, la macro smetterà di funzionare.

Di solito sono in profondità nello pseudocodice prima di vedere il problema.

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

Se avessi pensato al futuro, avrei creato una soluzione a due cartelle di lavoro. Metti tutte le macro in WorkbookA. Metti tutti i dati in WorkbookB. Fai in modo che WorkbookA apra ripetutamente WorkbookB, modifica i dati, Salva con nome, Chiudi.

Leggermente più complicato

Quando divento più grande e più irritabile, sto scoprendo di essere meno dell'umore per andare con un po 'più complicato. Soprattutto perché la maggior parte del codice funziona per il comando SaveAs originale.

L'articolo di oggi riguarda il fantastico metodo VBA per SaveAsCopy. Questo comando manterrà aperto WorkbookA e chiamato WorkbookA. La macro può continuare a funzionare. Ma scriverà lo stato corrente della cartella di lavoro in una nuova cartella di lavoro chiusa chiamata WorkbookB.

Questo mi permette di tornare al diagramma di flusso originale:

Logica più semplice, tutto autonomo

Tuttavia, ho scoperto un problema con SaveAsCopy. Quando eseguo ThisWorkbook.SaveAs, posso scegliere se salvare come XLSX o XLSM. Se ho bisogno che le macro siano disponibili nella nuova cartella di lavoro, allora utilizzo XLSM. Altrimenti, uso XLSX e le macro scompariranno.

Sfortunatamente, se ti trovi in ​​una cartella di lavoro XLSM, non puoi salvare con successo come copia e passare a XLSX. Il codice funzionerà. Ma la cartella di lavoro risultante non si aprirà poiché Excel rileva una mancata corrispondenza tra il tipo di file e l'estensione del file.

La mia soluzione è SaveAsCopy come XLSM. Una volta salvata la copia, posso aprire la cartella di lavoro (creando due copie della cartella di lavoro in memoria) e poi 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

Guarda un video

Trascrizione del video

Impara Excel da Podcast, episodio 2213: Salva con nome utilizzando VBA, ma mantieni l'originale aperto.

Ehi, bentornato al netcast. Sono Bill Jelen. Bene, potresti aver notato che recentemente ho offerto il download di ogni podcast perché molte persone me lo chiedevano e quindi stavo cercando di rendere la vita il più semplice possibile. E l'intero obiettivo era salvare una copia che puoi scaricare, ma non volevo la roba extra - sai, la roba che è per il mio uso interno - lì, quindi volevo sbarazzarmene.

E, sai, diciamo che ho avuto una situazione in cui ho dovuto scrivere 12 cartelle di lavoro, giusto? Ognuno con un prodotto diverso. Quindi, farò scorrere questi prodotti e lo scriverò lì su A2 e poi salverò la cartella di lavoro, e forse ripulirò alcune cose. Tutto a posto. Quindi il mio primo passaggio qui è una macro come questa, va bene? Quindi, definiamo la cartella di lavoro corrente - Fogli di lavoro ("Dati), Fogli di lavoro (" Rapporto ") per trovarli - e poi calcoliamo quante righe di dati abbiamo oggi, andremo in ciclo dalla riga 2 fino a l'ultima riga, copia il prodotto dalla cartella di lavoro dei dati alla cartella di lavoro del report.

Va bene, e ora è qui che sto per finire nei guai. Quindi la nuova cartella di lavoro si chiamerà "C: aaa " e poi Apple.xlsx, e io salverò come, sai, con Apple.xlsx e passerò a XML - apri la cartella di lavoro xml- - che eliminerà le macro. Tutto a posto. Ma ora vorrei chiudere quella cartella di lavoro, ma sfortunatamente quando esegui un Salva con nome - vedi adesso, sono nel podcast 2013 - quando eseguo un Salva con nome dopo quel punto nel codice sarà più presente in Podcast 2013; Sarò in Apple.xlsx. Tutto a posto? Quindi, ora, se voglio iniziare a cancellare qualcosa, lo cancellerò nella copia, ma quando chiudo la copia, beh, non posso tornare al file originale. Tutto a posto? E questa macro … in realtà, la mia testa sta per esplodere cercando di capire se il ciclo continuerà a funzionare o meno,destra? Quindi penso che Salva con nome sia il modo sbagliato di andare qui.

Beh, in realtà, aspetta. Potremmo seguire due strade: in primo luogo, potrei avere un'altra cartella di lavoro che apre Podcast 2213, fa le cose e poi salva come con il nuovo nome, o vado da questa parte, va bene, e questo è il metodo che ho finito using-- va bene, e definiremo questa cartella di lavoro, ma anche una nuova cartella di lavoro. Destra. E tutto è più o meno lo stesso quaggiù fino ad arrivare al punto in cui stavo per fare il WBT. Controlla questo: SaveCopyAs-- ora, questo non esiste, per quanto ne so, nel normale Excel … questo è solo VBA. SaveCopyAs dice: "Ehi, guarda, siamo in un file chiamato 2213 e voglio che tu prenda il file 2213 nel suo stato corrente, lo salvi su disco e chiudi". Mantieni aperto il file originale - 2213 rimane aperto - ma ora abbiamo un file nuovo di zecca su disco chiamato Apple.xlsm. In realtà, all'inizio, io "Lo chiamerò semplicemente DeleteMe.xlsm. Tutto a posto. Ma crea una copia identica e mantiene aperto il file originale, il file in cui è in esecuzione la macro, e questa è la parte importante, giusto? Quindi ora che ho DeleteMe là fuori, lo apro, lo assegno a WBN, faccio le cose che devo fare, mi sbarazzo di tutti i fogli extra - So cosa ho. Nota, prima di eliminare i fogli, vuoi fare DisplayAlerts = False, altrimenti continua a chiederti "Ehi, non riavrai indietro il foglio". Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN che sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro. E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 2213.Ma crea una copia identica e mantiene aperto il file originale, il file in cui è in esecuzione la macro, e questa è la parte importante, giusto? Quindi ora che ho DeleteMe là fuori, lo apro, lo assegno a WBN, faccio le cose che devo fare, mi sbarazzo di tutti i fogli extra - So cosa ho. Nota, prima di eliminare i fogli, vuoi fare DisplayAlerts = False, altrimenti continua a chiederti "Ehi, non riavrai indietro il foglio". Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN che sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro. E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 2213.Ma crea una copia identica e mantiene aperto il file originale, il file in cui è in esecuzione la macro, e questa è la parte importante, giusto? Quindi ora che ho DeleteMe là fuori, lo apro, lo assegno a WBN, faccio le cose che devo fare, mi sbarazzo di tutti i fogli extra - So cosa ho. Nota, prima di eliminare i fogli, vuoi eseguire DisplayAlerts = False, altrimenti continua a chiederti "Ehi, non riavrai indietro il foglio". Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN che sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro. E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 2213.destra? Quindi ora che ho DeleteMe là fuori, lo apro, lo assegno a WBN, faccio le cose che devo fare, mi sbarazzo di tutti i fogli extra - So cosa ho. Nota, prima di eliminare i fogli, vuoi fare DisplayAlerts = False, altrimenti continua a chiederti "Ehi, non riavrai indietro il foglio". Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN che sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro. E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 2213.destra? Quindi ora che ho DeleteMe là fuori, lo apro, lo assegno a WBN, faccio le cose che devo fare, mi sbarazzo di tutti i fogli extra - So cosa ho. Nota, prima di eliminare i fogli, vuoi fare DisplayAlerts = False, altrimenti continua a chiederti "Ehi, non riavrai indietro il foglio". Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN che sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro. E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 2213.Non recupererò il foglio. "Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 2213.Non recupererò il foglio. "Capisco. E poi, finalmente qui, seleziona il primo foglio di lavoro FN sarà Apple.xlsx, quindi possiamo fare WBN.SaveAs Apple, come Open XMLWorkbook. Nessuna macro E poi Close - la cosa bella di Close è che ora sono tornato in questa cartella di lavoro, 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.

Conclusione da oggi: si desidera che VBA scriva diverse copie della cartella di lavoro corrente; Salva con nome causa problemi perché la cartella di lavoro originale non è più aperta; invece si utilizza .SaveAsCopy per salvare una copia della cartella di lavoro. Se desideri scaricare la cartella di lavoro dal video di oggi, inclusa la macro, visita l'URL nella descrizione di YouTube.

Voglio che tu sia passato, ci vediamo la prossima volta per un altro netcast da.

Scarica il file Excel

Per scaricare il file excel: save-as-mantenendo-original-open.xlsm

Excel pensiero del giorno

Ho chiesto ai miei amici di Excel Master per i loro consigli su Excel. Pensiero di oggi su cui riflettere:

"Le date sono numeri, non parole."

Duane Aubin

Articoli interessanti...