TOP

VBA-Ders 12.2. Kontroller (Controls)

YouLibreCalc for Excel logo

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ç:

Checkboxes

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üğmeleri (Option Buttons)

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