Genel Bakış
Workbook.Save (Workbook.Save method), bir çalışma kitabında yapılan değişiklikleri kitabın bağlı olduğu dosyaya kaydeden yöntemdir. Kullanıcı Dosya menüsünden Kaydet'i seçmiş gibi çalışır; adı, konumu ve dosya biçimi değişmez. Makro bir işi bitirdikten sonra sonucu kalıcı yapmak için kullanılır.
Save çağrısı, kitabın BeforeSave olayını tetikler. Bu olayda Cancel True yapılırsa kayıt iptal edilir. Kaydetme sırasında kullanıcı onayı çıkmaması için çoğu durumda ek bir ayar gerekmez; yalnızca dosya biçimi uyarıları Application.DisplayAlerts ile ilgilidir.
Makro D sütununa tutarları yazar; örneğin ilk satırın tutarı 1.500,00 olur. Hücrelere değer yazıldığı için kitapta kaydedilmemiş değişiklik vardır ve E2 hücresinde "Kaydedilmeli" ifadesi görünür. Gerçek bir uygulamada bu denetimin ardından If Not ThisWorkbook.Saved Then ThisWorkbook.Save satırını kullanabilirsiniz.
Makro çalıştırıldığında kitap salt okunursa ya da hiç kaydedilmemişse ilgili uyarı görünür ve işlem durur. Aksi halde kitap bulunduğu dosyaya kaydedilir ve bir onay iletisi gösterilir. Kaydetme sırasında bir sorun çıkarsa hata iletisi, Hata etiketindeki kod sayesinde kullanıcıya bildirilir.
Bu olay yordamı kitap her kapatıldığında çalışır. Kitapta kaydedilmemiş değişiklik varsa Save ile kaydedilir ve Excel kapanış sırasında ayrıca soru sormaz. Değişiklikleri atmak isteyen kullanıcılar için bu davranış sakıncalı olabilir; bu nedenle yalnızca otomatik kayıt istenen kitaplarda kullanın.
Söz dizimi
Save yöntemi herhangi bir Workbook nesnesine uygulanır ve parametre almaz:
VBA
5 satır
ifade.Save
ThisWorkbook.Save
ActiveWorkbook.Save
Workbooks("Rapor.xlsx").Save
- ifade: Bir Workbook nesnesini veren ifadedir. Zorunludur. ThisWorkbook kodun bulunduğu kitabı, ActiveWorkbook etkin kitabı, Workbooks(...) ise adı ya da sırası verilen kitabı belirtir.
- Parametre: Yöntemin parametresi yoktur. Adı ya da biçimi değiştirmek için SaveAs kullanılır.
- Dönüş değeri: Yöntem değer döndürmez; kaydetme başarısız olursa çalışma zamanı hatası oluşur.
Save, SaveAs ve SaveCopyAs farkı
Save kitabı yalnızca bulunduğu dosyaya, aynı adla ve aynı biçimle yazar. SaveAs kitabı yeni bir ad, konum ya da biçimle kaydeder ve kitap artık bu yeni dosyaya bağlanır. SaveCopyAs ise açık kitabı etkilemeden bir kopya üretir.- Hiç kaydedilmemiş kitap: Yeni açılmış ve henüz bir dosyaya bağlanmamış kitapta Save kullanılırsa kitap varsayılan klasöre geçici adıyla (Kitap1.xlsx gibi) kaydedilir. Bunu istemiyorsanız önce kitabın Path özelliğinin boş olup olmadığını denetleyin.
- Salt okunur kitap: ReadOnly özelliği True olan kitapta Save hata verir; bu durumda SaveAs ile başka bir ada kaydetmek gerekir.
- Dosya biçimi: Makro içeren bir kitap .xlsm olarak açıldıysa Save onu aynı biçimde kaydeder. Makrosuz .xlsx dosyasında makro kodu kalıcı olmaz.
Saved özelliği ve olaylarla birlikte kullanım
Kitabın Saved özelliği, son kayıttan beri değişiklik yapılıp yapılmadığını bildirir. Hücreye değer yazmak bu özelliği False yapar; Save çalıştığında True olur. Gereksiz kayıtları önlemek için şu kalıp yaygındır:If Not ThisWorkbook.Saved Then ThisWorkbook.Save
1. Kaydetmeden önce değişiklik durumunu denetleme
Aşağıdaki makro, her satırın tutarını hesaplar ve Saved özelliğine bakarak kitabın kaydedilmesi gerekip gerekmediğini E2 hücresine yazar. Kodu standart bir modüle yapıştırın. Bu örnekte kaydetme yapılmaz; yalnızca Save çağrısından önce kullanılan denetim gösterilir.
VBA
20 satır
Option Explicit
Sub TutarlariHesapla()
Dim ws As Worksheet
Dim i As Long
Set ws = ActiveSheet
' Her satırda adet ile birim fiyatı çarp
For i = 2 To 6
ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value
Next i
' Saved özelliği, son kayıttan beri değişiklik olup olmadığını bildirir
If ThisWorkbook.Saved Then
ws.Range("E2").Value = "Güncel"
Else
ws.Range("E2").Value = "Kaydedilmeli"
End If
End Sub
Workbook.Save
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar | Durum |
| 2 | Kalem | 120 | 12,50 | 1.500,00 | Kaydedilmeli |
| 3 | Defter | 45 | 38,00 | 1.710,00 | |
| 4 | Silgi | 300 | 4,75 | 1.425,00 | |
| 5 | Dosya | 80 | 22,90 | 1.832,00 | |
| 6 | Kağıt | 25 | 145,00 | 3.625,00 |
SatışlarExcelDepo v1.0.0
2. Güvenli kaydetme yordamı
Bu örnek, kaydetmeden önce kitabın salt okunur olup olmadığını ve bir dosyaya bağlı olup olmadığını denetler, olası hataları da yakalar. Kodu standart bir modüle yapıştırın. Kaydetme ve iletişim kutusu içerdiği için örnek çalıştırılmaz; Sub'ı Alt+F8 ile kendiniz çalıştırabilirsiniz.
VBA
23 satır
Option Explicit
Sub GuvenliKaydet()
' Salt okunur kitapta Save hata verir
If ThisWorkbook.ReadOnly Then
MsgBox "Kitap salt okunur, kaydedilemez.", vbExclamation
Exit Sub
End If
' Path boşsa kitap henüz bir dosyaya bağlı değildir
If ThisWorkbook.Path = "" Then
MsgBox "Kitap daha önce kaydedilmemiş. Önce SaveAs kullanın.", vbInformation
Exit Sub
End If
On Error GoTo Hata
ThisWorkbook.Save
MsgBox "Kitap kaydedildi.", vbInformation
Exit Sub
Hata:
MsgBox "Kaydetme başarısız: " & Err.Description, vbCritical
End Sub
Workbook.Save
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Ay | Satış |
| 2 | İstanbul | Ocak | 125.000,00 |
| 3 | Ankara | Ocak | 84.000,00 |
| 4 | İzmir | Şubat | 67.500,00 |
RaporExcelDepo v1.0.0
3. Kitap kapanırken otomatik kaydetme
Bu örnek, kitap kapatılırken kaydedilmemiş değişiklik varsa kullanıcıya sormadan kaydeder. Kodu ThisWorkbook kod modülüne yapıştırın (Visual Basic Düzenleyicisi'nde Project penceresinde ThisWorkbook'a çift tıklayın). Kapatma ve kaydetme içerdiği için örnek çalıştırılmaz.
VBA
9 satır
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Kaydedilmemiş değişiklik varsa kitabı kaydet,
' böylece kapatırken "Kaydedilsin mi?" sorusu çıkmaz
If Not Me.Saved Then
Me.Save
End If
End Sub
Workbook.Save
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Personel | Departman | Şehir |
| 2 | Ayşe Yılmaz | Muhasebe | Ankara |
| 3 | Mehmet Demir | Satış | İzmir |
| 4 | Zeynep Kaya | İnsan Kaynakları | Bursa |
PersonelExcelDepo v1.0.0
Kullanırken dikkat edin
- Geri dönüş yoktur: Save mevcut dosyanın üzerine yazar ve Geri Al ile eski haline döndürülemez. Önemli dosyalarda önce SaveCopyAs ile yedek almak iyi bir yöntemdir.
- Yeni kitapta dikkatli olun: Hiç kaydedilmemiş bir kitapta Save kullanmak, kitabı beklemediğiniz bir klasöre ve adla kaydedebilir. Önce Path özelliğini denetleyin ya da SaveAs kullanın.
- Dosya biçimi uyarısı: Makro içeren bir kitabı .xlsx olarak kaydederseniz kodlar kaybolur. Makro barındıran kitapları .xlsm ya da .xlsb biçiminde tutun.
- Salt okunur ve kilitli dosyalar: Dosya salt okunur açıldıysa, başka bir kullanıcı tarafından kilitlenmişse veya diskte yazma izni yoksa Save hata verir. Kritik yordamlarda On Error ile hata yakalamayı unutmayın.
- Kayıt sırasında olaylar: Save çağrısı kitabın BeforeSave olayını tetikler. Bu olayda başka bir Save çağırırsanız sonsuz döngüye girebilirsiniz; gerekirse önce Application.EnableEvents özelliğini False yapın ve işlem sonunda True'ya döndürün.
- İlgili konular:
- Workbook.SaveAs: Kitabı yeni bir ad ya da biçimle kaydeder.
- Workbook.SaveCopyAs: Açık kitabı değiştirmeden kopyasını kaydeder.
- Workbook.Saved: Kaydedilmemiş değişiklik olup olmadığını bildirir.
- Workbook.Path ve Workbook.FullName: Kitabın klasörünü ve tam yolunu verir.
- Workbook.ReadOnly: Kitabın salt okunur açılıp açılmadığını bildirir.
- Workbook_BeforeSave olayı: Kayıttan hemen önce çalışır.
- Workbook_BeforeClose olayı: Kitap kapanmadan önce çalışır.
- Application.DisplayAlerts: Excel uyarı iletilerini açar ya da kapatır.
- Workbooks.Close ve Workbook.Close: Kitabı kapatır; SaveChanges parametresi ile kayıt davranışını belirler.