Genel Bakış
Delete (Sil), Excel VBA'da bir hücre aralığını, çalışma sayfasını, şekli, adı ve benzeri nesneleri nesnenin kendisiyle birlikte kaldıran yöntemdir. Hücre aralıklarında komşu hücreleri kaydırarak boşluğu kapatır; içeriği silip hücreyi yerinde bırakan Clear ve ClearContents yöntemlerinden bu yönüyle ayrılır. Silme işlemi geri alınamadığı için kodda dikkatli kullanılmalıdır.
Makro çalıştıktan sonra Durum sütununda İptal yazan üç satır tamamen silinir; altındaki satırlar yukarı kayar ve listede boş satır kalmaz. Döngüyü baştan sona yazarsanız her silmeden sonra sıradaki satır bir yukarı kayacağı için bazı iptal satırları atlanır.
C3 ve C4 hücreleri silindiğinde aynı satırlardaki Maaş değerleri C sütununa kayar ve D3:D4 boşalır. Diğer satırlarda Maaş D sütununda kaldığı için tablo hizasız görünür. Bu yüzden tabloların bir parçasını Shift ile silerken yalnızca bütün satırı ya da bütün sütunu silmeyi tercih edin; hücre aralığında silme yaparken kaymanın komşu verileri nasıl etkileyeceğini önceden düşünün.
Makro, Gecici adlı sayfayı ekleyip siler. Silme sonrasında çalışma kitabındaki sayfa sayısı 3 olarak yazılır; Gecici sayfasının hala var olup olmadığını gösteren kontrol sonucu ise YANLIŞ değeridir. DisplayAlerts özelliğini silme işleminden hemen sonra True yaparak Excel'in sonraki uyarılarının kapalı kalmasını önlemiş olursunuz.
Söz dizimi
Delete yöntemi, üzerinde çağrıldığı nesneye göre iki biçimde kullanılır. Hücre aralıkları için Shift bağımsız değişkeni vardır, diğer nesnelerde ise parametre almaz:
VBA
2 satır
ifade.Delete(Shift) ' Range nesnesi için
ifade.Delete ' Worksheet, Shape, Comment, Name vb. için
- ifade: Silinecek nesne; örneğin Range, Worksheet, Shape, ChartObject, Comment, Name, ListRow, ListColumn. Zorunludur.
- Shift: Yalnızca Range.Delete için geçerlidir; silinen hücrelerin yerini dolduracak kaydırma yönünü belirler. İsteğe bağlıdır. Verilmezse Excel şekle göre kendisi karar verir: aralık yatay ise sola, değilse yukarı kaydırır. Tam satır ya da tam sütun silinirken kullanılmaz.
Shift sabitleri ve kullanım alanları
Shift için kullanabileceğiniz XlDeleteShiftDirection sabitleri şunlardır:- xlShiftUp: Silinen hücrelerin altındaki hücreler yukarı kayar (sayısal değeri -4162).
- xlShiftToLeft: Silinen hücrelerin sağındaki hücreler sola kayar (sayısal değeri -4159).
- Range: Hücre, satır ya da sütun silme. Tam satır için Rows(5).Delete ya da Range("A5").EntireRow.Delete yazılır.
- Worksheet: Çalışma sayfasını siler. Excel varsayılan olarak onay sorar.
- Shape, ChartObject, Comment, Name, ListRow, ListColumn: İlgili nesneyi kaldırır.
Delete, Clear ve ClearContents farkı
Üç yöntem de hücreleri temizler gibi görünse de sonuçları farklıdır:- Delete: Hücreyi yapısından çıkarır; sağdaki ya da alttaki hücreler kayarak boşluğu doldurur. Formüllerdeki başvurular etkilenir, silinen hücreye başvuranlar #BAŞV! (#REF!) hatası verir.
- ClearContents: Yalnızca değeri ve formülü siler; biçim ve hücre konumu aynı kalır.
- Clear: Değer, biçim, not ve diğer her şeyi temizler, ama hücreleri kaydırmaz.
1. İptal edilen sipariş satırlarını silme
Sipariş listesinde Durum sütunu İptal olan satırları silmek istiyorsunuz. Aşağıdaki kodu standart bir modüle yapıştırın. Döngü, satır silindiğinde numaraların kaymaması için son satırdan başa doğru çalışır.
VBA
18 satır
Option Explicit
Sub IptalSatirlariniSil()
Dim ws As Worksheet
Dim i As Long
Dim son As Long
Set ws = ActiveSheet
' A sütunundaki son dolu satırı bulur
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' Sondan başa doğru gidilir; böylece silinen satır sıradakini etkilemez
For i = son To 2 Step -1
If ws.Cells(i, 5).Value = "İptal" Then
ws.Rows(i).Delete
End If
Next i
End Sub
Delete
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Sipariş No | Ürün | Şehir | Tutar | Durum |
| 2 | S-101 | Laptop | Ankara | 24.500,00 | Tamam |
| 3 | S-103 | Monitör | Bursa | 6.800,00 | Tamam |
| 4 | S-105 | Tablet | Konya | 9.300,00 | Beklemede |
| 5 | S-107 | Telefon | Trabzon | 15.800,00 | Tamam |
Sipariş ListesiExcelDepo v1.0.0
2. Hücre aralığını Shift ile silme
Personel tablosunda Not sütununun yalnızca iki hücresini (C3:C4) silip sağdaki Maaş değerlerinin sola kaymasını istiyorsunuz. Kodu standart bir modüle yapıştırın. Sonuçta tablonun hizası bozulur; bu, kısmi aralık silmenin etkisini gösterir.
VBA
9 satır
Option Explicit
Sub NotHucreleriniSil()
Dim ws As Worksheet
Set ws = ActiveSheet
' C3:C4 silinir, sağdaki hücreler sola kayar
ws.Range("C3:C4").Delete Shift:=xlToLeft
End Sub
Delete
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Personel | Bölüm | Not | Maaş |
| 2 | Ayşe Yılmaz | Muhasebe | Yeni | 32.000,00 |
| 3 | Mehmet Demir | Satış | 28.500,00 | |
| 4 | Fatma Kaya | Üretim | 26.750,00 | |
| 5 | Ali Çelik | Lojistik | Yeni | 30.200,00 |
Personel NotlarıExcelDepo v1.0.0
3. Çalışma sayfasını onaysız silme
Makro geçici bir sayfa ekler, sonra bu sayfayı siler. Excel'in onay penceresini kapatmak için DisplayAlerts özelliği geçici olarak False yapılır ve hemen True değerine döndürülür. Kodu standart bir modüle yapıştırın; sonuçlar örnek sayfanın B sütununa yazılır.
VBA
29 satır
Option Explicit
Sub GeciciSayfaSil()
Dim ws As Worksheet
Dim gecici As Worksheet
' Sonuçların yazılacağı sayfa, Add işleminden önce saklanır
Set ws = ActiveSheet
Set gecici = ThisWorkbook.Worksheets.Add
gecici.Name = "Gecici"
' Onay penceresini kapat, sayfayı sil, uyarıları tekrar aç
Application.DisplayAlerts = False
gecici.Delete
Application.DisplayAlerts = True
ws.Activate
ws.Range("B2").Value = ThisWorkbook.Worksheets.Count
ws.Range("B3").Value = SayfaVarMi("Gecici")
End Sub
Function SayfaVarMi(ad As String) As Boolean
Dim s As Worksheet
SayfaVarMi = False
For Each s In ThisWorkbook.Worksheets
If s.Name = ad Then SayfaVarMi = True
Next s
End Function
Delete
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Kontrol | Sonuç |
| 2 | Silme sonrası sayfa sayısı | 3 |
| 3 | Gecici sayfa duruyor mu | YANLIŞ |
Sayfa KontrolExcelDepo v1.0.0
Kullanırken dikkat edin
- Silme geri alınamaz: VBA ile yapılan silme işlemleri Ctrl+Z ile geri alınamaz; makro çalışınca Geri Al yığını da temizlenir. Önemli dosyalarda makroyu çalıştırmadan önce çalışma kitabının yedeğini alın.
- Döngüde silerken sondan başa gidin: Satır ya da sütun silen döngülerde sayacı Step -1 ile sondan başa doğru ilerletin. Baştan sona giderseniz silinen satırın yerine gelen satır atlanır.
- DisplayAlerts ayarını geri açın: Sayfa silerken onay penceresini kapatmak için Application.DisplayAlerts = False yazılır. İşlem bitince mutlaka True yapın. Aksi durumda sonraki işlemlerde Excel uyarı vermez ve beklenmedik silmeler sessizce gerçekleşebilir. Kodda hata oluşma ihtimali varsa True ataması hata yakalama bölümünde de bulunmalıdır.
- Silinemeyen durumlar: Çalışma kitabındaki son görünür sayfa silinemez; en az bir görünür sayfa kalmalıdır. Korumalı sayfalarda ve korumalı hücre aralıklarında silme hata verir. Çalışma kitabı yapısı korumalıysa sayfa silinemez. Tabloların (ListObject) tam satırını silerken tablo dışındaki hücrelerin de etkilendiğini unutmayın.
- Formüllere etkisi: Silinen hücrelere başvuran formüller #BAŞV! (#REF!) hatası verir. Hücreyi kaydırmadan yalnızca değerini boşaltmak istiyorsanız ClearContents yöntemini kullanın.
- İlgili konular:
- Clear: Hücredeki her şeyi kaydırmadan temizler.
- ClearContents: Yalnızca değerleri ve formülleri temizler.
- Insert: Hücre, satır ya da sütun ekleyen karşıt yöntem.
- EntireRow ve EntireColumn: Tam satır ve sütun silmek için kullanılan özellikler.
- Application.DisplayAlerts: Excel uyarılarını açıp kapatan özellik.
- Worksheets.Add: Yeni çalışma sayfası ekleyen yöntem.
- SpecialCells: Boş ya da hatalı hücreleri bulup toplu silmeye yarar.
- EĞERSAY (COUNTIF) ve SATIRSAY (ROWS): Silme öncesi kontrol amacıyla kullanılabilecek işlevler.