Genel Bakış
ActiveX (ActiveX Controls), çalışma sayfasına yerleştirilen ve ayrıntılı özellik ile olay desteği sunan etkileşimli denetimlerdir; düğme, metin kutusu, açılan liste, onay kutusu gibi türleri vardır. Form Denetimlerine göre çok daha fazla özelliğe sahiptir ve VBA ile tüm özellikleri, olayları sayfa kod modülünden yönetilebilir. Kullanıcıdan veri almak, listeden seçim yaptırmak ya da bir düğmeyle makro tetiklemek için kullanılır.
Denetimi seçip sayfada sürükleyerek çizersiniz. Ekleme sonrasında sayfa Tasarım Modu (Design Mode) durumundadır. Bu modda denetimi seçebilir, taşıyabilir, Özellikler (Properties) penceresinden düzenleyebilir ve Kodu Görüntüle (View Code) ile olay yordamını yazabilirsiniz. Denetimi gerçekten kullanmak için Tasarım Modu düğmesini yeniden tıklayarak modu kapatın.
Form Denetimleri (Form Controls) daha basit ve sayfaya gömülü makro atamasıyla çalışır; ActiveX denetimleri ise özellik, biçim ve olay bakımından daha zengindir. Karşılığında yalnız Windows sürümü Excel'de tam desteklenir; Mac ve Excel Online sürümünde çalışmaz.
Olay yordamları, denetimin bulunduğu sayfanın kod modülüne yazılır ve adı Denetimadı_Olay biçimindedir. Sık kullanılan olaylar:
Parametreler:
Makro çalışınca sayfaya üç ActiveX denetimi eklenir. C2 hücresine düğmenin sınıf kimliği olan Forms.CommandButton.1, C3 hücresine metin kutusunun kimliği olan Forms.TextBox.1, C4 hücresine onay kutusunun kimliği olan Forms.CheckBox.1 yazılır. Denetimler sayfanın sağ tarafında alt alta görünür; adlarını Ad Kutusu ya da Özellikler penceresinden de görebilirsiniz.
ComboBox listeyi A2:A6 aralığından alır. ListIndex değeri sıfırdan saydığı için 2 değeri üçüncü öğeyi seçer ve B2 hücresine İzmir yazılır. C2 hücresindeki 5 değeri listedeki toplam öğe sayısını gösterir. Aynı sonucu denetimin LinkedCell özelliğine bir hücre adresi vererek de elde edebilirsiniz; bu durumda kullanıcı seçim yaptıkça hücre kendiliğinden güncellenir.
Her görev satırı için E sütununa bir onay kutusu eklenir. B2 hücresinde denetimin türü olan CheckBox, C2 hücresinde adı olan chkGorev1 görünür. Yalnız ikinci görev işaretlendiği için D3 hücresinde DOĞRU değeri bulunur; diğer satırlarda D2 hücresi YANLIŞ ve D4 hücresi YANLIŞ değerini gösterir. Placement özelliği xlMoveAndSize olduğundan satır yüksekliği değişirse denetim de buna uyar.
Nerede bulunur ve nasıl eklenir
ActiveX denetimleri Geliştirici > Denetimler > Ekle (Developer > Controls > Insert) menüsünde ActiveX Denetimleri (ActiveX Controls) bölümünde yer alır. Geliştirici sekmesi görünmüyorsa Dosya > Seçenekler > Şeridi Özelleştir (File > Options > Customize Ribbon) bölümünde Geliştirici kutusunu işaretleyin.Denetimi seçip sayfada sürükleyerek çizersiniz. Ekleme sonrasında sayfa Tasarım Modu (Design Mode) durumundadır. Bu modda denetimi seçebilir, taşıyabilir, Özellikler (Properties) penceresinden düzenleyebilir ve Kodu Görüntüle (View Code) ile olay yordamını yazabilirsiniz. Denetimi gerçekten kullanmak için Tasarım Modu düğmesini yeniden tıklayarak modu kapatın.
Form Denetimleri (Form Controls) daha basit ve sayfaya gömülü makro atamasıyla çalışır; ActiveX denetimleri ise özellik, biçim ve olay bakımından daha zengindir. Karşılığında yalnız Windows sürümü Excel'de tam desteklenir; Mac ve Excel Online sürümünde çalışmaz.
Önemli özellikler
Denetimlerin ortak ve sık kullanılan özellikleri şunlardır:- Name: Denetimin adıdır; olay yordamları bu adla eşleşir (ör. btnHesapla_Click).
- Caption: Düğme, onay kutusu ve seçenek düğmesinin üzerinde görünen metindir.
- Value: Denetimin değeridir; TextBox ve ComboBox için metin, CheckBox için True/False döner.
- LinkedCell: Denetim değerinin otomatik yazıldığı hücre adresidir.
- ListFillRange: ComboBox ve ListBox için liste kaynağı olan hücre aralığıdır.
- Enabled ve Visible: Denetimin kullanılabilirliğini ve görünürlüğünü belirler.
- Left, Top, Width, Height: Konum ve boyuttur.
- Placement: Satır ve sütun boyutu değişince denetimin davranışını belirler (xlMove, xlMoveAndSize, xlFreeFloating).
- PrintObject: Denetimin yazdırılıp yazdırılmayacağını belirler.
Önemli yöntemler ve olaylar
Sayfadaki denetimler OLEObjects koleksiyonunda tutulur; her öğe bir OLEObject nesnesidir. Add yöntemi denetim ekler, Delete siler, Activate ve Select etkinleştirir ya da seçer.Olay yordamları, denetimin bulunduğu sayfanın kod modülüne yazılır ve adı Denetimadı_Olay biçimindedir. Sık kullanılan olaylar:
- Click: Düğmeye ya da onay kutusuna tıklanınca çalışır.
- Change: TextBox, ComboBox ve CheckBox değeri değişince çalışır.
- DropButtonClick: ComboBox açılır oku kullanılınca çalışır.
- GotFocus ve LostFocus: Denetim odak alınca ya da kaybedince çalışır.
- KeyPress ve KeyDown: Klavye girişini denetler.
Kodla erişim ve ekleme söz dizimi
Denetime sayfa modülünde doğrudan adıyla, başka yerden ise OLEObjects koleksiyonuyla erişilir. Kodla yeni denetim eklemenin söz dizimi:
VBA
4 satır
Set ole = Sayfa.OLEObjects.Add(ClassType, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)
' Var olan denetime erişim
Sayfa.OLEObjects("btnHesapla").Object.Caption = "Hesapla"
- ClassType: Denetimin ProgID değeridir (ör. Forms.CommandButton.1, Forms.TextBox.1, Forms.ComboBox.1, Forms.CheckBox.1); ClassType kullanılacaksa gereklidir.
- Link: Bağlantılı nesne için dosya adıdır; isteğe bağlı, ActiveX denetimlerinde kullanılmaz.
- DisplayAsIcon: Simge olarak gösterilsin mi; isteğe bağlı, varsayılan False.
- IconFileName, IconIndex, IconLabel: Simge dosyası, simge sırası ve etiketi; isteğe bağlı.
- Left, Top, Width, Height: Nokta (point) cinsinden konum ve boyut; isteğe bağlı.
1. Kodla denetim ekleme
Sayfada hangi denetimlerin ekleneceği A ve B sütunlarında yazılıdır. Kodu standart bir modüle yapıştırın; makro her satır için uygun ActiveX denetimini ekler, adını verir ve C sütununa denetimin sınıf kimliğini (ProgID) yazar.
VBA
33 satır
Option Explicit
Sub DenetimEkle()
Dim ws As Worksheet
Dim ole As OLEObject
Dim i As Long
Dim sinif As String
Set ws = ActiveSheet
' Yeniden çalıştırmada adlar çakışmasın diye eski denetimleri sil
For i = ws.OLEObjects.Count To 1 Step -1
ws.OLEObjects(i).Delete
Next i
For i = 2 To 4
Select Case ws.Cells(i, 2).Value
Case "CommandButton": sinif = "Forms.CommandButton.1"
Case "TextBox": sinif = "Forms.TextBox.1"
Case "CheckBox": sinif = "Forms.CheckBox.1"
End Select
Set ole = ws.OLEObjects.Add(ClassType:=sinif, Left:=320, Top:=20 + (i - 2) * 35, Width:=110, Height:=26)
ole.Name = ws.Cells(i, 1).Value
' Metin kutusunun Caption özelliği yoktur
If ws.Cells(i, 2).Value <> "TextBox" Then
ole.Object.Caption = ws.Cells(i, 1).Value
End If
ws.Cells(i, 3).Value = ole.progID
Next i
End Sub
ActiveX
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Denetim Adı | Tür | Sınıf Kimliği |
| 2 | btnHesapla | CommandButton | Forms.CommandButton.1 |
| 3 | txtMusteri | TextBox | Forms.TextBox.1 |
| 4 | chkOnay | CheckBox | Forms.CheckBox.1 |
Denetim ListesiExcelDepo v1.0.0
2. ComboBox ile liste doldurma
A2:A6 aralığındaki şehirler bir açılan listeye (ComboBox) kaynak olacaktır. Kodu standart modüle yapıştırın; makro ComboBox ekler, ListFillRange ile listeyi bağlar, üçüncü öğeyi seçer ve seçilen şehri ile öğe sayısını sayfaya yazar.
VBA
26 satır
Option Explicit
Sub ComboEkle()
Dim ws As Worksheet
Dim ole As OLEObject
Dim i As Long
Set ws = ActiveSheet
' Önceki çalıştırmadan kalan denetimleri temizle
For i = ws.OLEObjects.Count To 1 Step -1
ws.OLEObjects(i).Delete
Next i
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=250, Top:=20, Width:=120, Height:=22)
ole.Name = "cmbSehir"
' Liste kaynağı: aynı sayfadaki şehir adları
ole.ListFillRange = "A2:A6"
' ListIndex sıfırdan başlar; 2 değeri üçüncü öğeyi seçer
ole.Object.ListIndex = 2
ws.Range("B2").Value = ole.Object.Value
ws.Range("C2").Value = ole.Object.ListCount
End Sub
ActiveX
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Seçilen Şehir | Öğe Sayısı |
| 2 | İstanbul | İzmir | 5 |
| 3 | Ankara | ||
| 4 | İzmir | ||
| 5 | Bursa | ||
| 6 | Antalya |
Şehir SeçimiExcelDepo v1.0.0
3. Onay kutuları ve denetim türü
Her görev satırının yanına bir onay kutusu (CheckBox) eklenecek. Kodu standart modüle yapıştırın; makro E sütunundaki hücrelerin konumuna denetim yerleştirir, ikinci görevi işaretli yapar ve her denetimin türünü, adını ve durumunu sayfaya yazar.
VBA
33 satır
Option Explicit
Sub OnayKutulariEkle()
Dim ws As Worksheet
Dim ole As OLEObject
Dim i As Long
Set ws = ActiveSheet
' Eski denetimleri sil
For i = ws.OLEObjects.Count To 1 Step -1
ws.OLEObjects(i).Delete
Next i
For i = 2 To 4
' Denetimi ilgili satırın E hücresinin üzerine yerleştir
Set ole = ws.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
Left:=ws.Range("E" & i).Left + 5, _
Top:=ws.Range("E" & i).Top + 2, _
Width:=80, Height:=16)
ole.Name = "chkGorev" & (i - 1)
ole.Placement = xlMoveAndSize
ole.Object.Caption = "Tamam"
' Yalnız ikinci görev işaretli olsun
If i = 3 Then ole.Object.Value = True
ws.Cells(i, 2).Value = TypeName(ole.Object)
ws.Cells(i, 3).Value = ole.Name
ws.Cells(i, 4).Value = ole.Object.Value
Next i
End Sub
ActiveX
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Görev | Denetim Türü | Denetim Adı | Durum | Onay |
| 2 | Fatura kontrolü | CheckBox | chkGorev1 | YANLIŞ | |
| 3 | Stok sayımı | CheckBox | chkGorev2 | DOĞRU | |
| 4 | Rapor gönderimi | CheckBox | chkGorev3 | YANLIŞ |
Onay ListesiExcelDepo v1.0.0
Kullanırken dikkat edin
- Tasarım Modu açıkken denetim çalışmaz: Denetime tıklayınca yalnız seçiliyorsa ya da olay yordamı çalışmıyorsa Tasarım Modu (Design Mode) açıktır. Geliştirici sekmesindeki Tasarım Modu düğmesini kapatın.
- Olay yordamı yanlış yerde olmasın: Denetim olayları denetimin bulunduğu sayfanın kod modülünde olmalıdır. Standart modüle yazılan btnHesapla_Click yordamı tıklayınca çalışmaz. Denetimin adını değiştirirseniz yordam adını da güncelleyin; aksi halde olay bağlantısı kopar.
- Aynı adı iki kez kullanmayın: Bir sayfada her denetimin adı benzersiz olmalıdır. Kodla denetim eklerken aynı adı tekrar vermek hata üretir; örneklerdeki gibi eski denetimleri silmek ya da ad denetimi yapmak çözümdür.
- Sürüm ve platform sınırları: ActiveX denetimleri Mac için Excel ve Excel Online ortamında çalışmaz. Makro güvenliği ve Güven Merkezi (Trust Center) ActiveX ayarları da denetimlerin çalışmasını etkileyebilir. Windows güncellemelerinden sonra denetimlerin yüklenmediği durumlarda MSForms önbellek (.exd) dosyalarını silmek yaygın bir çözümdür.
- Konum ve yazdırma ayarları: Denetimleri filtreleme ya da satır gizleme sırasında kaydırmak istemiyorsanız Placement özelliğini xlFreeFloating yapın. Denetimin yazdırılmasını istemiyorsanız PrintObject özelliğini False yapın. Çok sayıda ActiveX denetimi dosyayı yavaşlatabilir; mümkünse hücre doğrulama listesi gibi hafif seçenekleri düşünün.
- İlgili konular: Form Denetimleri (Form Controls), UserForm, OLEObjects koleksiyonu, Shapes koleksiyonu, Worksheet_Change olayı, Veri Doğrulama (Data Validation) açılan listesi, Geliştirici sekmesi, Tasarım Modu, Güven Merkezi ve DOLAYLI işlevi.