Genel Bakış
Worksheet_BeforeDoubleClick (Worksheet.BeforeDoubleClick), kullanıcı bir çalışma sayfasındaki hücreye çift tıkladığında, Excel varsayılan çift tıklama eylemini yapmadan önce tetiklenen sayfa olayıdır. Hangi hücreye tıklandığını Target ile öğrenir, Cancel parametresiyle hücrenin düzenleme moduna geçmesini engelleyebilirsiniz. Çift tıklamayla durum değiştirme, tarih atama, hesap çalıştırma ya da özel pencere açma gibi kısayollar kurmak için kullanılır.
Tüm sayfalar için tek yerden yazmak isterseniz ThisWorkbook modülündeki Workbook_SheetBeforeDoubleClick olayını kullanın; bu olay ek olarak çift tıklanan sayfayı Sh parametresiyle bildirir.
Olayın çalışması için dosyanın makro destekli (.xlsm) kaydedilmiş ve makroların etkin olması gerekir. Excel'de olayı varsayılan olarak kendisi çağırdığı için yordamın adını ve parametrelerini değiştirmeyin; ad değişirse yordam olay olarak çalışmaz.
Yordam bir değer döndürmez. Hangi hücreye tıklandığını anlamak için Target.Address, Target.Row, Target.Column ya da Intersect işlevini kullanabilirsiniz.
İşinizi bitirdikten sonra Cancel = True yazmazsanız Excel hücreyi yine düzenleme moduna alır. Hücre değerini kendiniz değiştiriyorsanız çoğu zaman Cancel = True kullanmak istersiniz; aksi durumda hücrede imleç yanıp söner ve sonuç karışık görünür.
Yordam içinde hücre değeri değiştirmek Worksheet_Change olayını da tetikler. Bu olayı da kullanıyorsanız gereksiz tetiklenmeyi önlemek için Application.EnableEvents özelliğini geçici olarak False yapıp işiniz bitince mutlaka True'ya geri alın.
C2 ve C4 hücreleri boş olduğu için makro bu hücrelere sırasıyla Tamam ve Tamam yazdı. C3 hücresine çift tıklansaydı dolu olduğu için içeriği temizlenirdi. Durum sütunu dışındaki hücrelerde işlev hemen çıktığından Cancel False kalır ve Excel hücreleri her zamanki gibi düzenlemeye açar.
Kalem satırında stok asgari düzeyin üzerinde olduğu için D2 hücresine 0 yazıldı. Defter ürününde stok yetersiz olduğundan D3 hücresi 125 değerini aldı; Klasör için ise sonuç D5 hücresinde 82 olarak görünür. Çift tıklanmayan Dosya ve Zımba satırlarının D hücreleri boş kalır. Kod, Offset ile aynı satırdaki komşu hücrelere ulaşarak sütun harflerini sabit yazmadan çalışır.
B2 hücresindeki İstanbul için D2 hücresine 36.600,00, B3 hücresindeki Ankara için D3 hücresine 21.100,00 yazıldı. B5 hücresindeki İzmir için D5 hücresi 7.400,00 değerini aldı. Kodda Me, kodun bulunduğu çalışma sayfasını belirtir; böylece aralıklar etkin sayfaya göre değil her zaman bu sayfaya göre okunur.
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. Sayfa sekmesine sağ tıklayın, Kod Görüntüle (View Code) komutunu seçin ve açılan sayfa modülüne yordamı yapıştırın. Yordam yalnızca o sayfadaki çift tıklamalara yanıt verir.Tüm sayfalar için tek yerden yazmak isterseniz ThisWorkbook modülündeki Workbook_SheetBeforeDoubleClick olayını kullanın; bu olay ek olarak çift tıklanan sayfayı Sh parametresiyle bildirir.
Olayın çalışması için dosyanın makro destekli (.xlsm) kaydedilmiş ve makroların etkin olması gerekir. Excel'de olayı varsayılan olarak kendisi çağırdığı için yordamın adını ve parametrelerini değiştirmeyin; ad değişirse yordam olay olarak çalışmaz.
Söz dizimi
Olayın tam imzası şöyledir:
VBA
3 satır
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' Çift tıklamada yapılacak işlemler
End Sub
- Target: Çift tıklanan hücreyi gösteren Range nesnesi; zorunludur. Satır ya da sütun başlığına çift tıklanırsa Target birden çok hücreyi kapsayabilir, bu nedenle Target.Cells.Count ile kontrol etmeniz önerilir.
- Cancel: Boolean türünde, yordam çalışmaya başladığında False değerindedir. Yordam içinde True yaparsanız çift tıklamanın varsayılan eylemi (hücreyi düzenleme moduna almak) gerçekleşmez.
Yordam bir değer döndürmez. Hangi hücreye tıklandığını anlamak için Target.Address, Target.Row, Target.Column ya da Intersect işlevini kullanabilirsiniz.
Cancel ve Target ile çalışma
Olayda en sık yapılan iş, belirli bir sütun veya aralıktaki çift tıklamaları yakalamaktır. Bunun için önce Target istediğiniz alanın dışındaysa Exit Sub ile yordamdan çıkın; böylece diğer hücrelerdeki çift tıklamalar normal çalışır.İşinizi bitirdikten sonra Cancel = True yazmazsanız Excel hücreyi yine düzenleme moduna alır. Hücre değerini kendiniz değiştiriyorsanız çoğu zaman Cancel = True kullanmak istersiniz; aksi durumda hücrede imleç yanıp söner ve sonuç karışık görünür.
Yordam içinde hücre değeri değiştirmek Worksheet_Change olayını da tetikler. Bu olayı da kullanıyorsanız gereksiz tetiklenmeyi önlemek için Application.EnableEvents özelliğini geçici olarak False yapıp işiniz bitince mutlaka True'ya geri alın.
Sınamak için ortak yordam kullanma
Çift tıklamayı kodla taklit etmek mümkün değildir; yordamı doğrudan çağırmak da olmaz, çünkü olay yordamı Private'tır. Bu sayfadaki örneklerde mantık, sayfa modülündeki bir Public işleve konmuştur; olay yordamı bu işlevi çağırıp sonucunu Cancel'a atar. Böylece aynı kod hem gerçek çift tıklamada hem de dışarıdan bir makroyla sınanabilir. Kendi çalışmalarınızda da uzun işlemleri ayrı bir yordama taşımak kodu sadeleştirir.1. Çift tıklayarak görev durumunu değiştirme
Görev listesinde Durum sütununa (C) çift tıklandığında hücre boşsa Tamam yazılsın, doluysa temizlensin ve hücre düzenleme moduna geçmesin. Kodu Görevler sayfasının kod modülüne (sayfa sekmesi > Kod Görüntüle) yapıştırın. Örnekte makro, C2 ve C4 hücrelerine çift tıklanmış gibi çalıştırılır.
VBA
24 satır
Option Explicit
' Gerçek çift tıklamada Excel bu olayı çağırır
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = DurumDegistir(Target)
End Sub
' Olayla aynı işi yapan ortak işlev; True dönerse çift tıklama işlenmiş demektir
Public Function DurumDegistir(ByVal Target As Range) As Boolean
' Birden çok hücre ya da Durum sütunu dışı ise bir şey yapma
If Target.Cells.Count > 1 Then Exit Function
If Target.Column <> 3 Then Exit Function
If Target.Row < 2 Or Target.Row > 6 Then Exit Function
' Boşsa Tamam yaz, doluysa temizle
If Target.Value = "" Then
Target.Value = "Tamam"
Else
Target.ClearContents
End If
' Hücre düzenleme moduna geçmesin
DurumDegistir = True
End Function
Worksheet_BeforeDoubleClick
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Görev | Sorumlu | Durum |
| 2 | Rapor hazırlama | Ayşe Demir | Tamam |
| 3 | Fatura kontrolü | Mehmet Yıldız | Tamam |
| 4 | Stok sayımı | Elif Kaya | Tamam |
| 5 | Sevkiyat planı | Hasan Çelik | |
| 6 | Müşteri araması | Zeynep Arslan |
GörevlerExcelDepo v1.0.0
2. Ürün adına çift tıklayıp sipariş önerisi hesaplama
Stok tablosunda ürün adına (A sütunu) çift tıklandığında, stok asgari düzeyin altındaysa asgari stokun iki katına tamamlayacak miktar Sipariş Önerisi sütununa (D) yazılsın; stok yeterliyse 0 yazılsın. Kodu Stok Önerisi sayfasının kod modülüne yapıştırın. Makro A2, A3 ve A5 hücrelerine çift tıklanmış gibi çalışır.
VBA
28 satır
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = SiparisOner(Target)
End Sub
Public Function SiparisOner(ByVal Target As Range) As Boolean
Dim stok As Double
Dim asgari As Double
' Yalnızca A2:A6 aralığındaki tek hücre işlenir
If Target.Cells.Count > 1 Then Exit Function
If Target.Column <> 1 Then Exit Function
If Target.Row < 2 Or Target.Row > 6 Then Exit Function
' Aynı satırdaki stok (B) ve asgari stok (C) değerlerini oku
stok = Target.Offset(0, 1).Value
asgari = Target.Offset(0, 2).Value
' Sonucu aynı satırdaki D sütununa yaz
If stok < asgari Then
Target.Offset(0, 3).Value = asgari * 2 - stok
Else
Target.Offset(0, 3).Value = 0
End If
SiparisOner = True
End Function
Worksheet_BeforeDoubleClick
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Stok | Asgari Stok | Sipariş Önerisi |
| 2 | Kalem | 120 | 100 | 0 |
| 3 | Defter | 35 | 80 | 125 |
| 4 | Dosya | 60 | 60 | |
| 5 | Klasör | 18 | 50 | 82 |
| 6 | Zımba | 90 | 40 |
Stok ÖnerisiExcelDepo v1.0.0
3. Şehre çift tıklayıp şehir toplamını yazma
Satış tablosunda şehir adına (B sütunu) çift tıklandığında o şehrin toplam satışı, aynı satırın Şehir Toplamı (D) hücresine yazılsın. Toplam, SumIf çalışma sayfası işleviyle hesaplanır. Kodu Şehir Toplamı sayfasının kod modülüne yapıştırın. Makro B2, B3 ve B5 hücrelerine çift tıklanmış gibi çalışır.
VBA
25 satır
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = SehirToplami(Target)
End Sub
Public Function SehirToplami(ByVal Target As Range) As Boolean
Dim toplam As Double
' Yalnızca B2:B7 aralığındaki tek hücre işlenir
If Target.Cells.Count > 1 Then Exit Function
If Target.Column <> 2 Then Exit Function
If Target.Row < 2 Or Target.Row > 7 Then Exit Function
' Tıklanan şehrin satışlarını topla
toplam = Application.WorksheetFunction.SumIf(Me.Range("B2:B7"), Target.Value, Me.Range("C2:C7"))
' Sonucu iki sütun sağdaki hücreye yaz ve biçimlendir
With Target.Offset(0, 2)
.Value = toplam
.NumberFormat = "#,##0.00"
End With
SehirToplami = True
End Function
Worksheet_BeforeDoubleClick
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Personel | Şehir | Satış | Şehir Toplamı |
| 2 | Ali Şahin | İstanbul | 12.500,00 | 36.600,00 |
| 3 | Burcu Aydın | Ankara | 9.800,00 | 21.100,00 |
| 4 | Cem Koç | İstanbul | 15.200,00 | |
| 5 | Derya Er | İzmir | 7.400,00 | 7.400,00 |
| 6 | Emre Tan | Ankara | 11.300,00 | |
| 7 | Fatma Işık | İstanbul | 8.900,00 |
Şehir ToplamıExcelDepo v1.0.0
Kullanırken dikkat edin
- Cancel = True yazmayı unutmayın: Hücre değerini kendiniz değiştiriyorsanız yordamın sonunda Cancel = True yazın. Yazmazsanız Excel çift tıklamanın varsayılan eylemini de uygular ve hücre düzenleme moduna geçer; bu durumda kullanıcı yazdığınız değeri hemen düzenlenir halde görür.
- Kapsamı daraltın: Olay sayfadaki her çift tıklamada çalışır. Yordamın başında Target.Column, Target.Row ya da Intersect ile yalnızca ilgilendiğiniz aralığı seçin ve diğer durumlarda Exit Sub ile çıkın; aksi halde kullanıcı başka hücreleri normal biçimde düzenleyemez ya da beklenmedik değişiklikler olur.
- Birden çok hücre ve başlıklar: Satır ya da sütun başlığına çift tıklandığında Target birden çok hücreyi kapsayabilir. Target.Value gibi tek hücre varsayan kodlar bu durumda hata verir; bu yüzden Target.Cells.Count ile tek hücre olduğunu doğrulayın.
- Olay yalnızca sayfa modülünde çalışır: Yordamı standart modüle yazarsanız Excel onu olay olarak tanımaz ve hiçbir şey olmaz. Yordam ilgili sayfanın kod modülünde, adı ve parametreleri tam olarak belirtildiği gibi yazılmış olmalıdır. Dosyayı makro içermeyen .xlsx olarak kaydederseniz kodlar silinir.
- Değer yazmak başka olayları tetikler: Yordam içinde bir hücreye değer yazmak Worksheet_Change olayını tetikleyebilir. İki olayı birlikte kullanıyorsanız Application.EnableEvents = False ile olayları geçici olarak kapatın, işlem bitince True'ya döndürün. Hata olasılığında True'ya dönüşü garanti etmek için bir hata yakalama yapısı kullanın; aksi halde olaylar kapalı kalır.
- İlgili konular:
- Worksheet_BeforeRightClick: sağ tıklamadan önce çalışan sayfa olayı
- Worksheet_SelectionChange: seçim değiştiğinde çalışan sayfa olayı
- Worksheet_Change: hücre değeri değiştiğinde çalışan sayfa olayı
- Workbook_SheetBeforeDoubleClick: çalışma kitabındaki tüm sayfalar için çift tıklama olayı
- Application.EnableEvents: olayların çalışmasını açıp kapatan özellik
- Intersect: iki aralığın kesişimini bulan yöntem
- Range.Offset: bir hücreden satır ve sütun uzaklığıyla başka hücreye ulaşma
- ETOPLA: koşula uyan değerleri toplayan çalışma sayfası işlevi (VBA'da WorksheetFunction.SumIf)