Genel Bakış
SpinButton (Çevirme Düğmesi), üzerindeki yukarı ve aşağı oklara tıklanarak bir tam sayı değerini belirli adımlarla artıran ya da azaltan ActiveX denetimidir. UserForm üzerinde ya da doğrudan çalışma sayfasında kullanılır. Genellikle bir metin kutusu, etiket ya da hücreyle birlikte çalışır ve kullanıcının sayı, ay, adet gibi değerleri klavyesiz seçmesini sağlar.
ActiveX denetimini sayfada düzenlemek için Geliştirici > Tasarım Modu (Developer > Design Mode) açık olmalıdır; denetimi çalıştırmak için bu modu kapatın.
Olay yordamı nereye yazılır: UserForm üzerindeki denetimin olayları o formun kod penceresine yazılır (forma çift tıklayın ya da F7 tuşuna basın). Sayfadaki ActiveX denetiminin olayları ise denetimin bulunduğu sayfanın kod modülüne yazılır; denetime tasarım modunda çift tıklamak doğru yordamı oluşturur. Standart modüle yazılan olay yordamı çalışmaz.
Denetime kodla erişmek için UserForm içinde doğrudan SpinButton1.Value yazılır. Sayfadaki denetim için Sheets("Sayfa1").SpinButton1.Value ya da OLEObjects("SpinButton1").Object.Value kullanılır.
Bu örnek form gösterdiği için çalıştırılmaz. Form açıldığında metin kutusunda başlangıç değeri görünür; yukarı ok değeri 5 artırır, aşağı ok 5 azaltır. Değer 0'a ya da 100'e ulaşınca oklar o yönde etki etmez. Düğmeye tıklandığında seçilen adet Defter satırındaki B2 hücresine yazılır ve form kapanır.
Makro çalıştıktan sonra en küçük değer 1, en büyük değer 12 ve adım miktarı 1 olarak sayfaya yazılır. Başlangıç Value değeri 3 olur ve bu sayıya karşılık gelen ay adı B6 hücresinde Mart biçiminde görünür. Min ve Max değerlerini önce ayarlamak önemlidir; çünkü Value bu aralığın dışında olamaz.
Denetim C2 hücresine bağlandığı için Value değeri bu hücreye aktarılır ve Defter satırının tutarı D2 hücresinde 74,00 olarak hesaplanır. Diğer satırların adetleri sabit olduğundan Kalem için 72,50, Silgi için 75,00 sonucu çıkar. Gerçek kullanımda denetimi silmeden bırakırsanız oklara her tıklamada C2 SmallChange kadar değişir ve tutar kendiliğinden yenilenir.
SpinButton nedir ve nereye eklenir
SpinButton kendi başına bir sayı göstermez; yalnızca Value özelliğindeki değeri değiştirir. Değeri kullanıcıya göstermek için yanına bir TextBox ya da Label koymanız veya denetimi bir hücreye bağlamanız gerekir.- UserForm üzerine: VBA düzenleyicisinde formu açın, Görünüm > Araç Kutusu (View > Toolbox) ile araç kutusunu görüntüleyin ve Çevirme Düğmesi simgesini forma sürükleyin.
- Çalışma sayfasına: Geliştirici > Ekle > ActiveX Denetimleri > Çevirme Düğmesi (Developer > Insert > ActiveX Controls > Spin Button) yolunu izleyin. Geliştirici sekmesi görünmüyorsa Dosya > Seçenekler > Şeridi Özelleştir (File > Options > Customize Ribbon) bölümünden etkinleştirin.
- Form denetimi seçeneği: Aynı menüde Form Denetimleri (Form Controls) altında da bir çevirme düğmesi vardır. Bu denetim olay yordamı kullanmaz; sağ tık > Denetimi Biçimlendir (Format Control) penceresinden en küçük değer, en büyük değer, artım değişikliği ve hücre bağlantısı ayarlanır. Bu sayfadaki özellik ve olaylar ActiveX SpinButton içindir.
ActiveX denetimini sayfada düzenlemek için Geliştirici > Tasarım Modu (Developer > Design Mode) açık olmalıdır; denetimi çalıştırmak için bu modu kapatın.
Önemli özellikler
- Value: Denetimin geçerli değeridir. Her zaman Min ile Max arasında olmalıdır; bu aralığın dışında bir değer atamak çalışma zamanı hatası verir. Varsayılanı 0'dır.
- Min: Value'nun alabileceği en küçük değerdir; varsayılanı 0'dır.
- Max: Value'nun alabileceği en büyük değerdir; varsayılanı 100'dür.
- SmallChange: Bir ok tıklamasında Value'nun değişeceği miktardır; varsayılanı 1'dir. Denetim yalnızca tam sayılarla çalışır, ondalık adım kullanılamaz.
- Orientation: Okların yönüdür. fmOrientationAuto (-1, varsayılan) denetimin genişlik ve yüksekliğine göre yönü kendisi seçer; fmOrientationVertical (0) dikey, fmOrientationHorizontal (1) yatay yerleşim verir.
- Delay: Ok basılı tutulduğunda değerin tekrar değişme hızını milisaniye cinsinden belirler; varsayılanı 50'dir.
- LinkedCell: Yalnızca sayfadaki denetimde bulunur (OLEObject üzerinden ayarlanır). Value değerini belirtilen hücreyle eşler; örneğin "C2".
- Enabled: False yapılırsa denetim tıklamalara yanıt vermez.
- Name, Visible, TabStop, ControlTipText: Kod içindeki adı, görünürlüğü, sekme sırasına katılmasını ve fare üzerine gelince çıkan ipucunu belirler.
Önemli yöntemler ve olaylar
En sık kullanılan olay Change olayıdır; Value değiştiğinde tetiklenir. Kod ile Value değiştirildiğinde de çalışır. Ok tıklamasına özel tepki vermek için SpinUp (yukarı ok) ve SpinDown (aşağı ok) olayları kullanılır. Yöntem olarak SetFocus odağı denetime verir, Move denetimi konumlandırır.Olay yordamı nereye yazılır: UserForm üzerindeki denetimin olayları o formun kod penceresine yazılır (forma çift tıklayın ya da F7 tuşuna basın). Sayfadaki ActiveX denetiminin olayları ise denetimin bulunduğu sayfanın kod modülüne yazılır; denetime tasarım modunda çift tıklamak doğru yordamı oluşturur. Standart modüle yazılan olay yordamı çalışmaz.
VBA
11 satır
Private Sub SpinButton1_Change()
' Value degistiginde calisir
End Sub
Private Sub SpinButton1_SpinUp()
' Yukari ok tiklandiginda calisir
End Sub
Private Sub SpinButton1_SpinDown()
' Asagi ok tiklandiginda calisir
End Sub
Denetime kodla erişmek için UserForm içinde doğrudan SpinButton1.Value yazılır. Sayfadaki denetim için Sheets("Sayfa1").SpinButton1.Value ya da OLEObjects("SpinButton1").Object.Value kullanılır.
1. UserForm içinde SpinButton ile metin kutusunu eşleme
Bir UserForm hazırlayın ve üzerine SpinButton1, TextBox1 ve CommandButton1 denetimlerini yerleştirin. Aşağıdaki yordamları bu formun kod penceresine yapıştırın (standart modüle değil). Denetim 0 ile 100 arasında 5'er 5'er değişir; metin kutusuna elle sayı yazılırsa denetim de güncellenir. Düğme, seçilen adedi Sipariş Formu sayfasındaki B2 hücresine yazar.
VBA
36 satır
Option Explicit
Private Sub UserForm_Initialize()
' Denetimin sinirlarini ve adimini ayarla
With SpinButton1
.Min = 0
.Max = 100
.SmallChange = 5
.Value = 10
End With
TextBox1.Text = SpinButton1.Value
End Sub
Private Sub SpinButton1_Change()
' Oklara basildiginda metin kutusunu guncelle
TextBox1.Text = SpinButton1.Value
End Sub
Private Sub TextBox1_AfterUpdate()
' Elle yazilan deger gecerliyse denetime aktar, degilse eski degere don
If IsNumeric(TextBox1.Text) Then
If CDbl(TextBox1.Text) >= SpinButton1.Min And CDbl(TextBox1.Text) <= SpinButton1.Max Then
SpinButton1.Value = CLng(TextBox1.Text)
Else
TextBox1.Text = SpinButton1.Value
End If
Else
TextBox1.Text = SpinButton1.Value
End If
End Sub
Private Sub CommandButton1_Click()
' Secilen adedi sayfaya yaz
Worksheets("Sipariş Formu").Range("B2").Value = SpinButton1.Value
Unload Me
End Sub
SpinButton
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Ürün | Adet |
| 2 | Defter | |
| 3 | Kalem |
Sipariş FormuExcelDepo v1.0.0
2. Sayfaya SpinButton ekleyip özelliklerini okuma
Makro, etkin sayfaya kodla bir ActiveX SpinButton ekler; Min, Max, SmallChange ve Value özelliklerini ayarlar, değerleri B sütununa yazar ve ardından denetimi siler. Kodu standart bir modüle yapıştırın ve SpinOzellikleriniYaz makrosunu çalıştırın.
VBA
31 satır
Option Explicit
Sub SpinOzellikleriniYaz()
Dim ws As Worksheet
Dim ob As OLEObject
Set ws = ActiveSheet
' Sayfaya ActiveX SpinButton ekle
Set ob = ws.OLEObjects.Add(ClassType:="Forms.SpinButton.1", _
Left:=200, Top:=10, Width:=20, Height:=40)
With ob.Object
.Min = 1 ' En kucuk deger: Ocak
.Max = 12 ' En buyuk deger: Aralik
.SmallChange = 1 ' Her tiklamada 1 adim
.Value = 3 ' Baslangic degeri
' Ozellikleri sayfaya yaz
ws.Range("B2").Value = .Min
ws.Range("B3").Value = .Max
ws.Range("B4").Value = .SmallChange
ws.Range("B5").Value = .Value
End With
' Value degerine karsilik gelen ay adini yaz
ws.Range("B6").Value = MonthName(ob.Object.Value)
' Denetimi sil
ob.Delete
End Sub
SpinButton
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Özellik | Sonuç |
| 2 | Min | 1 |
| 3 | Max | 12 |
| 4 | SmallChange | 1 |
| 5 | Value | 3 |
| 6 | Ay adı | Mart |
Ay SeçimiExcelDepo v1.0.0
3. LinkedCell ile SpinButton değerini hücreye bağlama
Makro, sayfaya bir SpinButton ekler ve LinkedCell özelliğiyle C2 hücresine bağlar. Value değiştikçe C2 güncellenir ve D2'deki tutar formülü yeniden hesaplanır. Kodu standart bir modüle yapıştırıp SpinBagliHucre makrosunu çalıştırın.
VBA
28 satır
Option Explicit
Sub SpinBagliHucre()
Dim ws As Worksheet
Dim ob As OLEObject
Set ws = ActiveSheet
' Sayfaya SpinButton ekle
Set ob = ws.OLEObjects.Add(ClassType:="Forms.SpinButton.1", _
Left:=300, Top:=10, Width:=18, Height:=30)
' Sinirlari ve adimi ayarla
With ob.Object
.Min = 0
.Max = 20
.SmallChange = 2
End With
' Denetimi C2 hucresine bagla (LinkedCell OLEObject uzerinden ayarlanir)
ob.LinkedCell = "C2"
' Value degistiginde bagli hucre de guncellenir
ob.Object.Value = 4
' Denetimi sil; C2 icindeki deger kalir
ob.Delete
End Sub
SpinButton
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Birim Fiyat | Adet | Tutar |
| 2 | Defter | 18,50 | 4 | 74,00 |
| 3 | Kalem | 7,25 | 10 | 72,50 |
| 4 | Silgi | 3,00 | 25 | 75,00 |
Bağlı HücreExcelDepo v1.0.0
Kullanırken dikkat edin
- Value aralık dışına atanamaz: Value özelliğine Min'den küçük ya da Max'tan büyük bir değer atarsanız çalışma zamanı hatası oluşur. Önce Min ve Max değerlerini, sonra Value değerini ayarlayın; dışarıdan gelen verileri atamadan önce kontrol edin.
- Yalnızca tam sayılarla çalışır: SpinButton ondalık değer üretmez. 0,1 adımlı bir seçim istiyorsanız Min, Max ve Value değerlerini 10 ile çarpıp tam sayı olarak kullanın, gösterirken 10'a bölün.
- Değeri göstermek sizin göreviniz: Denetim üzerinde sayı görünmez. Değeri bir TextBox, Label ya da LinkedCell ile gösterin. Metin kutusuna elle girişe izin veriyorsanız, değeri denetime aktarmadan önce IsNumeric ve aralık kontrolü yapın.
- Olay yordamı doğru modülde olmalı: UserForm denetiminin olayları formun kod penceresinde, sayfadaki ActiveX denetiminin olayları o sayfanın kod modülünde bulunmalıdır. Standart modüle yazılan SpinButton1_Change yordamı hiçbir zaman tetiklenmez. Sayfadaki denetimin çalışması için Tasarım Modu'nun kapalı olması gerekir.
- Change olayında döngüye dikkat: Change olayı içinde Value değerini yeniden değiştirirseniz olay tekrar tetiklenir. Metin kutusunu eşlerken Change yerine AfterUpdate gibi olayları kullanmak, istenmeyen tekrarları önler.
- Form denetimi ve ActiveX farkı: Form Denetimleri altındaki çevirme düğmesi makroya atanabilir ve ControlFormat nesnesiyle ayarlanır; ActiveX SpinButton ise olay ve özellik zenginliği sunar. ActiveX denetimleri Excel'in Mac sürümlerinde desteklenmez; taşınabilir bir çözüm gerekiyorsa Form denetimini düşünün.
- İlgili konular:
- ScrollBar: Büyük aralıklarda kaydırma çubuğu ile değer seçme
- TextBox, Label, CommandButton: SpinButton ile birlikte kullanılan UserForm denetimleri
- UserForm: Denetimleri barındıran form nesnesi ve Initialize olayı
- OLEObjects: Sayfadaki ActiveX denetimlerine kodla erişim ve ekleme
- LinkedCell: Denetimi hücreye bağlama
- Shapes.AddFormControl: Kodla form denetimi ekleme
- Worksheet_Change: Hücre değişimini izleyen sayfa olayı
- IsNumeric: Metin kutusu girişini doğrulama
- ARA ve İNDİS: Seçilen değere göre listeden veri çeken işlevler