Kontroller (Controls) her türlü özelliğe ve bunlarla ilişkili birçok olaya sahiptir, ancak şimdilik VBA üzerinde programlamada kullanılan yalnızca birkaçına bakacağız.
3 kontrol ekleyerek başlayalım: Label, TextBox ve CommandButton:
Aşağıdaki sonucu elde etmek için bu kontrolün adını ve özelliklerini düzenleyin (metni içeren Caption özelliğini kullanarak):
Şimdi numarayı girip Tamam'a tıkladığımızda hiçbir şey olmuyor.
Action oluşturmak için metin kutusundan girilen değeri A1 hücresine yazacak ve Formu kapatacak bir event ekleyeceğiz.
Aşağıda gösterilen seçeneklere kontrole çift tıklayarak erişebilirsiniz:
Bu açılır liste çeşitli kontrolleri ve bu Formu içerir.
Düğmeyi (Düğme) ve Click olayını seçin:
Private Sub CommandButton_validate_Click() Range("A1") = Textbox_number.Value 'Metin kutusu_numarası metin kutusunun adıdır 'Value metin kutusunun değerini içeren bir özelliktir Unload Me 'Kaldırma formu kapatır (UserForm) 'Form adı yerine Me kullanıyoruz (çünkü bu kod kapatmak istediğimiz UserForm'ın ortasındadır) End Sub
Girilen değer artık bu Formu kapatmadan önce A1 hücresine kaydedilmiş olacaktır (UserForm).
İkinci bir başlık (Label) ekleyin ve şu özellikleri düzenleyin: Caption, Forecolor (renk: kırmızı) ve Visible (Varsayılan kontrolü gizlemek için False):
Şimdi metin alanındaki değer kullanıcı tarafından değiştirildiğinde tetiklenecek bir olay ekleyelim. Değer sayısal değilse olay bir hata mesajı görüntüler.
Private Sub Textbox_number_Change() If IsNumeric(Textbox_number.Value) Then 'IF sayısal bir değerdir... Label_error.Visible = False 'Başlık (Label) gizli Else 'AKSİ TAKDİRDE... Label_error.Visible = True 'İsim görüntüleniyor End If End Sub
Girilen değer, bir sonraki karakterin her girilmesinde test edilecektir.
Yine de forma girilen değerlerin doğrulanmasını (doğrulanmasını) eklememiz gerekiyor. Değer bir sayı değilse bir mesaj göstereceğiz:
Private Sub CommandButton_validate_Click() If IsNumeric(Textbox_number.Value) Then 'IF sayısal bir değerdir... Range("A1") = Textbox_number.Value 'A1'e kopyala Unload Me 'kapatıyorum Else 'AKSİ TAKDİRDE... MsgBox "Incorrect value" 'geçersiz değer End If End Sub
Hata mesajı olmadığında formun sağ tarafını boş bırakmamak için bu formun Width özelliğini ayarlayarak boyutunu küçültebiliriz:
Private Sub Textbox_number_Change() If IsNumeric(Textbox_number.Value) Then 'IF sayısal bir değerdir... Label_error.Visible = False 'Başlık (Label) gizli Me.Width = 156 'Form genişliği Else 'AKSİ TAKDİRDE... Label_error.Visible = True 'İsim görüntüleniyor Me.Width = 244 'Form genişliği End If End Sub
Excel dosyasını şu örnekle indirebilirsiniz: userform1.xls
İşte sonuç:
CheckBox'ın nasıl kullanılacağına dair bir örnek:
Onay kutusu işaretlendiğinde/işareti kaldırıldığında, ilişkili hücrenin değeri Click olayı kullanılarak değiştirilebilir:
Private Sub CheckBox1_Click() '1 numara If CheckBox1.Value = True Then 'EĞER seçilirse... Range("A2") = "Checked" Else 'EĞER SEÇİLMEZSE... Range("A2") = "Unchecked" End If End Sub Private Sub CheckBox2_Click() '2 numara If CheckBox2.Value = True Then 'EĞER seçilirse... Range("B2") = "Checked" Else 'EĞER SEÇİLMEZSE... Range("B2") = "Unchecked" End If End Sub Private Sub CheckBox3_Click() '3 numara If CheckBox3.Value = True Then 'EĞER seçilirse... Range("C2") = "Checked" Else 'EĞER SEÇİLMEZSE... Range("C2") = "Unchecked" End If End Sub
Bu örnekte, Form ilk kez açıldığında onay kutularının işareti kaldırılmıştır.
Karşılık gelen hücrenin değeri "Checked" ("Checked") olduğunda her onay kutusunu işaretlemek için, UserForm_Initialize kullanarak form etkinleştirme kontrolünü çalıştıracağız:
Private Sub UserForm_Initialize() 'İşaretliyse If Range("A2") = "Checked" Then CheckBox1.Value = True End If If Range("B2") = "Checked" Then CheckBox2.Value = True End If If Range("C2") = "Checked" Then CheckBox3.Value = True End If End Sub
Burada tamamlanmış Excel dosyasında bir örnek görebilirsiniz: userform2.xls
Seçenek düğmelerini (Option Buttons veya bazen Radio Buttons olarak da adlandırılır) kullanırken, kullanıcının aynı anda birden fazla kutuyu işaretleyebildiği onay kutularının aksine kullanıcı "grup" başına yalnızca bir seçeneği seçebilir.
Bir "grup" oluşturmak için önce Frame ve ardından OptionButton ekleyin:
Burada tamamlanmış Excel dosyasında bir örnek görebilirsiniz: userform3.xls
Formu gönderirken, seçilen sütun adı (column_value) ve satır (row_value) ile ilişkili hücreye veriler girilecektir.
Hangi seçeneklerin seçildiğini bilmek için önceki örnektekinin aynısını yapabiliriz (onay kutularıyla), ancak kod boyutunu azaltmak için bir döngü kullanacağız.
Daha önce ele almadığımız bir döngü türü olan For Every döngüsünü kullanacağız. Bu döngü, bir "nesne grubu"ndaki her nesne için talimatları yürütmenize olanak tanır:
Private Sub CommandButton1_Click() Dim column_value As String, row_value As String 'Her Frame_column kontrolü için döngü For Each column_button In Frame_column.Controls 'Kontrol değeri = Doğru ise (eğer seçilirse) ... If column_button.Value Then '"column_value" değişkeni düğme metni değerini alır column_value = column_button.Caption End If Next 'Başka bir blok için döngü For Each row_button In Frame_row.Controls If row_button.Value Then row_value = row_button.Caption End If Next Range(column_value & row_value) = "Cell chosen!" '"Hücre seçildi!" 'Formu kapatın (Boşaltın) (Ben) Unload Me End Sub
Formumuz artık "Hücre seçildi!" değerini giriyor. seçilen hücrede.
Hatayı önlemek için kullanıcının iki seçenek kümesinden doğru seçim yapıp yapmadığını kontrol etmemiz gerekir.
Bu örnekte, form henüz tamamlanmadığında Onayla düğmesi ("Confirm") gri renkte (devre dışı) olacaktır. Bu en kolay çözüm değil, ancak bir formun ortasında işlevlerin/prosedürlerin neden yararlı olduğuna dair iyi bir örnek (UserForm).
Düğmeyi devre dışı bırakmak için metni ve Etkin özelliğini düzenleyin.
Sonuç aşağıdaki gibi olacaktır:
Önceki kodda, seçenek düğmelerinin (Option Buttons) değerlerini almak için iki adet For Every döngüsü kullandık. Şimdi Onay düğmesi ("Confirm") ve on seçenek için Click olayı için aynı değerleri kullanmamız gerekiyor.
Bunu yapmak için her olaya ait döngüleri kopyalamamıza gerek yok, onları bir fonksiyon aracılığıyla çağıracağız.
Önceki kodla başlayıp onu değiştirerek şu sonuca ulaşacağız:
Private Function column_value() 'Seçilen düğme için metin değeri döndüren işlev (column_value) For Each column_button In Frame_column.Controls If column_button.Value Then column_value = column_button.Caption End If Next End Function Private Function row_value() 'Seçilen düğme için metin değeri döndüren bir işlev (row_value) For Each row_button In Frame_row.Controls If row_button.Value Then row_value = row_button.Caption End If Next End Function Private Sub CommandButton1_Click() 'Tıkladığınızda gerçekleşen eylem ("Seçiminizi onaylayın") Range(column_value & row_value) = "Cell chosen!" '"Hücre seçildi!" 'column_value ve row_value bu işlevler tarafından döndürülen değerlerdir Unload Me End Sub
Yapmamız gereken tek şey, seçenek düğmelerinin doğru seçilip seçilmediğini kontrol eden (iki işlevi çağırarak) ve gerektiğinde o düğmeyi etkinleştiren bir prosedür oluşturmaktır.
Yine, her radyo düğmesinin her olayı için kodun 10 kez kopyalanmasını önlemek amacıyla doğrulama ayrı bir prosedürle yapılır:
Private Sub activate_button() 'Koşul başarılı bir şekilde test edilirse düğmenin etkinleştirilmesi If column_value <> "" And row_value <> "" Then 'column_value ve row_value bu işlevler tarafından döndürülen değerlerdir CommandButton1.Enabled = True CommandButton1.Caption = "Confirm your selection" '"Seçiminizi onaylayın" End If End Sub Private Sub OptionButton11_Click() activate_button '"Active_button" prosedürünü başlatıyoruz End Sub Private Sub OptionButton12_Click() activate_button End Sub Private Sub OptionButton13_Click() activate_button End Sub Private Sub OptionButton14_Click() activate_button End Sub Private Sub OptionButton15_Click() activate_button End Sub Private Sub OptionButton16_Click() activate_button End Sub Private Sub OptionButton17_Click() activate_button End Sub Private Sub OptionButton18_Click() activate_button End Sub Private Sub OptionButton19_Click() activate_button End Sub Private Sub OptionButton20_Click() activate_button End Sub
Burada tamamlanmış Excel dosyasında bir örnek görebilirsiniz: userform3b.xls