Genel Bakış
SaveCopyAs (Workbook.SaveCopyAs), bir çalışma kitabının o anki halinin kopyasını belirtilen adla diske kaydeden yöntemdir. Açık kitabın adı, konumu ve kaydedilme durumu değişmez; bu nedenle yedek almak ve anlık görüntü saklamak için idealdir.
Kitap hiç kaydedilmemişse Path boş döner; bu durumda önce kullanıcıdan bir konum alın ya da işlemi atlayın. Uzantıyı kaynak kitabın biçimiyle uyumlu tutun: .xlsx kitabın kopyasına .xlsx, makrolu kitabın kopyasına .xlsm verin.
Makro çalıştırıldığında kitabın klasöründe Satis_ ile başlayan, bugünün tarihini taşıyan bir kopya oluşur. Siz açık kitapta çalışmaya aynı dosya üzerinden devam edersiniz.
Her çalıştırmada Yedek klasöründe saniyesine kadar farklı adlı yeni bir kopya oluşur; eski yedekler ezilmez. Kaydetme sırasında bir sorun çıkarsa On Error ile hata iletisi gösterilir.
Makro her satırda şube ve ay adını birleştirerek C sütununa yazılacak adı hazırlar. Bu sayfadaki tabloda C2 hücresi ve C3 hücresi boştur; üretilen adlar tabloda gösterilmez. Makroyu kendi kitabınızda çalıştırdığınızda oluşan adları ThisWorkbook.SaveCopyAs çağrısında klasör yoluyla birleştirerek dosya adı olarak kullanabilirsiniz.
Söz dizimi
Yöntem, bir Workbook nesnesi üzerinde çağrılır; ThisWorkbook, ActiveWorkbook ya da Workbooks("Ad.xlsx") gibi.
VBA
2 satır
ifade.SaveCopyAs(Filename)
ThisWorkbook.SaveCopyAs Filename:="C:\Yedek\Rapor_Yedek.xlsx"
- ifade: Kopyası alınacak Workbook nesnesi; zorunludur.
- Filename: Kopyanın yolunu ve dosya adını içeren metin. Belgelerde isteğe bağlı görünse de pratikte her zaman verin. Yol belirtmezseniz dosya geçerli klasöre kaydedilir; bu yüzden tam yol yazmanız önerilir.
SaveAs ve Save ile farkı
Üç yöntemi karıştırmamak önemlidir:- Save: Açık kitabı kendi dosyasına kaydeder.
- SaveAs: Açık kitabı yeni bir adla kaydeder ve kitap artık yeni dosyayı temsil eder; Excel başlık çubuğunda yeni ad görünür.
- SaveCopyAs: Kopyayı diske yazar, ancak açık kitap eski dosyasına bağlı kalır. Kitabın Saved özelliği de bu işlemle değişmez.
Dosya adı ve yolu oluşturma
Yedek adlarını genellikle metin birleştirme ile üretirsiniz. Kitabın klasörü için ThisWorkbook.Path, tarih damgası için Format işlevi kullanılır. Örneğin Format(Now, "yyyymmdd_hhmmss") her yedeğe benzersiz bir ad verir ve eski yedeklerin ezilmesini önler.Kitap hiç kaydedilmemişse Path boş döner; bu durumda önce kullanıcıdan bir konum alın ya da işlemi atlayın. Uzantıyı kaynak kitabın biçimiyle uyumlu tutun: .xlsx kitabın kopyasına .xlsx, makrolu kitabın kopyasına .xlsm verin.
1. Tarih damgalı yedek alma
Satış listesi kitabının kopyasını, bugünün tarihini dosya adına ekleyerek aynı klasöre kaydetmek istiyorsunuz. Alt+F11 ile Visual Basic Düzenleyicisi'ni açın, Ekle > Modül (Insert > Module) ile standart bir modül ekleyip kodu yapıştırın. Makro dosya işlemi yaptığı için bu sayfada çalıştırılmaz.
VBA
20 satır
Option Explicit
Sub TarihliYedekAl()
Dim klasor As String
Dim uzanti As String
Dim yedekAdi As String
klasor = ThisWorkbook.Path
If klasor = "" Then
MsgBox "Kitap henüz kaydedilmemiş, yedek alınamaz."
Exit Sub
End If
' Uzantıyı kaynak kitaptan alıyoruz (xlsx, xlsm vb.)
uzanti = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, "."))
yedekAdi = klasor & "\Satis_" & Format(Date, "yyyymmdd") & uzanti
' Açık kitap değişmez, yalnızca kopya yazılır
ThisWorkbook.SaveCopyAs Filename:=yedekAdi
End Sub
SaveCopyAs
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat |
| 2 | Kalem | 120 | Kalem_120_Yedek.xlsx |
| 3 | Defter | 80 | Defter_80_Yedek.xlsx |
| 4 | Dosya | 45 | Dosya_45_Yedek.xlsx |
| 5 | __Yedek.xlsx | ||
| 6 | __Yedek.xlsx | ||
| 7 | __Yedek.xlsx |
Satış ListesiExcelDepo v1.0.0
2. Yedek klasörü ve hata denetimi
Personel kitabının kopyasını, kitabın bulunduğu klasördeki Yedek alt klasörüne saat bilgisiyle kaydetmek istiyorsunuz. Klasör yoksa oluşturulur; hata olursa kullanıcı bilgilendirilir. Kodu standart bir modüle yapıştırın. Klasör ve dosya işlemleri içerdiğinden bu örnek çalıştırılmaz.
VBA
22 satır
Option Explicit
Sub YedekKlasorunaKaydet()
Dim yedekKlasor As String
Dim uzanti As String
Dim hedef As String
If ThisWorkbook.Path = "" Then Exit Sub
On Error GoTo Hata
yedekKlasor = ThisWorkbook.Path & "\Yedek"
If Dir(yedekKlasor, vbDirectory) = "" Then MkDir yedekKlasor
uzanti = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, "."))
hedef = yedekKlasor & "\Personel_" & Format(Now, "yyyymmdd_hhmmss") & uzanti
ThisWorkbook.SaveCopyAs hedef
Exit Sub
Hata:
MsgBox "Yedek alınamadı: " & Err.Description
End Sub
SaveCopyAs
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Personel | Bölüm | Maaş |
| 2 | Ayşe Yılmaz | Muhasebe | 32.500,00 |
| 3 | Mehmet Demir | Satış | 28.750,00 |
| 4 | Zeynep Kaya | İnsan Kaynakları | 30.100,00 |
PersonelExcelDepo v1.0.0
3. Yedek dosya adlarını hazırlama
Şube ve ay bilgilerinden her şube için yedek dosya adı üretmek istiyorsunuz. Bu makro diske yazmaz, yalnızca SaveCopyAs için kullanılacak adları C sütununa üretir. Kodu standart bir modüle yapıştırın.
VBA
13 satır
Option Explicit
Sub YedekAdlariniHazirla()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets(1)
' 2. satırdan 7. satıra kadar sonlu döngü
For i = 2 To 7
ws.Cells(i, 3).Value = ws.Cells(i, 1).Value & "_" & ws.Cells(i, 2).Value & "_Yedek.xlsx"
Next i
End Sub
SaveCopyAs
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Şube | Ay | Yedek Dosya Adı |
| 2 | Ankara | Ocak | |
| 3 | İzmir | Şubat | |
| 4 | Bursa | Mart | |
| 5 | Adana | Nisan | |
| 6 | Trabzon | Mayıs | |
| 7 | Konya | Haziran |
Yedek PlanıExcelDepo v1.0.0
Kullanırken dikkat edin
- Uzantı ve biçim uyumu: SaveCopyAs dosya biçimini değiştirmez. .xlsm kitabın kopyasına .xlsx uzantısı vermek, Excel'in açamayacağı ya da uyarı verecek bir dosya üretir. Uzantıyı kaynak kitabın adından alın.
- Aynı adlı dosya: Hedefte aynı adlı bir dosya varsa yeni kopya onun yerine yazılabilir. Eski yedekleri korumak istiyorsanız ada tarih ve saat ekleyin.
- Kaynak dosyanın üzerine yazmayın: Kopyanın adı, açık kitabın kendi yoluyla aynı olamaz; bu durumda hata alırsınız. Ayrıca hedef dosya başka bir yerde açıksa kaydetme başarısız olur.
- Kaydedilmemiş kitap: Hiç kaydedilmemiş bir kitapta Path boş döner ve yol boş kalan ad geçerli klasöre yazılır. Önce yolun boş olup olmadığını denetleyin.
- Saved özelliği değişmez: Kopya aldıktan sonra açık kitap hala değişmiş sayılabilir. Kitabın kendi dosyasına kaydedildiğini varsaymayın; asıl dosya için Save yöntemini kullanın.
- İlgili konular:
- Workbook.SaveAs: Kitabı yeni adla kaydeder ve kitabı yeni dosyaya bağlar.
- Workbook.Save: Kitabı kendi dosyasına kaydeder.
- Workbook.Saved: Kitabın kaydedilmemiş değişiklik içerip içermediğini gösterir.
- Workbook_BeforeSave: Kaydetmeden önce çalışan olay.
- Application.DisplayAlerts: Uyarı iletilerini açar ya da kapatır.
- ThisWorkbook.Path: Kitabın bulunduğu klasör yolu.
- Format işlevi: Tarihi dosya adına uygun metne çevirir.
- Dir ve MkDir: Klasör denetimi ve oluşturma.