Bu siteye giriş yaparak Çerez kullanımını kabul etmiş oluyorsunuz. İşbu sitede; çerez olarak, sadece son giriş tarihiniz ve eğer üye olursanız oturum statünüz tutulacaktır. Bunlar dışında başka hiçbir bilgi tutulmamaktadır. Çerezler için detaylı bilgi için buraya tıklayınız.
ANLADIM

DUYURULAR

Yeni eklenen ve/veya güncellenen sayfaları görmek için buraya tıklayınız.

Güncel ödev ve test listesini görmek için buraya tıklayınız.

Sitede yapılan iyileştirmeAer ve hata düzeltmelerine ait tüm bilgilendirmeleri görmek içinburaya tıklayınız.

Baş
Udemy
Konular
Son
Konular
Temeller
Formlar
VBAMakro
VBAMakroFormlar1

Temeller

Bu bölümde küçük bir UserForm yaratıp, üzerine bikaç temel kontrol koyacağız. Form eventlerini ve Form özelliklerini inceleyeceğiz.

Giriş

Formlar

Kullanıcımızla iletişim kurmak istediğimizde bazen mesaj kutuları veya inputboxlar yetersiz kalabilmekte. İşte o zaman UserFormları kullanma zamanı gelmiştir. Tabi, bunların tek amacı iletişim kurmak değil. Daha genel amaçlı işler için de kullanılabilir. Örnek olarak;

  • Veri Kayıt Arayüzleri

  • Grafikler için ek fonksiyonalite

  • Senaryo toolları

  • Dosya Erişim arayüzü(Kokpit arayüzü)

  • Dashboardlar(Kontrol panelleri)

  • v.s

Bu arada her ne kadar öyle olmadığını bilsek de worksheetler de form olarak düşünülebilir, zira bu 'form' üzerine çeşitli form kontrolleri konulabilmektedir. O halde, formları, üzerine kontrol konan ve bu kontrollerle çeşitli etkileşimlerde bulunduğumuz arayüzler olarak düşünebiliriz.

Kontroller

Programlama camiasına aşina değilseniz, kontrol kelimesini, birşeyleri kontrol etmeye yarayan nesneler olarak düşünebilirsiniz. Ancak bunlar, formlar üzerindeki görsel nesnelerden başka birşey değildir. Button(Tıklanır düğme), Listbox(liste kutusu), Combobox(açılır liste kutusu) vb.

Bunları, bi makro çalıştırmak, bir hücre grubundaki değerleri liste kutusuna aktarmak, liste kutusundaki değerleri bi hücre grubuna yazdırmak, bir hücreyi seçmek, bir hücrenin değerini 1'er 1'er artırıp azaltmak gibi  amaçlarla kullanırız.

Kontrollerin detaylarına bir sonraki sayfada değineceğiz. Aşağıda ise bazısını küçük bir örnekte kullanacağız.

Form Eventleri(Olayları)

Buraya kadar sırayla okuyarak geldiyseniz, olaylar hakkında bilgi sahibi olmuşsunuz demektir. Eğer bilginiz yoksa, şuradan temel bilgileri aldıktan sonra tekrar buraya gelmenizi tavsiye ederim.

Formların kendisi dahil olmak üzere tüm kontrollerin kendine has eventleri vardır. Düğmeye tıklanması için Click eventi, bir listenin güncellenmeden öncesi ve sonrasını gösteren BeforeUpdate, AfterUpdate eventleri gibi. Bunların detaylarnı yine sonraki sayfada ele alacağız.

Dikkat:Eventler konusunda gördüğümüz Application.EnableEvents=False atama işleminin Userform ve Kontrol eventleri üzerinde bir etkisi yoktur.

Basit bir UserForm oluşturma

Şimdiye kadar konuları sırayla takip ettiyseniz çoğunlukla Insert Module diyip kodları standart modüller içine yazdığımızı görmüşsünüzdür. Eventleri ele aldığımız sayfalarda ise sheet ve workbook nesneleri içine de kod yazmıştık. Şimdi ise bir başka nesne olan UserFormların içine kod yazmaya geldi sıra.

Formu oluşturma aşamaları

  • Kendinize yeni bir dosya yaratın.
  • VBE'e geçin ve Project peceresinde Modüllere sağ tıklayıp Insert diyin, sonra da Userform seçin.
  • Karşımıza içi boş bir form gelecektir ve Control ToolBox otomatikman açılacaktır, açılmazsa menüden kendiniz açın. Sonra da toolboxtan aşağıdaki nesneleri formun üzerine sürükleyin ve bırakın: Bi tane commandbutton, bi label, bi textbox, bir de combobox.
UserForm1

Hemen bu noktada isimlendirme standardından bahsedeyim. Properties penceresinden, Form nesnenisinin Name özelliğini frmDeneme olmak üzere diğer nesneleri de sırayala cmdRun, lblMesaj, txtMesaj, cbYıl olarak değiştirin. (Formun özelliklerine erişebilmek için formda boş bir yere tıklamanız yeterlidir.) Böylece kod yazarken nesnelere daha kolay referansta bulunabilirsiniz, özellikle formunuzun üzerinde birçok kontrol olacaksa. Buradaki standart şudur: Kontrolün tipinin 2-3 karakterlik bir kısaltması, sonra da anlamlı bir isim.

Ayrıca Form'un, CommandButton'un ve Label'ın Caption özellikleriyle TextBox ve ComboBox'ın Text özelliklerine de anlamlı bir ifade verelim.

Farkettiyseniz, birçok form ve web uygulamasında olduğu gibi grileştirilmiş metinle kullanıcıya "ipucu/talimat/açıklama içeren mesaj verme" tekniğini kullandım.

Formu Çalıştırma

Formunuzun o an itibarıyle Canlı'da nasıl göründüğünü görmek için Form seçiliyken F5 vey yeşil Play tuşuna basabilirsiniz. Bu yöntem developer olan kişinin Form çalıştırma yöntemidir. (Şuan bunu yapabilirsiniz ama bu haliyle bir işe yaramayacaktır. Birazdan formumuz biraz daha işlevsel hale getireceğiz.)

Ama öncesinde formu nihai kullanıcının çalıştıracağı yöntemlere bakalım. Kullanıcılar,

  • Bir Worksheet butonuna
  • Bir ActiveX butonuna
  • Bir Add-in'deki butona
  • Ribbona/QAT'ye yerleştirilen bir makro butonuna

bastıklarında Formlar açılırlar. Biz basit ve sık kullanılan bir yöntem olması adına bir Worksheet butonuna tıklandığında aktive edecek kodu yazalım. ActiveX'teki mantık da aynı olacaktır. Sonraki sayfada ActiveX kontrollerin detayını göreceğiz.

Şimdi sayfamıza bir buton ekleyelim. Ekleyince çıkan dialog kutusunda New'e tıklayalım ve otomatik açılan modüle aşağıdaki kodu yazalım

Sub Button1_Click()
   frmDeneme.Show
End Sub

Evet düğmemizin adını değiştirdikten sonra tıklayalım ve Formumuzu açalım.

FormAç

Modal vs Modeless seçenekleri ile sayfa erişimi

Form bu şekilde açıldığında arkadaki sayfaya erişimimiz engellenmiştir. Sayfayla Form arasında serbest geçiş yapabilmek istiyorsam formu ya Design aşamasında properties'ten Modeless(ShowModal=False) tanımlarım ya da Button1'e tıkladığımda Runtime sırasında Modeless açılmasını sağlarım.

Design sırasında

Runtime sırasında
Sub Button1_Click()
	frmDeneme.Show vbModeless
End Sub

Design modundayken Modeless tanımlanmış bir formu duruma göre modal açmak için ise aşağıdaki kodu yazarız.

Sub Button1_Click()
	frmDeneme.Show vbModal
End Sub

UserForm başlangıç ayarları

Bir form ilk açıldığında çeşitli başlangıç ayarları yapmak iyi bir fikirdir. Bunu formların Initialize eventi ile yapıyoruz. Web sitesi tasarlayanlar bilir, bu biraz javascripitin onload veya ASP'nin Page_Load veya .Net formlarındaki Form_Load eventlerine benzer.

Bunun için forma sağ tıklayıp View Code deyin. Açılan kod sayfasında formu seçince ilk etapta click eventi gelecektir. Siz Initialize eventini seçip Click eventini de silin.

Mesela, formumuz açıldığında cbYıl combobox'ını dolduralım. Şimdi aşağıdaki kodu yazalım.(Detay açıklamalara sonraki Kontroller sayfasında gireceğiz)

Private Sub UserForm_Initialize()
    cbYıllar.List = Array("2017", "2018", "2019")
End Sub

ComboBox'tan seçim yapılacağı sırada da gri olan bilgilendirme yazısı yok olup yılların rengi de siyaha dönsün istiyoruz diyelim.

Private Sub cbYıllar_DropButtonClick()
    cbYıllar.ForeColor = vbBlack
    cbYıllar.Text = ""
End Sub

Bunun dışında yine çeşitli başlangıç değeri atamaları, kutuların temizlenmesi, varsa statik değişken tanımlamaları v.s bu event içinde yapılabilir.

Formları Gizleme ve Kapama

Bazen bir formu geçici olarak gizlemek bazen de tamamen kapatıp başka bir form açmak isteriz. Bunlar için ihtiyacımız olan kodlar şöyle:

Me.Hide 'o an aktif olan formu gizler
Form1.Hide 'Form1i gizler

Unload Me 'aktif formu kapatır
Unload Form1 'Form1'i kapatır

Bir formu kapatmak için sağ üstteki X düğmesine de basılabilir tabiki ama Unload fonksiyonu daha çok kapatma işleminin arkasından başka bir iş(ler) yapmak(mesela başka bir formu açmak) istediğimiz zamanlarda kullanılır.

Gizlediğimiz bir formu tekrar aktive etmek için yine Show metodu kullanılır, yani bir Load fonksiyonu bulunmamaktadır. Özetle elimizdekiler şöyle: İlk kez açma ve yeniden gösterme için Show metodu, gizleme için Hide metodu, kapatma için Unload fonksiyonu.

Esc tuşu ile çıkış

ESC tuşuyla çıkış yapmak isterseniz, Form üzerinde bir buton koyun ve bunun Cancel özelliğine True atayın. Bu sayede Esc tuşuna basıldığında bu düğme odağı almış olur, yani sanki seçilmiş gibi olur, ki bu da Enter eventini tetikler. Şimdi ikinci olarak bu düğmenin Enter eventine formu kapatan kodu yazalım.

Private Sub CommandButton3_Enter()
  Unload Me
End Sub

NOT: Modal formlarda, bir form ilk kez açıldığında önce Initialize sonra Activate eventleri meydana gelir. Sonra bu form gizlenip tekrar açıldığında sadece Activate meydana gelir. Modeless formlarda ise, Initializedan sonra Activate meydana gelmez, iki modeless forma arasında gidip gelince veya gizli olan bir modeless form tekrar gösterildiğinde meydana gelir. Eğer ki yeniden aktive olma durumlarına yaptırmak istediğiniz bir işlem varsa, bu ayrıma dikkat etmelisiniz.


Evet, Formlara kısa bir giriş yaptıktan sonra artık formlar üzerindeki kontrollerin detaylı kullanımına geçebiliriz.

TEST SORULARI

Son Sorumuz şuymuş:Bir metindeki tüm noktaları yoketmek istiyorsunuz. Hangi fonksiyonu kullanırdınız?
Soru:

A şıkkı:

B şıkkı:

C şıkkı:

D şıkkı:

Doğru Cevap Etiketler

İlişkili konuyu seç

16021

Label
* Sorulara verilen yanlış cevaplardaki esprili yorumlarım için hoşgörünüze sığınıyorum.
* Test ve Ödevlerdeki bazı detaylar burada anlatılmamış olabilir. Bunları kendiniz araştırıp bulmalısınız.
* Birden çok konuya ait içeriği olan ödevler var. Algoritmik açıdan bakıldığında o an en uygun konuya adreslenmiştir.
Dikkat! Bir soruya cevap verdikten sonra geri dönemezsiniz.
2
0
0
0

Soru No:77. Bir userform aşağıdakilerden hangisiyle kalıcı olarak kapatılır?





ÖDEVLER

0
0
ÖdevNo:... Şu an için bu konu için ödev bulunmamaktadır. İletişim menüsünden örnek ödev sorularını bana iletebilirsin.
Çözüme bakın(Başka türlü de çözülebilir tabi, bu benim çözümüm.)




=YORUMLAR ve SORULAR=


DEVİR UYARISI

Herkese merhaba. Hosting maliyetlerinin aşırı artması yüzünden sitemi yakın zamanda(en geç Mayıs 2023) kapatmaya karar vermiştim. Ancak, siteyi yakından takip eden bir arkadaş siteyi devralmak istemiştir. Siteyi, Mayıs ayında kendisine devir etmeye karar verdim. Üyelik bilgilerini bana güvenerek girdiğiniz için, hepsini silmiş bulunuyorum, yani mail adreslerinizi kimseyle paylaşmamış olacağım. Bilginizi rica ederim.