Orijinali Açık Tutarak Farklı Kaydet - Excel İpuçları

İçindekiler

Bir ay içinde kendisinin birçok kopyasını oluşturmak için bir Excel çalışma kitabına ihtiyaç duyduğum birçok kez oluyor. Genellikle * çalışma kitabını * açarak bir mantık hatasıyla karşılaşıyorum ve bir listede döngü yapmak için kod yazmaya başlıyorum ve çalışma kitabının bir kopyasını kaydetmek için Dosya, Farklı Kaydet'i kullanıyorum.

İşte akış şeması:

Çalışma kitabını kapattığımda mantık hatası

Yukarıdaki sorunu görüyor musunuz? Makro, Çalışma KitabıA'da çalışıyor. Dosyayı RegionEast.xlsx olarak kaydettiğimde ve sonra RegionEast.xlsx'i kapattığımda, makronun çalışması duracak.

Sorunu görmeden önce genellikle sözde kodun derinlerine inerim.

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

İleriye dönük düşünseydim, iki çalışma kitabından oluşan bir çözüm yaratırdım. Tüm makroları Çalışma Kitabı A'ya koyun. Tüm verileri Çalışma KitabıB'ye koyun. WorkbookA'nın tekrar tekrar WorkbookB'yi açmasını sağlayın, verileri değiştirin, SaveAs, Close.

Biraz daha karmaşık

Yaşlandıkça ve daha huysuzlaştıkça, biraz daha karmaşık hale gelme havasında olduğumu görüyorum. Özellikle de orijinal SaveAs komutu için çalışan kodun çoğuna sahip olduğum için.

Bugünün makalesi, SaveAsCopy için harika VBA yöntemi hakkındadır. Bu komut WorkbookA'yı açık tutacak ve WorkbookA olarak adlandırılacaktır. Makro çalışmaya devam edebilir. Ancak, çalışma kitabının mevcut durumunu Çalışma KitabıB adlı yeni bir kapalı çalışma kitabına yazacaktır.

Bu, orijinal akış şemasına geri dönmeme izin veriyor:

Daha basit mantık, tamamen bağımsız

Ancak SaveAsCopy ile ilgili bir sorun keşfettim. ThisWorkbook.SaveAs'ı yaptığımda, XLSX veya XLSM olarak kaydetmek isteyip istemediğimi seçebilirim. Makroların yeni çalışma kitabında bulunmasına ihtiyacım olursa, XLSM kullanırım. Aksi takdirde, XLSX kullanırım ve makrolar kaybolur.

Ne yazık ki, bir XLSM çalışma kitabındaysanız, başarılı bir şekilde .SaveAsCopy kopyalayamaz ve XLSX olarak değiştiremezsiniz. Kod çalışacak. Ancak, Excel, dosya türü ile dosya uzantısı arasında bir yanlış eşleşme algıladığından ortaya çıkan çalışma kitabı açılmaz.

Benim çözümüm, XLSM olarak SaveAsCopy'dir. Kopya kaydedildikten sonra, çalışma kitabını açabilir (çalışma kitabının iki kopyasını bellekte oluşturabilir) ve ardından SaveAs XLSX yapabilirim.

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

Video izle

Video Metni

Podcast'ten Excel Öğrenin, Bölüm 2213: VBA Kullanarak Farklı Kaydet, Ancak Orijinali Açık Tutun.

Hey, İnternet'e tekrar hoş geldiniz. Ben Bill Jelen. Son zamanlarda her bir podcast'in indirilmesini teklif ettiğimi fark etmişsinizdir çünkü birçok insan benden bunu istiyordu ve bu yüzden hayatı olabildiğince kolaylaştırmaya çalışıyordum. Ve tüm amaç indirebileceğiniz bir kopyasını kaydetmekti, ama fazladan şeyler istemedim - bilirsiniz, kendi iç kullanımım için olan şeyler-- orada, bu yüzden ondan kurtulmak istedim.

Ve bilirsiniz, diyelim ki 12 çalışma kitabı yazmak zorunda kaldım, değil mi? Her biri farklı bir ürüne sahip. Bu yüzden, bu ürünler arasında bir döngü yapacağım ve oraya A2'ye yazacağım ve sonra çalışma kitabını kaydedeceğim ve belki bazı şeyleri temizleyeceğim. Peki. Yani buradan ilk geçişim bunun gibi bir makro, tamam mı? Bu nedenle, mevcut çalışma kitabını tanımlıyoruz - Bunları bulmak için Çalışma Sayfaları ("Veriler), Çalışma Sayfaları (" Rapor ") - ve sonra bugün kaç satır veriye sahip olduğumuzu hesaplıyoruz, 2. Satırdan aşağıya döneceğiz. son satırda, ürünü veri çalışma kitabından rapor çalışma kitabına kopyalayın.

Pekala, şimdi başım belaya girecek yer burası. Yeni çalışma kitabının adı "C: aaa " ve ardından Apple.xlsx olacak ve Apple.xlsx ile Farklı Kaydet'i yapacağım ve XML'e geçeceğim - xml çalışma kitabını aç- - bu da makroları çıkarır. Peki. Ama şimdi bu çalışma kitabını kapatmak istiyorum, ancak ne yazık ki Farklı Kaydet'i yaptığınızda - şu anda bakın, podcast 2013'teyim - kodda bu noktadan sonra Farklı Kaydet'i yaptığımda, hayır artık Podcast 2013'te olacak; Apple.xlsx'te olacağım. Peki? Yani, şimdi, bir şeyleri silmeye başlamak istersem, onu kopyadan sileceğim, ancak kopyayı kapattığımda, orijinal dosyaya geri dönemiyorum. Peki? Ve bu makro-- aslında, döngünün hala çalışıp çalışmayacağını anlamaya çalışırken kafam patlamak üzere.sağ? Bu yüzden Farklı Kaydet'in buraya gitmenin yanlış yolu olduğunu düşünüyorum.

Aslında bekle. İki rotaya gidebiliriz: Birincisi, Podcast 2213'ü açan, işleri yapan ve sonra yeni adla Farklı Kaydeden başka bir çalışma kitabım olabilir veya bu şekilde gideceğim, pekala ve bu benim bitirdiğim yöntem Tamam, ve bu çalışma kitabını tanımlayacağız, ama sonra da yeni bir çalışma kitabı. Sağ. Ve WBT yapmak üzere olduğum noktaya gelene kadar burada her şey aynı. Şuna bir bakın: SaveCopyAs - şimdi, söyleyebildiğim kadarıyla normal Excel'de bu mevcut değil… bu yalnızca VBA. SaveCopyAs diyor ki, "Hey, 2213 adlı bir dosyadayız ve 2213 numaralı dosyayı şu anki durumunda alıp diske kaydedip kapatmanızı istiyorum." Orijinal dosyayı açık tutun - 2213 açık kalır - ancak şimdi diskte Apple.xlsm adında yepyeni bir dosyamız var. Aslında, ilk başta benm ona DeleteMe.xlsm adını vereceğim. Peki. Ancak özdeş bir kopya oluşturur ve orijinal dosyayı - makronun içinde çalıştığı dosya-- açık tutar ve önemli olan bu, değil mi? Artık orada DeleteMe var, onu açıyorum, WBN'ye atıyorum, yapmam gereken şeyleri yapıyorum, tüm ekstra sayfalardan kurtuluyorum - neye sahip olduğumu biliyorum. Sayfaları silmeden önce DisplayAlerts = False yapmak istiyorsunuz, aksi takdirde size "Hey, sayfayı geri alamayacaksınız." Anladım. Ve sonra, son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Açık XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 2213.Ancak özdeş bir kopya oluşturur ve orijinal dosyayı - makronun içinde çalıştığı dosya - açık tutar ve önemli olan bu, değil mi? Artık orada DeleteMe var, onu açıyorum, WBN'ye atıyorum, yapmam gereken şeyleri yapıyorum, tüm ekstra sayfalardan kurtuluyorum - neye sahip olduğumu biliyorum. Sayfaları silmeden önce DisplayAlerts = False yapmak istiyorsunuz, aksi takdirde size "Hey, sayfayı geri alamayacaksınız." Anladım. Ve sonra, son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Açık XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 2213.Ancak özdeş bir kopya oluşturur ve orijinal dosyayı - makronun içinde çalıştığı dosya - açık tutar ve önemli olan bu, değil mi? Artık orada DeleteMe var, onu açıyorum, WBN'ye atıyorum, yapmam gereken şeyleri yapıyorum, tüm ekstra sayfalardan kurtuluyorum - neye sahip olduğumu biliyorum. Sayfaları silmeden önce DisplayAlerts = False yapmak istiyorsunuz, aksi takdirde size "Hey, sayfayı geri alamayacaksınız." Anladım. Ve sonra, son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Açık XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 2213.sağ? Artık orada DeleteMe var, onu açıyorum, WBN'ye atıyorum, yapmam gereken şeyleri yapıyorum, tüm ekstra sayfalardan kurtuluyorum - neye sahip olduğumu biliyorum. Sayfaları silmeden önce DisplayAlerts = False yapmak istiyorsunuz, aksi takdirde size "Hey, sayfayı geri alamayacaksınız." Anladım. Ve sonra, son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Açık XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 2213.sağ? Artık orada DeleteMe var, onu açıyorum, WBN'ye atıyorum, yapmam gereken şeyleri yapıyorum, tüm ekstra sayfalardan kurtuluyorum - neye sahip olduğumu biliyorum. Sayfaları silmeden önce DisplayAlerts = False yapmak istiyorsunuz, aksi takdirde size "Hey, sayfayı geri alamayacaksınız." Anladım. Ve sonra, son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Açık XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 2213.Sayfayı geri almayacağız. "Anlıyorum. Ve son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Open XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 2213.Sayfayı geri almayacağız. "Anlıyorum. Ve son olarak burada, ilk çalışma sayfasını seçin FN Apple.xlsx olacak ve sonra WBN.SaveAs Apple'ı Open XMLWorkbook olarak yapabiliriz. Makro yok. Ve sonra Kapat-- Close'un güzel yanı, şimdi bu çalışma kitabına geri döndüm, 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.

Bugünden toparlama: VBA'nın mevcut çalışma kitabının birkaç kopyasını yazmasını istiyorsunuz; Farklı Kaydet, özgün çalışma kitabı artık açık olmadığı için sorunlara neden olur; bunun yerine çalışma kitabının bir kopyasını kaydetmek için .SaveAsCopy kullanırsınız. Çalışma kitabını makro da dahil olmak üzere bugünün videosundan indirmek istiyorsanız, YouTube açıklamasındaki URL'yi ziyaret edin.

Uğradığın için seni istiyorum, bir dahaki sefere başka bir internet yayını için görüşürüz.

Excel Dosyasını İndirin

Excel dosyasını indirmek için: orijinal olarak kaydetme-açık.xlsm

Excel Günün Düşüncesi

Excel Master arkadaşlarıma Excel hakkında tavsiyelerini sordum. Bugünün düşüncesi:

"Tarihler sayıdır, kelimeler değil."

Duane Aubin

Ilginç makaleler...