Genel Bakış
CheckBox (Onay Kutusu), kullanıcının bir seçeneği işaretleyerek açıp kapatmasını sağlayan denetimdir. Çalışma sayfasında Form Denetimi ya da ActiveX Denetimi olarak, UserForm üzerinde ise MSForms denetimi olarak kullanılır. VBA ile durumu okunur, değiştirilir ve işaretleme anında çalışacak kod olaylarla bağlanır.
Parametreler ve değerler:
Makro her satıra bir onay kutusu ekler ve kutuyu C sütunundaki hücreye bağlar. Bu çalıştırmada yalnızca işaretli kutuların bağlı hücrelerinde DOĞRU görünür; işaretsiz kutuların bağlı hücreleri boş kalır. Birinci görevin durumu Tamamlandı, ikinci görevin durumu Bekliyor olarak hesaplanır. İşaretli kutu sayısını COUNTIF formülü 3 olarak verir. Kullanıcı bir kutuyu elle işaretlediğinde bağlı hücre ve formüller de anında güncellenir; kod yazmaya gerek kalmaz.
İlk hizmetin sonucu Seçildi, ikinci hizmetin sonucu Seçilmedi olarak yazılır. Seçilen hizmetlerin ücret toplamı B7 hücresinde 195,00 olur. Kutu ile satır eşleşmesi TopLeftCell.Row ile kurulur, bu yüzden kutuların her biri kendi satırının hücreleri üzerinde durmalıdır.
Bu örnek etkileşimli olduğu için otomatik çalıştırılmaz. Kutuyu işaretlediğinizde Click olayı tetiklenir; B2 hücresine onay metni, B3 hücresine o günün tarihi yazılır. İşareti kaldırdığınızda B2 yeniden bekleme metnine döner ve B3 temizlenir. Aynı mantık UserForm üzerindeki bir CheckBox için de geçerlidir; kodu yalnızca UserForm'un kod modülüne yazmanız yeterlidir.
Üç farklı CheckBox türü
Excel'de aynı görünen üç ayrı onay kutusu vardır ve VBA'da her biri farklı davranır:- Form Denetimi: Geliştirici > Ekle > Form Denetimleri > Onay Kutusu (Developer > Insert > Form Controls > Check Box) ile eklenir. VBA'da sayfanın CheckBoxes koleksiyonundan erişilir. Değeri xlOn, xlOff ya da xlMixed sabitleriyle okunur ve yazılır. Kutuya Makro Ata (Assign Macro) ile bir makro bağlanır; olay yordamı yoktur.
- ActiveX Denetimi: Geliştirici > Ekle > ActiveX Denetimleri (ActiveX Controls) altından eklenir. VBA'da OLEObjects koleksiyonu ve nesnenin Object özelliği üzerinden kullanılır; değeri True, False ya da Null'dır. Click ve Change gibi olayları vardır. Ayarları değiştirmek için Tasarım Modu (Design Mode) açık olmalıdır.
- UserForm denetimi: UserForm'a araç kutusundan eklenir. Kod içinde doğrudan adıyla (CheckBox1) ya da Controls koleksiyonuyla erişilir. Özellikleri ActiveX denetimiyle aynıdır.
Söz dizimi
Onay kutusunu oluşturma ve değerini ayarlama söz dizimi türe göre değişir:
VBA
10 satır
' Form Denetimi
Set cb = Worksheets("Sayfa1").CheckBoxes.Add(Left, Top, Width, Height)
cb.Value = xlOn
' ActiveX Denetimi (çalışma sayfasında)
Set ole = Worksheets("Sayfa1").OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=20, Top:=20, Width:=100, Height:=20)
ole.Object.Value = True
' UserForm denetimi
UserForm1.CheckBox1.Value = True
- Left, Top: kutunun sayfadaki konumu, punto cinsinden. Hücreye yerleştirmek için hücrenin Left ve Top değerleri kullanılır. CheckBoxes.Add'de zorunludur.
- Width, Height: kutunun genişliği ve yüksekliği, punto cinsinden. CheckBoxes.Add'de zorunludur.
- ClassType: ActiveX denetim türünü belirten sınıf adı; onay kutusu için Forms.CheckBox.1 yazılır.
- Left, Top, Width, Height (OLEObjects.Add): isteğe bağlıdır; verilmezse varsayılan konum ve boyut kullanılır.
- Value (Form Denetimi): xlOn (işaretli, 1), xlOff (işaretsiz, -4146) ya da xlMixed (belirsiz, 2).
- Value (ActiveX ve UserForm): True (işaretli), False (işaretsiz) ya da Null (yalnızca TripleState açıkken, belirsiz durum). Varsayılan değer False'tur.
Önemli özellikler
- Value: işaret durumunu verir ya da değiştirir. Form Denetimi'nde değer xlOn/xlOff, diğerlerinde True/False biçimindedir.
- Caption: kutunun yanında görünen metin. Form Denetimi'nde de aynı adla kullanılır.
- LinkedCell: kutunun durumunu bir hücreyle bağlar. Kutu işaretliyse hücreye TRUE yazılır. İşaretsiz kutuda durum hiç değişmediyse bağlı hücre boş kalabilir; hücrede FALSE değeri, kutunun durumu değiştiğinde görünür. Form Denetimi'nde durum belirsizse hücreye #YOK (#N/A) yazılır. ActiveX'te OLEObject üzerinden, Form Denetimi'nde doğrudan kullanılır.
- ControlSource: ActiveX ve UserForm denetimlerinde değerin bağlandığı hücre ya da alan.
- TripleState: True olursa kutu üç durumlu çalışır (işaretli, işaretsiz, Null). Varsayılan False'tur.
- Enabled ve Locked: Enabled False ise kutu soluk görünür ve tıklanmaz; Locked True ise değer kullanıcı tarafından değiştirilemez ama kutu soluk görünmez.
- Visible: kutuyu gösterir ya da gizler.
- Alignment: ActiveX ve UserForm'da işaret karesinin metnin solunda mı sağında mı olacağını belirler.
- Name: kodda kullanılan ad (CheckBox1 gibi). Anlamlı adlar (chkOnay) kodu okunur kılar.
- TopLeftCell: Form Denetimi ve ActiveX denetimlerinde kutunun sol üst köşesinin bulunduğu hücreyi verir; satır eşleştirmede işe yarar.
Önemli yöntemler ve olaylar
- SetFocus: ActiveX ve UserForm kutusuna odağı verir.
- Click: kutuya tıklandığında oluşur.
- Change: Value değiştiğinde oluşur; değer kodla değiştirildiğinde de tetiklenir.
- BeforeUpdate ve AfterUpdate: değer güncellenmeden önce ve sonra oluşur.
- Enter ve Exit: kutu odağı alırken ve kaybederken oluşur.
1. Satırlara onay kutusu ekleme ve hücreye bağlama
Sayfada görev adları A sütununda, onay kutularının duracağı B sütunu boş, durum bilgisinin yazılacağı C ve D sütunları hazırdır. Aşağıdaki kodu standart modüle (Ekle > Modül) yapıştırın ve çalıştırın. Makro her görev satırına bir Form Denetimi onay kutusu ekler ve kutuyu C sütunundaki hücreye bağlar. D sütunundaki EĞER formülü bağlı hücreye bakarak durumu yazar.
VBA
23 satır
Option Explicit
Sub OnayKutulariniEkle()
Dim ws As Worksheet
Dim cb As CheckBox
Dim r As Long
Set ws = ActiveSheet
For r = 2 To 6
' Kutuyu B sütunundaki hücrenin üzerine yerleştir
Set cb = ws.CheckBoxes.Add(ws.Cells(r, 2).Left + 10, ws.Cells(r, 2).Top + 1, 18, 14)
cb.Caption = ""
' Kutunun durumu C sütunundaki hücreye TRUE/FALSE olarak yazılır
cb.LinkedCell = ws.Cells(r, 3).Address(True, True)
' Çift numaralı satırlardaki kutuları işaretle
If r Mod 2 = 0 Then
cb.Value = xlOn
Else
cb.Value = xlOff
End If
Next r
End Sub
CheckBox
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Görev | Seç | Onay | Durum |
| 2 | Aylık rapor hazırlama | DOĞRU | Tamamlandı | |
| 3 | Fatura kontrolü | Bekliyor | ||
| 4 | Stok sayımı | DOĞRU | Tamamlandı | |
| 5 | Müşteri toplantısı | Bekliyor | ||
| 6 | Bütçe güncelleme | DOĞRU | Tamamlandı | |
| 7 | Tamamlanan görev sayısı | 3 |
Görev ListesiExcelDepo v1.0.0
2. Onay kutularının durumunu döngüyle okuma
Sayfada hizmet adları ve ücretler A ve B sütunlarında, onay kutularının duracağı C sütunu ve sonuçların yazılacağı D sütunu hazırdır. Kodu standart modüle yapıştırın. Makro önce her satıra bir Form Denetimi onay kutusu ekler ve bir Boolean dizisine göre işaretler. Sonra CheckBoxes koleksiyonunu gezer, Value değerini xlOn ile karşılaştırır ve seçilen hizmetlerin ücretlerini toplar.
VBA
38 satır
Option Explicit
Sub HizmetSecimleriniOku()
Dim ws As Worksheet
Dim cb As CheckBox
Dim r As Long
Dim toplam As Double
Dim secili As Variant
Set ws = ActiveSheet
' Hangi hizmetlerin işaretleneceği (2. satırdan 6. satıra)
secili = Array(True, False, True, True, False)
' 1. adım: her satıra bir onay kutusu ekle
For r = 2 To 6
Set cb = ws.CheckBoxes.Add(ws.Cells(r, 3).Left + 10, ws.Cells(r, 3).Top + 1, 18, 14)
cb.Caption = ""
If secili(r - 2) Then
cb.Value = xlOn
Else
cb.Value = xlOff
End If
Next r
' 2. adım: kutuları gez ve durumlarını oku
For Each cb In ws.CheckBoxes
r = cb.TopLeftCell.Row
' Form Denetimi'nde karşılaştırma xlOn ile yapılır, True ile değil
If cb.Value = xlOn Then
ws.Cells(r, 4).Value = "Seçildi"
toplam = toplam + ws.Cells(r, 2).Value
Else
ws.Cells(r, 4).Value = "Seçilmedi"
End If
Next cb
ws.Range("B7").Value = toplam
End Sub
CheckBox
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Hizmet | Ücret | Seç | Sonuç |
| 2 | Hızlı kargo | 45,00 | Seçildi | |
| 3 | Hediye paketi | 15,00 | Seçilmedi | |
| 4 | Ek garanti | 120,00 | Seçildi | |
| 5 | Sigorta | 30,00 | Seçildi | |
| 6 | Kurulum desteği | 80,00 | Seçilmedi | |
| 7 | Seçilen toplam | 195,00 |
Ek HizmetlerExcelDepo v1.0.0
3. ActiveX onay kutusunun Click olayı
Sayfaya Geliştirici > Ekle > ActiveX Denetimleri > Onay Kutusu ile bir kutu ekleyin ve adının CheckBox1 olduğundan emin olun (Geliştirici sekmesindeki Özellikler penceresinden kontrol edebilirsiniz). Ardından sayfa sekmesine sağ tıklayıp Kod Görüntüle (View Code) deyin ve aşağıdaki kodu o sayfanın kod modülüne yapıştırın. Tasarım Modu kapalıyken kutuyu işaretleyip işareti kaldırarak B2 hücresini izleyin.
VBA
13 satır
Option Explicit
' Bu kod ActiveX onay kutusunun bulunduğu sayfanın modülüne yazılır
Private Sub CheckBox1_Click()
' ActiveX kutusunda Value True ya da False döner
If CheckBox1.Value = True Then
Range("B2").Value = "Sözleşme onaylandı"
Range("B3").Value = Format(Date, "dd.mm.yyyy")
Else
Range("B2").Value = "Onay bekleniyor"
Range("B3").ClearContents
End If
End Sub
CheckBox
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Alan | Değer |
| 2 | Sözleşme durumu | Onay bekleniyor |
| 3 | Onay tarihi |
Onay FormuExcelDepo v1.0.0
Kullanırken dikkat edin
- Form Denetimi'nde True ile karşılaştırmayın: Form Denetimi'nin Value özelliği True/False değil, xlOn (1) ve xlOff (-4146) döndürür. Koşulu cb.Value = True biçiminde kurarsanız işaretli kutu bile yanlış sonuç verir. Karşılaştırmayı daima xlOn ile yapın. ActiveX ve UserForm kutularında ise True/False kullanılır.
- Tasarım Modu: ActiveX kutusunun özelliklerini değiştirmek, boyutunu ayarlamak ya da silmek için Geliştirici sekmesindeki Tasarım Modu açık olmalıdır. Kutuyu gerçekten işaretleyip olayı denemek için modu kapatın. Olay yordamı çalışmıyorsa ilk bakılacak yer budur.
- Kutunun adı ve olay yordamı: Olay yordamı kutunun adına bağlıdır. Kutuyu yeniden adlandırırsanız ya da kopyalarsanız (CheckBox2 gibi yeni ad alır) eski adla yazılmış yordam artık çalışmaz. Önce kutuyu adlandırın, sonra kodu yazın.
- Aynı makroyu tekrar çalıştırmak: Kutu ekleyen makroyu iki kez çalıştırırsanız aynı yerde üst üste ikinci bir kutu oluşur. Kutuları eklemeden önce var olanları silmeyi ya da kutuları yalnızca bir kez eklemeyi planlayın. Silmek için kutunun adını verip Delete yöntemini kullanabilirsiniz.
- Bağlı hücre ve belirsiz durum: LinkedCell ile bağlanan hücreye kutu işaretliyse TRUE yazılır. İşaretsiz kutuda durum hiç değişmediyse bağlı hücre boş kalabilir; bu durumda hücreye bakan EĞER gibi formüller kutuyu işaretsiz sayar. Kutuyu belirsiz duruma (xlMixed ya da Null) getirirseniz Form Denetimi bağlı hücreye #YOK (#N/A) yazar; bu hücreye bağlı formüller de hata verir. Üç durumlu kutu gerekmiyorsa TripleState özelliğini kapalı tutun.
- Birden çok kutuyu toplu işleme: Çok sayıda kutuyu gezerken Form Denetimi için CheckBoxes koleksiyonunu, ActiveX için OLEObjects koleksiyonunu, UserForm için ise Controls koleksiyonunu kullanın. UserForm'da TypeName(ctl) = "CheckBox" koşuluyla kutuları diğer denetimlerden ayırabilirsiniz.
- İlgili konular: OptionButton (Seçenek Düğmesi), ComboBox, ListBox, UserForm, Controls koleksiyonu, CheckBoxes koleksiyonu, OLEObjects koleksiyonu, Shapes koleksiyonu, Geliştirici sekmesi, Makro Ata, EĞER ve EĞERSAY işlevleri.