30.09.2018 tarihinde Excel bölümüne Dış Verilerle çalışmak sayfası eklenmiştir

04.08.2018 tarihinde VBA bölümüne ObjelerDünyası sayfası eklenmiştir

25.07.2018 tarihinde VBA bölümüne Outlook programlama sayfası eklenmiştir

13.07.2018 tarihinde VBA bölümüne Formlar-Kontroller sayfası eklenmiştir

25.05.2018 Hosting şirketi dğeiştirmekten kaynaklı bir hata nedeniyle Excelent add-ini indirirken hata alınmaktaydı. Bu hata düzeltilmiştir. İki ayrı download alternatifi sunulmuştur. Kurumunuzun BT politikalarının veya şahsi PC’nizdeki güvenlik ayarlarının izin vermesi durumunda yöntemlerden biriyle kurulum yapabilmelisiniz. Bi sorun olursa bana iletebilirseniz sevinirim.

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şm kurmak istediğimizde bazen mesaj kutuları veya inputboxlar yetersiz kalabilmekte. İşte o zaman UserFormları kullanma zamanı gelmiştir. Tabi, bunların tek amacı iletişm 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üşünebilirz.

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 atamasının 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-indeki 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ıkalyalım ve Formumuzu açalım.

FormAç

Modal vs Modeless seçenekleri ile sayfa erişimi

Form bu şekilde açılıdığı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 eventin 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şak bir forma 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, arkasından başka bir iş yapmak(mesela başka bir fomru 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çılıdığı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 olanbir modelss forma tekrar gösterildiğinde meydana gelir.Eğer ki yeniden aktive olma duurmları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.

YORUMLAR