Genel Bakış
Worksheet_SelectionChange (Worksheet.SelectionChange event), bir çalışma sayfasında seçili hücre ya da aralık her değiştiğinde Excel'in kendiliğinden çalıştırdığı olay yordamıdır. Seçilen aralık, Target parametresiyle yordama aktarılır. Seçime göre bilgi göstermek, uyarı yazmak ya da toplam hesaplamak gibi etkileşimli sayfa tasarımlarında kullanılır.
Yordamda sık kullanılan öğeler şunlardır:
B2:B4 aralığı seçilince olay çalıştı. C2 hücresine seçimin adresi (B2:B4), D2 hücresine ise seçilen hücre sayısı (3) yazıldı. Başka bir aralık seçtiğinizde bu iki hücre yeniden güncellenir.
B4 hücresi seçilince olay, bu hücrenin stok sütununda olduğunu doğruladı ve stok değerini 20 ile karşılaştırdı. D2 hücresine yazılan not: Monitör için stok kritik. Stok sütunu dışında bir hücre seçildiğinde D2 temizlenir, çünkü yordam en başta notu siler.
B2:B5 aralığı seçildiğinde olay, seçimin B2:D7 bölgesiyle kesişen kısmını belirledi ve toplamı E2 hücresine yazdı. Seçili dört ayın satış toplamı E2 hücresinde: 56.100. Net sütunundaki formül sonucu, örneğin D2 için 4.300, olaydan bağımsız olarak Excel tarafından hesaplanır.
Olay yordamı nereye yazılır
Bu olay yordamı standart modüle değil, ilgili çalışma sayfasının kod modülüne yazılır. Standart modüle yazılırsa Excel onu olay olarak tanımaz ve yordam hiçbir zaman kendiliğinden çalışmaz.- Sayfa sekmesinden: Sayfa sekmesine sağ tıklayıp Kodu Görüntüle (View Code) komutunu seçin.
- VBA düzenleyicisinden: Alt+F11 ile düzenleyiciyi açın, Proje Gezgini'nde (Project Explorer) ilgili sayfanın adına çift tıklayın.
- Yordamı seçerek eklemek: Kod penceresinin sol üstündeki listeden Worksheet, sağ üstündeki listeden SelectionChange öğesini seçin. Excel yordamın ilk ve son satırını sizin için yazar.
Söz dizimi
Olayın yordam başlığı sabittir:
VBA
3 satır
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Seçim değişince çalışacak kodlar
End Sub
- Target: Yeni seçilen hücre ya da hücre aralığını temsil eden Range nesnesi; zorunludur ve Excel tarafından otomatik verilir. Tek hücre, çok hücreli aralık, tüm satır ya da tüm sütun olabilir.
Ne zaman tetiklenir
Olay, seçim fare ya da klavye ile değiştiğinde, ayrıca kod içinde Select veya Activate yöntemleriyle seçim değiştirildiğinde çalışır. Sayfa değiştirildiğinde ve Application.EnableEvents özelliği True olduğu sürece geçerlidir. Hücrenin içeriğini değiştiren bir işlem tek başına bu olayı değil, Worksheet_Change olayını tetikler.Yordamda sık kullanılan öğeler şunlardır:
- Target.Address: Seçimin adresini verir.
- Target.Cells.Count / Target.CountLarge: Seçilen hücre sayısını verir. Çok büyük seçimlerde CountLarge güvenlidir.
- Target.Row ve Target.Column: Seçimin ilk satır ve sütun numarasını verir.
- Intersect(Target, Range(...)): Seçimin belirli bir bölgeyle kesişip kesişmediğini denetler; kesişmiyorsa Nothing döner.
1. Seçimin adresini ve hücre sayısını yazma
Örnek sayfanın kod modülüne (sayfa sekmesi > Kodu Görüntüle) aşağıdaki olay yordamını yapıştırın. Seçim her değiştiğinde seçimin adresi C2 hücresine, hücre sayısı D2 hücresine yazılır. Aşağıdaki kodu sayfa modülüne yazdıktan sonra seçim değiştiğinde sonuç kendiliğinden oluşur.
VBA
8 satır
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Seçimin adresini C2 hücresine yazar
Me.Range("C2").Value = Target.Address(False, False)
' Seçilen hücre sayısını D2 hücresine yazar
Me.Range("D2").Value = Target.CountLarge
End Sub
Worksheet_SelectionChange
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Stok | Seçili Adres | Hücre Sayısı |
| 2 | Klavye | 45 | B2:B4 | 3 |
| 3 | Fare | 60 | ||
| 4 | Monitör | 12 | ||
| 5 | Yazıcı | 8 | ||
| 6 | Kulaklık | 33 |
Adres TakibiExcelDepo v1.0.0
2. Yalnızca belirli sütunda uyarı verme
Örnek sayfanın kod modülüne aşağıdaki kodu yapıştırın. Yordam yalnızca B2:B7 stok sütunundaki tek bir hücre seçildiğinde çalışır; stok 20'nin altındaysa D2 hücresine kritik uyarısı, değilse yeterli bilgisi yazar. Intersect ile bölge denetimi yapıldığı için sayfanın diğer alanlarında seçim yapmak bu kodu etkilemez.
VBA
25 satır
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim notHucre As Range
Dim urun As String
Set notHucre = Me.Range("D2")
notHucre.ClearContents
' Birden fazla hücre seçildiyse işlem yapma
If Target.CountLarge > 1 Then Exit Sub
' Seçim stok sütununun dışındaysa çık
If Intersect(Target, Me.Range("B2:B7")) Is Nothing Then Exit Sub
' Boş ya da sayısal olmayan hücreleri atla
If IsEmpty(Target.Value) Then Exit Sub
If Not IsNumeric(Target.Value) Then Exit Sub
urun = Me.Cells(Target.Row, 1).Text
If Target.Value < 20 Then
notHucre.Value = urun & " için stok kritik"
Else
notHucre.Value = urun & " için stok yeterli"
End If
End Sub
Worksheet_SelectionChange
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Stok | Depo | Seçim Notu |
| 2 | Klavye | 45 | İstanbul | Monitör için stok kritik |
| 3 | Fare | 60 | Ankara | |
| 4 | Monitör | 12 | İzmir | |
| 5 | Yazıcı | 8 | Bursa | |
| 6 | Kulaklık | 33 | Adana | |
| 7 | Webcam | 27 | Konya |
Stok UyarıExcelDepo v1.0.0
3. Seçilen aralığın toplamını gösterme
Örnek sayfanın kod modülüne aşağıdaki kodu yapıştırın. B2:D7 bölgesinde bir aralık seçildiğinde, seçilen sayıların toplamı E2 hücresine yazılır (Excel'in durum çubuğundaki toplama benzer). Çok büyük seçimlerde (örneğin tüm sütun) gereksiz hesaplamayı önlemek için hücre sayısı denetlenir. D sütunundaki Net değerleri formüldür.
VBA
15 satır
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim bolge As Range
' Çok büyük seçimlerde (ör. tüm sütun) hiçbir şey yapma
If Target.CountLarge > 10000 Then Exit Sub
' Seçimin B2:D7 ile kesişen kısmını al
Set bolge = Intersect(Target, Me.Range("B2:D7"))
If bolge Is Nothing Then Exit Sub
' Kesişen hücrelerin toplamını E2'ye yaz
Me.Range("E2").Value = Application.WorksheetFunction.Sum(bolge)
End Sub
Worksheet_SelectionChange
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ay | Satış | Gider | Net | Seçim Toplamı |
| 2 | Ocak | 12.500 | 8.200 | 4.300 | 56.100 |
| 3 | Şubat | 14.200 | 9.100 | 5.100 | |
| 4 | Mart | 13.800 | 8.700 | 5.100 | |
| 5 | Nisan | 15.600 | 10.300 | 5.300 | |
| 6 | Mayıs | 16.900 | 10.800 | 6.100 | |
| 7 | Haziran | 18.250 | 11.900 | 6.350 |
Satır ÖzetiExcelDepo v1.0.0
Kullanırken dikkat edin
- Yordam yanlış yere yazılırsa çalışmaz: Worksheet_SelectionChange yordamı yalnızca ilgili sayfanın kod modülünde çalışır. Standart modüle ya da başka bir sayfanın modülüne yazılan yordam, adı aynı olsa bile olay olarak tetiklenmez.
- Olay çok sık çalışır: Her seçim değişikliğinde yordam yeniden çalışır. Ağır işlemleri (döngüler, büyük aralık hesapları) bu olaya koymak sayfanın yavaşlamasına yol açar. En başta Intersect ve hücre sayısı denetimleriyle gereksiz çalışmayı engelleyin.
- Tek hücre varsayımı yapmayın: Target birden fazla hücre içerebilir. Çok hücreli bir seçimde Target.Value kullanmak tür uyuşmazlığı hatası verir. Önce Target.CountLarge ile hücre sayısını denetleyin ya da yalnızca Target.Cells(1) hücresiyle çalışın.
- Seçimi kod içinde değiştirirken dikkat: Yordam içinde Select kullanırsanız olay yeniden tetiklenir ve döngüye girebilirsiniz. Bu durumda Application.EnableEvents = False yazıp işiniz bitince True yapın. Hata oluşursa olaylar kapalı kalabilir; bu yüzden hata yakalama bloğunda EnableEvents özelliğini mutlaka yeniden açın.
- Geri Al geçmişi temizlenir: Olay yordamı içinde hücre değerlerini ya da biçimlerini değiştirirseniz Excel'in Geri Al (Undo) geçmişi silinir. Bu davranış, kullanıcının önceki işlemlerini geri almasını engeller; gereksiz yazma işlemlerinden kaçının.
- Korumalı sayfalarda hata alabilirsiniz: Sayfa korumalıysa yordamın yazmaya çalıştığı hücreler kilitliyse çalışma zamanı hatası oluşur. Yazılacak hücreleri kilitsiz yapın ya da sayfayı UserInterfaceOnly:=True seçeneğiyle koruyun.
- İlgili konular:
- Worksheet_Change: Hücre içeriği değiştiğinde çalışan sayfa olayı.
- Workbook_SheetSelectionChange: Tüm sayfalar için seçim değişikliğini izleyen çalışma kitabı olayı.
- Worksheet_Activate: Sayfa etkinleştirildiğinde çalışan olay.
- Application.EnableEvents: Olayları açıp kapatan özellik.
- Intersect: İki aralığın kesişimini veren yöntem.
- Range.CountLarge: Büyük aralıklarda hücre sayısını veren özellik.
- TOPLA: Seçilen aralığın toplamını bulmak için kullanılan çalışma sayfası işlevi.