Özellik ikonu

Worksheet_SelectionChange

İndirme izni yok

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.

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.
Yordam yalnızca bulunduğu sayfa için geçerlidir. Tüm sayfalar için tek yerden izlemek isterseniz ThisWorkbook modülündeki Workbook_SheetSelectionChange olayını kullanın.

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.
Başlıktaki parametre adını değiştirebilirsiniz, ancak türü Range kalmalıdır. Sayfanın kendisine kod içinden Me anahtar sözcüğüyle başvurabilirsiniz.

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.
Yordamın her seçimde çalıştığını unutmayın; bu nedenle gereksiz durumlarda en başta Exit Sub ile çıkmak hem hızı hem kararlılığı artırır.

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.
ABCD
1ÜrünStokSeçili AdresHücre Sayısı
2Klavye45B2:B43
3Fare60
4Monitör12
5Yazıcı8
6Kulaklık33
Adres TakibiExcelDepo v1.0.0
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.

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.
ABCD
1ÜrünStokDepoSeçim Notu
2Klavye45İstanbulMonitör için stok kritik
3Fare60Ankara
4Monitör12İzmir
5Yazıcı8Bursa
6Kulaklık33Adana
7Webcam27Konya
Stok UyarıExcelDepo v1.0.0
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.

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.
ABCDE
1AySatışGiderNetSeçim Toplamı
2Ocak12.5008.2004.30056.100
3Şubat14.2009.1005.100
4Mart13.8008.7005.100
5Nisan15.60010.3005.300
6Mayıs16.90010.8006.100
7Haziran18.25011.9006.350
Satır ÖzetiExcelDepo v1.0.0
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.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
14
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst