Genel Bakış
CommandButton (Komut Düğmesi), kullanıcı üzerine tıkladığında bir olay yordamını çalıştıran ActiveX denetimidir. Hem çalışma sayfasına hem de UserForm üzerine yerleştirilebilir. Düğmenin asıl işlevi, Click olayına yazdığınız VBA kodunu tek tıkla çalıştırmaktır.
Dikkat: Geliştirici sekmesindeki Düğme (Form Denetimi) farklı bir nesnedir; ona makro Makro Ata (Assign Macro) ile bağlanır ve Click olayı yoktur.
Yordam adı DenetimAdı_OlayAdı biçimindedir. Olayın parametre alanı varsa (örneğin KeyPress için KeyAscii) iskelet bunları kendisi ekler; elle yazarken imzayı değiştirmeyin.
Makro sayfaya btnRapor adlı bir düğme ekledi. B2 hücresine düğmenin adı (btnRapor), B3 hücresine başlığı (Raporu Hazırla), B4 hücresine genişliği (120) ve B5 hücresine TakeFocusOnClick değeri (YANLIŞ) yazıldı. Sayfadaki ActiveX denetimine özelliklerle ulaşırken önce OLEObject nesnesinin kendi özelliklerini (Name, Width), düğmeye özgü özellikleri ise Object üzerinden (Caption, TakeFocusOnClick) kullandığınıza dikkat edin.
Makro E2, E3 ve E4 hücrelerinin üzerine üç düğme yerleştirdi. Düğme adları B sütununa yazıldı: btn1, btn2 ve btn3. C sütunu Enabled değerlerini gösterir; Sil düğmesi için YANLIŞ yazılmıştır, bu nedenle o düğme soluk görünür ve tıklanmaz. Düğme adlarını sıralı ve anlamlı verirseniz sonradan OLEObjects("btn1") gibi adla erişmek kolaylaşır.
Düğmeye tıklandığında Click olayı oluşur ve btnTemizle_Click yordamı B2:B5 aralığındaki girişleri siler; imleç B2 hücresine döner. MouseMove yordamı ise fare düğmenin üzerine geldiğinde başlığı değiştirir. Yordam adlarındaki btnTemizle bölümü, düğmenin Name özelliğiyle birebir aynı olmalıdır; farklıysa olay çalışmaz.
CommandButton nedir ve nerede bulunur
CommandButton, Microsoft Forms kitaplığına ait bir denetimdir. İki yerde kullanılır:- Çalışma sayfası: Geliştirici > Denetimler > Ekle > ActiveX Denetimleri > Komut Düğmesi (Developer > Controls > Insert > ActiveX Controls > Command Button) yolu izlenir. Geliştirici sekmesi görünmüyorsa Dosya > Seçenekler > Şeridi Özelleştir (File > Options > Customize Ribbon) bölümünden açılır.
- UserForm: VBA düzenleyicisinde Araç Kutusu'ndaki düğme simgesi forma sürüklenir.
VBA
6 satır
' Çalışma sayfasında
Set obj = ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Left:=10, Top:=10, Width:=100, Height:=30)
' UserForm üzerinde (kod UserForm modülündedir)
Set btn = Me.Controls.Add("Forms.CommandButton.1", "btnTamam", True)
Önemli özellikler
- Name: Denetimin kod içindeki adıdır (varsayılan CommandButton1). Olay yordamının adı bu adla oluşur; adı sonradan değiştirirseniz yordam denetimle bağlantısını yitirir.
- Caption: Düğme üzerinde görünen metindir.
- Enabled: False olduğunda düğme soluklaşır ve tıklanamaz.
- Visible: Düğmeyi gösterir ya da gizler.
- TakeFocusOnClick: False yapılırsa tıklamadan sonra odak düğmede kalmaz; çalışma sayfasında hücre girişini kesintiye uğratmamak için kullanışlıdır.
- Accelerator: Alt tuşuyla birlikte kullanılacak kısayol harfidir.
- Default ve Cancel: UserForm'da Enter tuşunun ya da Esc tuşunun düğmeyi tıklamış gibi çalışmasını sağlar.
- Font, ForeColor, BackColor: Yazı tipi ve renk ayarlarıdır.
- Picture ve PicturePosition: Düğmeye resim ekler ve resmin metne göre konumunu belirler.
- WordWrap: Uzun başlığın birden çok satıra bölünmesini sağlar.
- ControlTipText: Fare üzerine geldiğinde görünen ipucu metnidir; asıl olarak UserForm'da işe yarar.
- Placement: (yalnızca sayfadaki OLEObject) Düğmenin hücrelerle birlikte taşınıp boyutlanmasını belirler.
- Left, Top, Width, Height: Konum ve boyuttur; birim noktadır (point).
Önemli yöntemler ve olaylar
Yöntemler:- SetFocus: Odağı düğmeye verir.
- Move: Düğmeyi yeni konuma taşır, istenirse boyutunu da değiştirir.
- ZOrder: Düğmeyi diğer nesnelerin önüne ya da arkasına alır.
- Click: Düğmeye tıklandığında ya da odaktayken boşluk tuşuna basıldığında oluşur; en çok kullanılan olaydır.
- DblClick: Çift tıklamada oluşur.
- MouseDown, MouseUp, MouseMove: Fare düğmesinin basılması, bırakılması ve imlecin hareketi için kullanılır.
- KeyDown, KeyUp, KeyPress: Odaktayken klavye tuşları için oluşur.
- GotFocus, LostFocus: Çalışma sayfasındaki düğmenin odağı alması ve yitirmesi.
- Enter, Exit: UserForm'daki düğmenin odağı alması ve yitirmesi.
Olay yordamı nereye yazılır
Çalışma sayfasındaki düğmenin olay yordamı, düğmenin bulunduğu sayfanın kod modülüne yazılır. Tasarım Modu açıkken düğmeye çift tıklarsanız ya da sağ tıklayıp Kod Görüntüle (View Code) derseniz Excel yordamın iskeletini otomatik oluşturur. UserForm üzerindeki düğmenin yordamı ise UserForm modülüne yazılır. Standart modüle yazılan CommandButton1_Click yordamı denetime bağlanmaz.
VBA
3 satır
Private Sub CommandButton1_Click()
' Düğmeye tıklanınca çalışacak kod
End Sub
1. Kodla düğme oluşturma ve özelliklerini okuma
Sayfada düğmenin özelliklerinin yazılacağı bir tablo vardır. Aşağıdaki kodu standart bir modüle (Ekle > Modül) yapıştırın ve DugmeEkle makrosunu çalıştırın. Makro, D2 hücresinin konumuna bir ActiveX komut düğmesi ekler ve özelliklerini B sütununa yazar.
VBA
29 satır
Option Explicit
Sub DugmeEkle()
Dim ws As Worksheet
Dim obj As OLEObject
Dim i As Long
Set ws = ActiveSheet
' Önceki çalıştırmadan kalan düğmeyi sil
For i = ws.OLEObjects.Count To 1 Step -1
If ws.OLEObjects(i).Name = "btnRapor" Then ws.OLEObjects(i).Delete
Next i
' D2 hücresinin konumuna düğmeyi ekle
Set obj = ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Left:=ws.Range("D2").Left, Top:=ws.Range("D2").Top, _
Width:=120, Height:=30)
obj.Name = "btnRapor"
obj.Object.Caption = "Raporu Hazırla"
obj.Object.TakeFocusOnClick = False
' Özellikleri sayfaya yaz
ws.Range("B2").Value = obj.Name
ws.Range("B3").Value = obj.Object.Caption
ws.Range("B4").Value = obj.Width
ws.Range("B5").Value = obj.Object.TakeFocusOnClick
End Sub
CommandButton
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Özellik | Değer |
| 2 | Name | btnRapor |
| 3 | Caption | Raporu Hazırla |
| 4 | Width (nokta) | 120 |
| 5 | TakeFocusOnClick | YANLIŞ |
Düğme ÖzellikleriExcelDepo v1.0.0
2. Döngüyle birden çok düğme ekleme
A sütunundaki her başlık için E sütununda bir düğme oluşturulacaktır. Kodu standart bir modüle yapıştırıp DugmeleriOlustur makrosunu çalıştırın. Başlığı Sil olan düğme Enabled özelliği False yapılarak devre dışı bırakılır.
VBA
31 satır
Option Explicit
Sub DugmeleriOlustur()
Dim ws As Worksheet
Dim obj As OLEObject
Dim i As Long
Dim r As Long
Set ws = ActiveSheet
' Önceki çalıştırmadan kalan btn ile başlayan düğmeleri sil
For i = ws.OLEObjects.Count To 1 Step -1
If Left(ws.OLEObjects(i).Name, 3) = "btn" Then ws.OLEObjects(i).Delete
Next i
' 2. ile 4. satırlar için birer düğme ekle
For r = 2 To 4
Set obj = ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Left:=ws.Cells(r, 5).Left, Top:=ws.Cells(r, 5).Top, _
Width:=90, Height:=ws.Cells(r, 5).Height)
obj.Name = "btn" & (r - 1)
obj.Object.Caption = ws.Cells(r, 1).Value
' Sil düğmesi devre dışı olsun
obj.Object.Enabled = (ws.Cells(r, 1).Value <> "Sil")
ws.Cells(r, 2).Value = obj.Name
ws.Cells(r, 3).Value = obj.Object.Enabled
Next r
End Sub
CommandButton
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Başlık | Düğme Adı | Etkin |
| 2 | Kaydet | btn1 | DOĞRU |
| 3 | Sil | btn2 | YANLIŞ |
| 4 | Yazdır | btn3 | DOĞRU |
Düğme ListesiExcelDepo v1.0.0
3. Click olayıyla giriş alanlarını temizleme
Sayfada bir giriş formu vardır. Önce Geliştirici > Ekle > ActiveX Denetimleri > Komut Düğmesi (Developer > Insert > ActiveX Controls > Command Button) ile D2 hücresi yakınına bir düğme çizin. Tasarım Modu açıkken düğmeyi seçip Özellikler (Properties) penceresinde Name değerini btnTemizle, Caption değerini Formu Temizle yapın. Düğmeye çift tıklayın; açılan sayfa modülüne aşağıdaki kodu yazın. Ardından Tasarım Modu'nu kapatıp düğmeye tıklayın. Bu örnek bir tıklama gerektirdiği için burada otomatik çalıştırılmaz.
VBA
16 satır
Option Explicit
' Bu kod, düğmenin bulunduğu sayfanın kod modülüne yazılır
Private Sub btnTemizle_Click()
' B2:B5 aralığındaki girişleri temizle
Me.Range("B2:B5").ClearContents
' İmleci ilk giriş hücresine götür
Me.Range("B2").Select
End Sub
Private Sub btnTemizle_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Fare düğmenin üzerindeyken başlığı değiştir
btnTemizle.Caption = "Temizlemek için tıklayın"
End Sub
CommandButton
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Alan | Giriş |
| 2 | Ad Soyad | Ayşe Demir |
| 3 | Şehir | Ankara |
| 4 | Ürün | Klavye |
| 5 | Adet | 5 |
Giriş FormuExcelDepo v1.0.0
Kullanırken dikkat edin
- Tasarım Modu açık kalmasın: Düğme tıklamaya yanıt vermiyorsa ilk bakılacak yer Geliştirici > Denetimler > Tasarım Modu (Design Mode) düğmesidir. Mod açıkken düğme yalnızca seçilir ve düzenlenir, kod çalışmaz.
- Name değiştirince yordam kopar: Olay yordamının adı denetimin adından türer. Düğmenin Name özelliğini sonradan değiştirirseniz eski adlı yordam sıradan bir yordam olarak kalır ve düğmeyle ilişkisi kesilir. Adı önce verin, sonra kodu yazın; ya da yordamın adını yeni ada göre düzeltin.
- Odak sorunu: Çalışma sayfasında düğmeye tıkladıktan sonra odak düğmede kalır ve örneğin Enter tuşu düğmeyi yeniden tetikleyebilir. Bunu önlemek için TakeFocusOnClick özelliğini False yapın ya da kodun sonunda bir hücreyi seçin.
- ActiveX ve Form denetimi farkı: ActiveX düğmesinde olay yordamı yazılır, özellikleri ayrıntılı ayarlanır; ancak Mac sürümünde desteklenmez ve Excel Online'da çalışmaz. Form Denetimi düğmesi daha basittir, bir makroya bağlanır ve her platformda çalışır. Dosyayı paylaşacağınız kişilerin ortamına göre seçim yapın.
- Makro güvenliği ve dosya türü: Düğmedeki kod yalnızca makro içerebilen dosya türünde (.xlsm) saklanır. Makrolar devre dışıysa düğme tıklanınca hiçbir şey olmaz. Dosyayı .xlsx olarak kaydederseniz kod silinir.
- Boyut ve konum kayması: Ekran yakınlaştırmasını değiştirmek, sütun genişliği ayarlamak ya da farklı ekran çözünürlüğünde açmak ActiveX düğmelerinin boyutunu ve konumunu kaydırabilir. Düğmenin Placement özelliğini ihtiyacınıza göre ayarlayın; sabit kalmasını istiyorsanız xlFreeFloating kullanın.
- Korumalı sayfa: Sayfa korumalıyken düğme tıklanabilir ancak kodunuz sayfadaki kilitli hücrelere yazmaya çalışırsa hata oluşur. Gerekirse kodda korumayı kaldırıp yeniden uygulayın ya da hücrelerin Locked özelliğini önceden ayarlayın.
- İlgili konular:
- UserForm: CommandButton'ın en sık kullanıldığı form penceresi.
- OLEObjects koleksiyonu: Sayfadaki ActiveX denetimlerine kodla erişim.
- Shapes ve Buttons: Form denetimi düğmelerini kodla yönetme.
- Worksheet olayları: Change, SelectionChange gibi sayfa olayları.
- Application.Run: Adı değişken olarak verilen makroyu çalıştırma.
- MsgBox: Düğme tıklamasından sonra kullanıcıya bilgi verme.
- Label, TextBox, ComboBox: Aynı denetim ailesinden diğer denetimler.
- Geliştirici sekmesi ve Tasarım Modu: Denetim ekleme ve düzenleme arayüzü.