Genel Bakış
Workbook_SheetSelectionChange (Workbook.SheetSelectionChange event), açık çalışma kitabındaki herhangi bir çalışma sayfasında seçim değiştiğinde Excel tarafından otomatik tetiklenen kitap düzeyi olaydır. Her sayfaya ayrı ayrı kod yazmak yerine, tüm sayfalardaki hücre seçimlerini tek bir yordamdan izlemenizi sağlar. Seçilen hücreye göre bilgi göstermek, vurgulama yapmak ya da seçimi yönlendirmek için kullanılır.
Makro B3:C5 aralığını seçtiği anda olay çalışır. D2 hücresine seçilen adres (B3:C5), E2 hücresine seçimdeki hücre sayısı (6) yazılır. Sh.Name denetimi sayesinde kitaptaki diğer sayfalarda seçim yapmanız bu hücreleri etkilemez.
Makro C5 hücresini seçer. Bu hücre 5. satırda olduğundan olay E5 hücresine işaret metnini yazar: Seçili: Ali Çelik. Başka bir satırdaki hücreyi seçtiğinizde E2:E9 aralığı önce temizlenir, işaret yeni satıra taşınır. Intersect denetimi, veri alanının dışındaki seçimlerde kodun çalışmasını engeller.
Makro A4 hücresini seçince olay çalışır, seçimi B4 hücresine kaydırır ve D2 hücresine yönlendirmenin kaydını yazar: A4 -> B4. Select satırından önce EnableEvents kapatıldığı için yeni seçim olayı yeniden tetiklemez. Cikis etiketi sayesinde bir hata olsa bile EnableEvents tekrar True yapılır.
Olay yordamı nereye yazılır
Bu olay yordamı yalnızca ThisWorkbook modülünde çalışır. Standart modüle ya da sayfa modülüne yazarsanız Excel onu olay olarak tanımaz.- Adım 1: Alt+F11 tuşlarıyla Visual Basic Düzenleyicisi'ni açın.
- Adım 2: Proje Gezgini'nde (Project Explorer) ilgili kitabın altındaki ThisWorkbook öğesine çift tıklayın.
- Adım 3: Kod penceresinin üstündeki sol açılır listeden Workbook, sağ listeden SheetSelectionChange seçin. Excel yordamın ilk ve son satırını kendisi yazar.
Söz dizimi
Olay yordamının bildirimi şöyledir:
VBA
3 satır
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' Kodunuz buraya
End Sub
- Sh: Seçimin değiştiği sayfayı temsil eden nesnedir (Object); zorunludur. Sayfa adına Sh.Name ile, hücrelerine Sh.Range ve Sh.Cells ile ulaşırsınız.
- Target: Yeni seçilen hücre ya da aralıktır (Range); zorunludur. Tek hücre seçildiyse tek hücreli, bloğu seçildiyse çok hücreli bir aralık gelir.
Ne zaman tetiklenir, nelere dikkat edilir
Olay, kullanıcı fare ya da klavyeyle seçimi değiştirdiğinde, ayrıca bir makro Select ya da Activate yöntemiyle farklı bir hücre seçtiğinde çalışır. Grafik sayfalarında (chart sheet) tetiklenmez; yalnızca çalışma sayfalarında çalışır.- Sonsuz döngü riski: Yordamın içinde Select ile yeni bir seçim yaparsanız olay yeniden tetiklenir. Bunu önlemek için seçimi değiştirmeden önce Application.EnableEvents = False yazın, sonra mutlaka True yapın.
- Değer yazmak seçimi değiştirmez: Hücrelere Value yazmak bu olayı tetiklemez; ancak Worksheet_Change ve Workbook_SheetChange olaylarını tetikleyebilir.
- Sık çalışır: Her ok tuşu basışında olay çalıştığı için kodunuzu kısa ve hızlı tutun; ilk satırlarda Sh.Name ve Target ile gereksiz çalışmayı erkenden bitirin.
1. Seçilen adresi ve hücre sayısını yazdırma
Senaryo: Stok tablosunda seçtiğiniz hücre ya da aralığın adresini ve kaç hücre içerdiğini D2 ve E2 hücrelerinde görmek istiyorsunuz. Aşağıdaki kodu Visual Basic Düzenleyicisi'nde ThisWorkbook modülüne yapıştırın.
VBA
12 satır
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' Yalnızca Stok Takip sayfasında çalış
If Sh.Name <> "Stok Takip" Then Exit Sub
' Seçilen adresi $ işaretleri olmadan yaz
Sh.Range("D2").Value = Target.Address(False, False)
' Seçilen hücre sayısını yaz
Sh.Range("E2").Value = Target.Cells.Count
End Sub
Workbook_SheetSelectionChange
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Seçilen Adres | Hücre Sayısı |
| 2 | Defter | 120 | 24,50 | B3:C5 | 6 |
| 3 | Kalem | 340 | 6,75 | ||
| 4 | Dosya | 85 | 12,90 | ||
| 5 | Zımba | 60 | 48,00 | ||
| 6 | Silgi | 210 | 3,25 |
Stok TakipExcelDepo v1.0.0
2. Seçilen personelin satırını işaretleme
Senaryo: Personel listesinde bir hücre seçtiğinizde, o satırın E sütununda "Seçili" ifadesi ve kişinin adı görünsün; başka satıra geçince önceki işaret silinsin. Kodu ThisWorkbook modülüne yapıştırın.
VBA
18 satır
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' Yalnızca Personel Listesi sayfasında çalış
If Sh.Name <> "Personel Listesi" Then Exit Sub
' Birden çok hücre seçildiyse işlem yapma
If Target.Cells.Count > 1 Then Exit Sub
' Seçim veri alanı (A2:D9) dışındaysa işlem yapma
If Intersect(Target, Sh.Range("A2:D9")) Is Nothing Then Exit Sub
' Önceki işaretleri temizle
Sh.Range("E2:E9").ClearContents
' Seçili satırın E hücresine personel adını yaz
Sh.Cells(Target.Row, "E").Value = "Seçili: " & Sh.Cells(Target.Row, "A").Value
End Sub
Workbook_SheetSelectionChange
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ad Soyad | Departman | Şehir | Maaş | Seçim |
| 2 | Ayşe Yılmaz | Muhasebe | İstanbul | 28.500,00 | |
| 3 | Mehmet Demir | Satış | Ankara | 31.200,00 | |
| 4 | Fatma Kaya | İnsan Kaynakları | İzmir | 27.800,00 | |
| 5 | Ali Çelik | Üretim | Bursa | 26.400,00 | Seçili: Ali Çelik |
| 6 | Zeynep Arslan | Satış | Antalya | 30.100,00 | |
| 7 | Mustafa Öztürk | Lojistik | Konya | 25.900,00 | |
| 8 | Elif Şahin | Muhasebe | Eskişehir | 29.300,00 | |
| 9 | Hasan Aydın | Üretim | Gaziantep | 26.900,00 |
Personel ListesiExcelDepo v1.0.0
3. EnableEvents ile seçimi yönlendirme
Senaryo: Fiyat listesinde ürün adı sütununu (A) seçen kullanıcı otomatik olarak aynı satırdaki fiyat hücresine (B) geçsin. Yordamın içinde Select kullanıldığı için olayın yeniden tetiklenmemesi adına EnableEvents kapatılır ve hata olsa bile açılması için etiketli bir çıkış kullanılır. Kodu ThisWorkbook modülüne yapıştırın.
VBA
19 satır
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' Yalnızca Fiyat Listesi sayfasında çalış
If Sh.Name <> "Fiyat Listesi" Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
' A sütunundaki ürün adı seçilirse fiyat hücresine geç
If Target.Column = 1 And Target.Row > 1 Then
On Error GoTo Cikis
Application.EnableEvents = False
Target.Offset(0, 1).Select
Sh.Range("D2").Value = Target.Address(False, False) & " -> " & Target.Offset(0, 1).Address(False, False)
End If
Cikis:
' Olaylar her durumda yeniden açılır
Application.EnableEvents = True
End Sub
Workbook_SheetSelectionChange
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Fiyat | Stok | Yönlendirme |
| 2 | Çay | 85,50 | 140 | A4 -> B4 |
| 3 | Şeker | 42,00 | 320 | |
| 4 | Zeytinyağı | 310,00 | 75 | |
| 5 | Makarna | 28,75 | 510 | |
| 6 | Pirinç | 65,00 | 260 |
Fiyat ListesiExcelDepo v1.0.0
Kullanırken dikkat edin
- EnableEvents'i mutlaka geri açın: Application.EnableEvents özelliğini False yaptıktan sonra True'ya döndürmeyi unutursanız Excel hiçbir olayı çalıştırmaz; kod yazmış olsanız bile olaylar sessizce devre dışı kalır. Hata ihtimaline karşı On Error ile etiketli bir çıkış kullanın. Sorun yaşarsanız Doğrudan Çalışma Penceresi'ne (Immediate Window) Application.EnableEvents = True yazarak durumu düzeltebilirsiniz.
- Yanlış modüle yazmak: Yordam ThisWorkbook dışındaki bir modüle yazılırsa çalışmaz. Yordamın adı ve parametreleri de birebir doğru olmalıdır. En güvenli yol, kod penceresindeki açılır listelerden olayı seçmektir.
- Sayfa düzeyi olayla birlikte çalışır: Aynı sayfada Worksheet_SelectionChange yordamı da varsa ikisi de çalışır. Aynı hücrelere yazan iki yordam birbirini ezebilir; görevleri bölüştürmeye özen gösterin.
- Grafik sayfaları ve Geri Al: Olay yalnızca çalışma sayfalarında tetiklenir, grafik sayfalarında tetiklenmez. Ayrıca olay içinden hücreye değer yazan ya da biçimlendiren kodlar Excel'in Geri Al (Undo) yığınını temizler; bu yüzden kullanıcı yapılan işlemleri geri alamayabilir.
- Çoklu seçimi ve performansı düşünün: Target tek hücre olmayabilir; Ctrl ile yapılan çoklu seçimlerde Target.Cells.Count ve Target.Areas.Count değerlerini denetleyin. Olay her seçimde çalıştığı için ağır döngüler, büyük aralık işlemleri ve ekran yenileme gerektiren kodlardan kaçının.
- Makroların açık olması gerekir: Dosya .xlsx olarak kaydedilirse kod saklanmaz; makro içeren çalışma kitabı olarak .xlsm biçiminde kaydedin. Makrolar devre dışıysa olay hiç çalışmaz.
- İlgili konular:
- Worksheet_SelectionChange: Tek bir sayfanın seçim değişikliği olayı.
- Workbook_SheetChange: Herhangi bir sayfada hücre değeri değiştiğinde çalışan olay.
- Workbook_SheetActivate: Bir sayfa etkinleştirildiğinde çalışan olay.
- Workbook_SheetBeforeDoubleClick: Çift tıklamadan önce çalışan kitap olayı.
- Application.EnableEvents: Olayların çalışmasını açıp kapatan özellik.
- Intersect: İki aralığın kesişimini bulan yöntem.
- Range.Select ve Range.Offset: Hücre seçme ve kaydırma işlemleri.
- ThisWorkbook: Kod içeren kitabı temsil eden nesne.