Forum Renkli - Türkiye`nin En Renkli Eğlence ve Bilgi Paylaşım Platformu  



"Taklitler, Asıllarını yaşatırmış."
Go Back   Forum Renkli - Türkiye`nin En Renkli Eğlence ve Bilgi Paylaşım Platformu > Teknoloji > Bilgisayar ve Donanım > Microsoft Office > Excel
Ücretsiz Kayıt ol veya Üye Girişi yapın.
Excel Microsoft Office Excel hakkındaki tüm bilgi ve paylaşımları bu bölümde bulabilirsiniz.

Forum Renkli - Türkiye'nin En Renkli Eğlence ve Paylaşım Platformuna Hoşgeldiniz.
Forum Renkli'ye Hoşgeldiniz. Forumumuza ücretsiz KAYIT olarak, forumumuzda bilgi alışverişi yapabilir ve aramıza katılıp samimi dostluklar kurabilirsiniz.

Forumumuzda bizimle birlikte paylaşıma katılmak için buradan üye olabilirsiniz.



veya Facebook üyeliğiniz ile sitemize kayıt olabilirsiniz.
Etiketli Üyeler Listesi

Like Tree3Kişi Beğendi
  • 3 Post By Ze.uL
Yeni Konu Aç Cevap Yaz
 
LinkBack Seçenekler Stil
Alt 17 Nisan 2013, 15:38   #1 (permalink)
Rock★staR

Ze.uL - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: 12 Ekim 2012
Nerden: Antalya
(Mesajlar): 2.495
(Konular): 387
Burç:
Renkli Para : 430357
Aldığı Beğeni: 706
Beğendikleri: 169
Ruh Halim: Huzurlu
Takım :
ÖdülleriÜye Ödülleri: 2
Oscar Ödülü Oscar Ödülü 
Standart Userform Oluşturma - Resimli Anlatım

Userform oluşturmadan önce yaplması gerekenler;

1- Programın amacı ve kullanım sistemi (Input-Output)
2- VT tercihi ve tablo tasarımı ve ilişkilendirme
3- Arayüz tasarımı
4- Programlama

1. Veritabanı Nedir?

"VT" dememizin nedeni uzun uzun "VERİ TABANI" diye yazmaya üşenmemizdir.
Peki; "nemenem şeydir bu VT?" derseniz, bizim projeye özel bir açıklama yapalım o zaman ...

Şimdi, farzedinki, cebinize sığamayacak kadar çok paranız var ... Düşündünüz taşındınız. Bu parayı ne yapayım diye ... Normalde, bugün itibari ile yedi sülaleme yeter kanaatine vardınız ama ... Ekonomi de kötüye gidiyor ve paranız durduk yerde mum gibi eriyor...

Dolar, EURO yapayım dediniz, yok "mortgage krizi", yok "AB süreci" derken ne olacağı belirsiz ... Borsaya gireyim dediniz, Amazonda bir kelebeğin kanat çırpışından sallandığını gördünüz ... Repo iç açıcı değil, ticaretten de anlamıyorsunuz. Nihayetinde; bir gün aksakallı dedeye kanarak dediniz ki : "Dünyada mekan, Ahirette iman"

Bir apartman inşa etme kararı aldınız diyelim. (Fena fikir değil, parası olana...)
Şimdi ilk düşüneceğiniz şey, apartmanımızın duvarına asacağımız, tablolar veya yatak odasındaki gömme dolap veyahut banyoya jakuzi değil ...
Daha önceden bir arsamızın var olduğu kabulü ile ... Bu arsaya, dikilecek apartmanın planı önemli ... Kaç m2 daireler olacak, kaç oda olacak, kaç balkonu, kaç cephesi olacak? sorularını, bir Mimar'a/Mühendise çözümletmeliyiz ...

İşte, mimar/mühendisin çizdiği bu plan, bizim "VERİTABANI" mızdır. Neden ?
Çünkü, bu çizime göre; 10 katlı bir apartmanın salonları aynı hizada, oturma odası aynı hizada (üstüste) vesaire vesaire ... Yani bir standartlaştırma sözkonusu ...

Bizde de, benzer bilgilerin, üsüste (veya altalta) dizilmesi gerekiyor, tıpkı planda olduğu gibi ... Mimarlar buna proje diyor, bizse VERİTABANI ... Bu plan olmadan hiçbir işe başlamayız.

2. Userform Oluşturmaya Giriş

1. Araçlar->Makro->Visual Basic Düzenleyicisi



2. Aşağıdaki gibi, yeni bir pencerede, VBE (Visual Basic Editor) açılacak ...



3. VBE'de sol taraftaki Project-VBA Project yazan bölmede sağ mouse tuşuna bastığınızda Insert menüsünün altında Userform var ... Onu seçin.



4. Şu an aşağıdaki gibi Userformunuz olması lazım ...,





EKLİ DOSYA:


3. USERFORM'da Nesne Oluşturma

Şimdi de oluşturduğumu Userform'a; veri girişini sağlayacak (komutlarımızı uygulayacak) nesneleri ilave etmeye başlayalım.
Userform'un üzerinde nesne ilave etmek için, Toolbox pencerisinden yararlanırız. (Eğer sizde görünmüyorsa, menüden View->Toolbox komutunu verin)
Toolbox aşağıdaki gibi bir görünümdedir. Biz örnek olarak; şimdi birkaç nesneyi kullanacağız.



Bu nesnelerin üzerine bir kere tıkladıktan sonra, Userformun üstüne gelin ve tıklayın. Aşağıdaki gibi bir yerleşim yapın...



Bunları tamamladığınızda, VBE'de aşağıdaki gibi bir görünüm olması gerekiyor.



Label'ların ve Commandbuttonla'ların üzerine yazı yazmak için, bir defa tıklamanız yeterli ... Aynı sayfa üzerinde kullandığınız metin kutularında yaptığınız gibi ... Ama Properties penceresinde tabiki bundan daha fazlası mevcut ...

Peki o zaman, şu an bir işe yaramayan bu Userformu canlandıralım biraz ...

AdresDefteri.xls kitabımızdaki "Ana" adlı sheet'e gelin. Bu sayfaya bir Commandbutton ilave edeceğiz.

Bunu yapabilmek için, "Denetim ARaç Çubuğu" nu görüntülemeniz gerekir. Aşağıdaki gibi ...



Sayfa üzerinde gördüğünüz "Denetim Araç Çubuğu"nda, VBE'de gördüğünüz nesnelerin hepsini bulabilirsiniz.

Çubuğun üzerindeki "Komut Düğme"sini tıklayıp (Mouse'unuz "+" şeklini alınca), "Ana" sheet'inin üzerinde bir yere yerleştirin. Aşağıdaki gibi bir görünüm çıkacak ...



Şimdi, çevresinde tutamaçlar olan CommandButton'un üzerine çift tıklayın. Sizi VBE'ye götürecek ve otomatikman iki satırlık bir kod oluşturacaktır. Bu iki satır, CommandButton'a bastığınızda gerçekleşecek olayı temsil eder ...


Şimdi bu iki satırın arasına Userform1.Show yazın.



Tebrikler, ilk işe yarar kodunuzu yazmış oldunuz ...

Sayfaya geçip, Tasarım Modu'nu kapatın. CommandButton'a basın. Artık Userform karşınızda ...



Kısaca özetlersek,

1. Verilerimizi biriktirecek bir Liste (Veritabanı) yarattık
2. Verileri kontrol edecek bir Userform nasıl oluşturulur, gördük.
3. Userfomun üzerine nesne ekledik.
4. Sayfa üzerine nesne ekledik.
5. Userformu görüntüleyecek kodları yazdık ...

4. Oluşturulan Userforma Kod Ekleme
Userformumuzu oluşturduk ve Sayfa üzerindeki butona basarak, Userformun gösterilmesini sağladık.
Tasarım Modu açıkken, "Ana" adlı sayfa üzerindeki CommandButton'a çift tıkladığımızda, VBE'de beyaz bir kod sayfası açılmıştı ve buraya bir satır kod (Userform1.Show) girmiştik. Bu beyaz kod sayfası, o sayfaya özel bir moduldür.

Userform'a işlevsellik kazandıracak kodları buraya yazmayacağız elbette... Çünkü, burası daha önce belirttiğimiz gibi sayfaya özel işlemlerin gerçekleştirileceği komutlara ayrılmıştır.

Userform1'e kod yazmak için, şimdi VBE'yi açın... Sol taraftaki, "Project" penceresinde "Forms" grubunun altında gösterilen "Userform1"in üzerine mouse ile sağ tıklayın ve "View Code" komutunu seçin .. Aşağıdaki gibi bir görüntü elde edeceksiniz

Artık, UserForm'u programlamaya başlayabiliriz. Sol taraftaki, project penceresindeki "Userform1" in üzerine iki defa tıklayın. Useform'u görüntüleyin.
Bu örnekteki amacımız, Adı ve Soyadını girdiğimiz bir kişiyi, "Kaydet" düğmesine basarak, "Data" adlı sayfaya aktarmak ....

Bunun için ilkönce nesnelerin adlarını (Name) bilmemiz gerekiyor. Aşağıdaki resim, projemizdeki nesnelerin isimlerini göstermektedir. Kod yazarken, bu isimleri kullanacağız ... İyi inceleyiniz

Evet, nesneleri ve isimlerini gördüğünüze göre, amacımızı gerçekleştirecek kodları yazmaya başlayalım.

Userform üzerinde bulunan "Kaydet" düğmesinin üzerine iki defa tıklayın. Sizi, Userform1'in kod sayfasına otomatik olarak yönlendirecek ve iki satırlık otomatik (default) bir kod oluşturacaktır.

Bu kodlar, Userformda verileri girip "Kaydet" dediğiniz zaman çalışacak kodlardır.

Aşağıdaki resmi inceleyin.

Kod:
If TextBox1.Text <> "" Then
Son_Dolu_Satir = Sheets("Data").Range("A65536").End(xlUp).Row
    Bos_Satir = Son_Dolu_Satir + 1
    Sheets("Data").Range("A" & Bos_Satir).Value = _
                   Application.WorksheetFunction.Max(Sheets("Data").Range("A:A")) + 1
    Sheets("Data").Range("B" & Bos_Satir).Value = TextBox1.Text
    Sheets("Data").Range("C" & Bos_Satir).Value = TextBox2.Text
3-1-KOD Açıklaması

IF Döngüsü:IF Textbox1="" demek, "Eğer Textbox1'in içi boşsa" demek olduğuna göre; "=" işareti yerine "<>" (eşit değildir) işareti koyarsam, aslında Textbox1 boş değilse (doluysa) demek isterim ... Eşitsizlik ifadesini VBA'da bu şekilde kullanırız.

IF/EĞER karar yapısı aşağıdaki şekilde temsil edilebilir.



3-1-1- Birinci Satır: Son_Dolu_Satir = Sheets("Data").Range("A65536").End(xlUp).Row

Şimdi, Commandbuttton'a çift tıklayarak otomatikman oluşturulan, o iki satır kodun arasına neye göre bunları yazdık açıklayalım …
Şimdi manuel olarak (elle) "Data" sayfasına veri girdiğinizi düşünün .. Elle yaptığınız bu işlemin algoritması (işleyiş yöntemi) nasıldır? Bir düşünün...
Öncelikle, sayfadaki listenin son satırını bulursunuz. Sonra, son satırın altındaki, ilk boş satıra yazmaya başlarsınız... Tüm bilgileri yazdığınızda da işlem biter...

Yazdığımız kodda da tamamıyla aynı mantık geçerli... Kodları açıklamaya geçmeden önce, basit bir kaç kuraldan bahsedelim.
Excel'i kendisini; oturduğunuz "Şehir" olarak düşünün ...

Bu şehrin içinde de, bir sürü "İlçe" var . Bu “İlçeler”; "Çalışma Kitapları"dır. Yani; bizdeki "AdresDefteri.xls" bunlardan sadece biri ...
İlçelerin içinde, "Mahalleler" yani "Çalışma Sayfaları" var ... Bizdeki, "Ana", "Data" sheetleri yani...

"Mahalleler"de de, bir sürü "Ev/Hane" va ... Haneler, Excel'in herhangi bir hücresini veya hücreler gurubunu (aralığını) temsil eder...
Şimdi, aynı ilçede oturduğunuz, ama daha önce hiç gelip gitmediğiniz bir arkadaşınıza, evinizin adresini verecek olsanız; bunların hepsini kullanacaksınız öyle değil mi ?

Excel’de, adreslemede aynı mantığı kullanıyor …Şimdi aşağıdaki satırı inceleyelim.

Son_Dolu_Satir = Sheets("Data").Range("A65536").End(xlUp).Row

“Son_Dolu_Satir” diye bir değişkene, bir değer yüklemeye çalışıyoruz.

Eşittirden sonraki kısma bakıp, arkadaşımıza vereceğimiz adres örneğini hatırlayalım. Aynı “İlçe”de oturduğunuza göre, “Şehir”i belirtmek abesle iştigaldir … Üstelik; “İlçe” ismini de söylerseniz, karşınızdakini iyice saf yerine koymuş olursunuz… Hımm, o zaman ben sadece hangi mahalle ve hane de oturduğumu söylesem yeterli olur … Zaten kendisi de akıllı biri …

Sheets(“Data”) - > Mahalle
Range(“A65536”)->Hane

Evet, şimdi Excel böyle bir adresleme yöntemi kullanıyor, bunu anladık.
Şimdi, “Data” adlı sheet’e geçin. “A65536” hücresine gidin. Gittiniz mi? Şimdi de; “Ctlr+Üst Ok” tuşuna basın. A1 hücresine zıpladınız değil mi? Peki, şimdi A10 hücresine “1” yazın ve tekrar A65536 nolu satıra gidin. Aynı zıplama hareketini yapın. Bu sefer ne oldu ? Doğru yaptıysanız A10 hücresine zıplamış olmalısınız.

Sizin, manuel olarak “Ctrl+Üst Ok” tuşlarına basarak yaptığınız işlemi; adresini belirttiğimiz hücrenin, sonuna End(Xlup) yazarak koda dönüştürüp otomatikleştirebiliriz.

Peki, biz Cursor’ı (İmlec’i), kodlarla bir yerden bir yere zıplattık da, hangi satıra zıpladık ?

Onu da End(Xlup)’ın sonuna Row yazarak elde edebiliriz. (Row, İngilizce de Satır demek … )
Yani; Son_Dolu_Satir, “Data” sayfasındaki “A65536” hücresinden yukarı doğru zıpladığımızda, gittiğimiz satır numarasıdır.

3-1-2. İkinci Satır: Bos_Satir = Son_Dolu_Satir + 1
Biliyorsunuz, ilk satırla, sadece listenin bilgi yazılır olan en son satırını bulduk. Eğer, bu satır numarasını kullanırsak, varolan bilgilerin üstüne, veri yazmış oluruz ... 10.satırda bilgi olduğunu bile bile 10.Satıra yeni kayıt eklenmez öyle değil mi?

O zaman;
Kod:
Bos_Satir = Son_Dolu_Satir + 1
"Bos_Satir" diye bir değişken tanımlayalım ve bu, "Son_Dolu_Satir"in bir altındaki satır olsun.

2.satırın anlamı da budur ...

3-1-3- Üçüncü Satır:Sheets("Data").Range("A" & Bos_Satir).Value = _
Application.WorksheetFunction.Max(Sheets("Data").R ange("A:A")) + 1


Bu satırla birlikte, artık bilgileri Sayfa üzerine yazmaya başlıyoruz.
Bu satır, "Data" sayfasında, "ID" denilen A sütununa bir değer atıyor? Nasıl bir değer ?

BENZERSİZ BİR DEĞER ... Açıklayalım ...

Excel sayfaları üzerinde; çoğu kişi MAK (İngilizce Versiyonlar için MAX) formülünü kullanmıştır. Bu formül, Belirli bir aralıktaki Enbüyük değeri bize verir değil mi?

Mesela A1'den başlayarak A10'a kadar sırasıyla 1,2,3 ... 10 yazın. B1 hücresine =MAK(A1:A10) yazdığınızda; formül sonucunun "10" olduğunu görürsünüz.

Şimdi, kodumuza dönelim ... Yazdığımız kodun bir parçası şu :

Kod:
Sheets("Data").Range("A" & Bos_Satir).Value = .....
Burada, hemen, bir adresleme olduğunu ve bir hücreyi temsil ettiğini görüyoruz. Bos_Satir değişkeni 2 ise A2 hücresini, Bos_Satir değişkeni 973 ise, A973 hücresini referans göstermektedir.

Peki, adreslemenin gösterdiği hücrenin nesiyle ilgileniyoruz? VALUE'siyle ... Yani DEĞERİ ile ... Eşitliğin öbür tarafından gelen bilgiye göre, bu hücrenin değeri değişecek demektir...

Eşitliğin öbür tarafından da birşeyler yazıyor ...

Kod:
=Application.WorksheetFunction.Max(Sheets("D ata").Range("A:A")) + 1
Az önce sayfa üzerinde MAK() formülü ile ne yaptıysak, buradaki komut da aynısını yapıyor...

VBA'da; sayfa üzerindeki formüllere karşılık gelen özel yazım şekilleri vardır.
Eğer VBA'da bir formül sonucunu döndürmek istiyorsanız,
Application.WorksheetFunction ile başlayan bir komut yazmalısınız. Bu bütün fonksiyon (formül) kullanımları için geçerlidir.

VBA'daki, MAX fonksiyonu da sizden bir parametre ister (Yani bir aralık girmenizi bekler )

Application.WorksheetFunction.Max(Sheets("Data").R ange("A:A"))

Bu satırla, A sütundaki enbüyük değeri buluyoruz ve yeni eklenen kaydın benzersi bir ID alması için, bulduğumuz maximum değeri +1 artırıyoruz.

Application.WorksheetFunction.Max(Sheets("Data").R ange("A:A")) +1

Sonrada eşitliğin sol tarafından gösterilen hücreye bu VBA fonksiyonu ile elde edilen değeri yazdırıyoruz.

3-1-4: Dördüncü Satır: Sheets("Data").Range("B" & Bos_Satir).Value = TextBox1.Text

Burada da gördüğünüz gibi, kodun ilk başlarında bir hücre adreslemesi var. Ama dikkat ederseniz, Range parantezinin içinde artık “B” sütunundan bahsetmeye başladık.

Eşitliğin öbür tarafında ise, daha önce size, “Userform1’in üzerinde kullanılan nesnelerin isimlerini kodlarda kullanacağız dediğim durum var. (Daha önceki mesajlardan birinde verilen, Userform resimlerine bakabilirsiniz)

TextBox1, Userform üzerinde; kişinin Adını girmek için kullandığımız kutudur.
Bu tip nesnelerin bir çok özelliği vardır. VBE’deki “Properties” penceresinden başkaca hangi özelliklere sahip olduğunu inceleyebilirsiniz.

TextBox1 nesnesinin, kodumuzda kullandığımız bir özelliği, “Text” özelliğidir.
Textbox1’in “Text” özelliği, kutunun içine yazdığınız şeyi ifade eder … Bu şey, yazı da olabilir sayı da veyahut her ikisini karışımı da …

Şimdi bu satır bize neyi söylüyor ? Tercüme edelim :

“Data” sayfasında, “B” sütununda bulduğumuz ilk boş hücreye; TextBox1’in içine yazdığımız veriyi gönder …


3-1-5- Test

Şimdi "Ana" sayfasına gelin. (Eğer elinde örnek dosya olmayan varsa, 105 nolu mesajdaki dosyayı kullandığımızı belirteyim. Oradan temin edebilrisiniz)
"Ana" sayfadaki butona basın ve Userformu görüntüleyin. Adı yazan kutunun karşına "Ahmet", Soyadına "Demir" yazın. "Kaydet" butonuna basın. Birşey olmadı gibi değil mi ?

Şimdi Useformu "x" işaretinden kapatın. "Data" sayfasına geçin. Ahmet Demir nereye yazılmış görün.

İlk kaydımızı yaptığımıza göre, şimdi ikinci veri kaydımızı da yapalım. Tekrar "Ana" sayfasına geçin ve UF (Userform) yi görüntüleyin. Bu sefer, Adı yazan kutuya "Mehmet", soyadına "Çelik" yazıp, "Kaydet" tuşuna basın.
"x" işaretinden UF'yi kapatın. "Data sayfasına geçin. Mehmet Çelik'in hangi satıra yazıldığını görün.

3-1-6-KAYDET BUTONU

Şimdi, tekrar "Kaydet" butonunu gei dönelim ve Biraz geliştirelim.
İsteğimiz şu olsun : Kaydet dedikten sonra Userform otomatik olarak kaoansın ve "Data" sayfasına geçsin.

VBE'ye geçin. CommandButton1_Click olayında daha önceden yazdığımız bazı kodlara ilaveler yapacağız. Aşağıdaki resimde görüldüğü gibi iki satır kodu projenize ilave ediniz.
Bu kodlar, şunlardır.

Kod:
 Sheets("Data").Select
    Unload UserForm1
Şimdi, Excel'e dönün ve yeni bir İsim Soyisim kayıt işlemi yapın. Artık, "Kaydet" dediğinizde, form otomatik olarak kapanıyor ve "Data" sayfasına geçiyorsunuz değil mi?

Select yöntemi, İngilizcesinden de tahmin edeceğiniz gibi, "SEÇMEK" anlamındadır. Yani Sheet("Data").Select demekle, Excel'e, "Data" sayfasını seç (veya git) dedik.

Unload, Load yani (hafızaya) YÜKLEME işinin tam tersini ifade etmektedir. Ters işlem de (hafızadan) yoket anlamındadır. Userform1 kaybolur.
Bu aşamaya oluşan kitap aşağıda verilmektedir.

4-KARAR YAPILARI

4-1- IF (EĞER)

IF Döngüsü:IF Textbox1="" demek, "Eğer Textbox1'in içi boşsa" demek olduğuna göre; "=" işareti yerine "<>" (eşit değildir) işareti koyarsam, aslında Textbox1 boş değilse (doluysa) demek isterim ... Eşitsizlik ifadesini VBA'da bu şekilde kullanırız.

IF/EĞER karar yapısı aşağıdaki şekilde temsil edilebilir.


4-1-1-TEXTBOK Boşsa

Şimdi de Textbox'lar boşsa işlem yapılmaması kararını kodlara adapte edelim.
Eğer, Excel'in duruma göre bir karar vermesini istiyorsanız, "Karar Yapıları" denen blokları bilmelisiniz.

Excel'in formüllerini kullanan veya gören arkadaşlar bilirler. EĞER(IF) denilen bir formül vardır. Bu formül, kısaca, bir koşulun doğru veya yanlış olmasına göre, size bir sonuç verir.

Örneğin "=EĞER(A1=0;10;20)" gibi ...

VBA'da da benzer mantıkla çalışan bir yapı vardır. "IF THEN/ ELSE/ END IF" diye, kodlarda gördüğünüz satırlar, az önce verdiğimiz formüle benzer işlemler yürütmemizi sağlar.

Şimdi, kodumuzun şöyle bir karar vermesini isteyelim.
Eğer, Textbox1 boşsa, kayıtla alakalı hiçbir işlem yapmasın ve bize bir uyarı görüntülesin.

Şimdi VBE'ye geçin ve CommandButton1_Click olayına eklenecek yeni kodları yazmaya hazırlanın.

Aşağıdaki resimi inceleyiniz.

Kodlar, IF THEN/ELSE/END IF yapısı kullanılarak yeni bir şekle sokuldu. Kitapta varolan kodlara ilaveler kırmızı renkle gösterilmiştir.

Kod:
Private Sub CommandButton1_Click()
    If TextBox1.Text <> "" Then
    Son_Dolu_Satir = Sheets("Data").Range("A65536").End(xlUp).Row
    Bos_Satir = Son_Dolu_Satir + 1
    Sheets("Data").Range("A" & Bos_Satir).Value = _
                   Application.WorksheetFunction.Max(Sheets("Data").Range("A:A")) + 1
    Sheets("Data").Range("B" & Bos_Satir).Value = TextBox1.Text
    Sheets("Data").Range("C" & Bos_Satir).Value = TextBox2.Text
    Sheets("Data").Select
    Unload UserForm1
   Else
   MsgBox "İsim Girmeniz gerekiyor"
   End If
End Sub
Kodları, kendi elinizdeki dosyayı adapte ediniz.
Excel'e geçerek, Userform'u görüntüleyip, İsim kutusuna birşey girmeden (boş bırakarak) "Kaydet" düğmesine basın ve sonucu görün.

4-2-THEN

4-2-1-Çift TexTboxu kontrol

Veri Girişi esnasında, sadece "AD" girilip girilmediğini kontrol etmiştik. Soyadın girilip girilip girilmediği kontrol etmiyorduk.
Şimdi, programımıza şöyle bir kriter daha eklemek isteyelim.
"Bir kişiyi, dosyamıza Userform üzerinden kaydederken, hem İSİM hem SOYAD girişi zorunlu olsun. Bunlardan her ikisi de girilmezse, asla kayıt yapılmasın ve bir uyarı mesajı ile veriyi giren ikaz edilsin."
Mevcut kodlarımızda; aşağıdaki satırla, TextBox1'in (yani İSİM'in) dolu olup olmadığını kontrol ediyorduk.
Kod:
If TextBox1.Text <> "" Then

Şimdi ise, TextBox2'nin dolu olma şartını da aynı satıra ilave edelim. (Kod satırına yaptığımız ilave kırmızı renkle gösterilmiştir)

Kod:
If TextBox1.Text <> "" And TextBox2.Text <> "" Then

Mevcut kod satırını, dosyanızda, yukarıdaki şekilde değiştirip sonucu görünüz...

4-3- AND
And, ingilizcesinden tahmin edeceğiniz gibi, "VE" bağlacını ifade eder.
Günlük konuşmalarımızda, "VE"yi kullanırken dikkat ettiğimiz bazı noktalar vardır. Mesela, bir akşam yemeğine çıkarken, eşiniz veya sevgilinizle yaptığınız planda şöyle bir cümle sarfedersiniz (gerçi bu konuda bayanlar biraz daha titizdir) : "Nezih VE yemekleri güzel olan bir yere gidelim"... Bu sözden kastınız, gideceğiniz mekanın hem NEZİH hem de YEMEKLERİNİN GÜZEL olmasıdır. İkisinden biri bile doğru olmazsa, bu mekanı tercih etmezsiniz.
Aslında, VBA kodumuzda "And" bağlacı ile iki şartı birbirine bağlarken de kastettiğimiz şey bu ... Hem Textbox1 boş olmayacak hem de Textbox2 boş olmayacak ...

Kod:
If TextBox1.Text <> "" And TextBox2.Text <> "" Then
And bağlacı ile bir sürü değişik koşulu arka arkaya sıralayabiliriz.

4-4- İçiçe IF kullanımı

hem TextBox1 (yani isim) hem de TextBox2 (yani soyad) kontrol edilmesine rağmen, veri girişi esnasında hangisi boş olursa olsun, aynı mesaj kutusu görüntülenmekte ve "İsim girmeniz gerekiyor" denmekteydi. Oysa siz, ismi girmiştiniz de soyadı boş bırakmıştınız.

Bu durumda, paşa gönlünüze bağlı olarak iki seçeneğiniz var. Ya mesaj kutusundaki mesajın kapsamını genişletirsiniz. Yani "İsim girmeniz gerekiyor" değil de, "İsim veya Soyad'dan birini girmediğiniz tespit edildi. Lütfen kontrol ediniz" gibi ... Veyahut kodlarda biraz oynama ve ekleme yaparak, "İsim" boş geçilirse ayrı, "Soyad" boş geçilirse ayrı mesaj kutusu görüntüleyebilirsiniz.

Aşağıdaki kodlar, ikinci seçeneği göre ayrı ayrı mesaj kutusu görüntülemeye ve iç içe IF kullanımına örnektir.

Kod:
Private Sub CommandButton1_Click()
    If TextBox1.Text <> "" Then
     If TextBox2.Text <> "" Then
                Son_Dolu_Satir = Sheets("Data").Range("A65536").End(xlUp).Row
                Bos_Satir = Son_Dolu_Satir + 1
                Sheets("Data").Range("A" & Bos_Satir).Value = _
                           Application.WorksheetFunction.Max(Sheets("Data").Range("A:A")) + 1
                Sheets("Data").Range("B" & Bos_Satir).Value = TextBox1.Text
                Sheets("Data").Range("C" & Bos_Satir).Value = TextBox2.Text
                Sheets("Data").Select
                Unload UserForm1
      Else
              MsgBox "Soyadı girmeniz gerekiyor"
      End If
    Else
            MsgBox "İsim Girmeniz gerekiyor"
    End If
End Sub
Bu noktaya kadar getirdiğimiz dosya ektedir.

4-4-Paragraf

Girinti (paragraf) yaratmanın, kodların çalışmasına hiçbir etkisi yoktur. Belirttiğiniz gibi tamamen, okunaklılığı artırmak içindir.

İlkokul günlerinize geri dönerseniz, kimi arkadaşlarınızın defterlerinin sol tarafına yaptıkları ve sizin imrenerek baktığınız kenar süslerini hatırlayın. Yazdığınız yazıya bir etkisi varmıy dı bunların ? Ama güzel gösteriyordu dimi ?
Paragraf kullanmanın, bir diğer avantajı da, "Hangi ELSE hangi IF'e ait", "hangi END IF hangi IF'i kapatıyor" sorularının kafa karıştırmasını engellemesidir.
Kodun, şematik gösterimi de aşağıda verilmektedir ?

Burada, dikkat ederseniz; IF kullanımı için daha önce anlattığımız KUTUCUK kuralına uyduk.

Mavi kutucukların ifade ettiği bloğumuz zaten vardı.. Sadece 1.Mavi Kutucuğun içine, bir IF bloğu daha yerleştirdik. Yeni yerleştirdiğimiz IF bloğunda da KUTUCUK kuralı geçerli ve iki tane kırmızı kutu var ...

5- LİSTBOX OLUŞTURMAK
ListBox;, -adından da belli olduğu gibi- içinde, istediğiniz büyüklükte listeyi barındırabilen oldukça işlevsel ve VBA’da çok kullanılan bir nesnedir.
VBA’da kullandığımız diğer nesneler gibi, ListBox’ı da yönetebileceğimiz (istediğimiz gibi şekillendirebileceğimiz) birçok özelliği mevcuttur. Örneğin; ListBox’da kaç sütun göstereceğimizi, gösterilen sütunların genişliklerinin ne kadar olacağını ve veriyi nereden alacağını ListBox’a söyleyebiliriz.

5-1-Useforma Listbox nesnesi ilave etme

Toolbox'tan ListBox nesnesini bulun ve tıklayın. Fare imleci, "+" şeklini alınca, Userform üzerine aşağıdaki şekilde yerleştirin.

Daha sonra; Userform1'in, daha önceki kodlarımızı yazdığımız, "Kod Sayfası"nı görüntüleyin. Sayfa üzerinde iki tane açılan kutu göreceksiniz. Birincisinden, Userform'u seçin. Kod sayfasına, otomatikman iki satırlık Userform_Click olay prosedürünün ilave edildiğini göreceksiniz. Ancak bu prosedürler bizim işimiz yok. Userformun üzerine mouse'la basıldığında, çalışacak kodlar için belki birgün kullanırız


Sayfa üzerindeki imlecin yeri değişmeden, Sağ taraftaki açılan kutudan Initialize'u seçin. Bu seferde, yine otomatik olarak iki satırlık, Userform_Initialize olay prosedürünün ilave edildiğini göreceksiniz.

Şimdi, Initialize için oluşmuş, iki satırlık kodun arasına aşağıdakileri yazın.

Kod:
ListBox1.ColumnCount = 2
    ListBox1.ColumnWidths = "80;120"
    ListBox1.RowSource = "Data!B2:C" & Sheets("Data").Range("A65536").End(xlUp).Row
Son durumda, Userform1'in kod sayfasında şöyle bir kod oluşacak ...
Kod:
Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 2
    ListBox1.ColumnWidths = "80;120"
    ListBox1.RowSource = "Data!B2:C" & Sheets("Data").Range("A65536").End(xlUp).Row
End Sub
Şimdi, Userformunuzu sayfa üzerinde tekrar çalıştırın ve ne olacağını görün.
NOT : Şu ana kadar projede geldiğimiz nokta ektedir.



Şimdi aşağıdaki kodları inceleyelim.

5-2-LİSTBOX KOD


Kod:
Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 2
    ListBox1.ColumnWidths = "80;120"
    ListBox1.RowSource = "Data!B2:C" & Sheets("Data").Range("A65536").End(xlUp).Row
End Sub
Kodların ilk satırında; daha önce görmediğimiz, Userform_Initialize diye bir şeyin yazılı olduğunu görüyorsunuz. Ama daha önce böyle yapıları, CommandButton_Click kodlarına benzetebilirsiniz.

5-2-1- Userform_intailize Nedir?

Hemen bu bilinmeyeni kısaca açıklayalım ve esas konumuza geçelim.
VBA’da her nesnenin birden çok özelliğinin olduğunu söylemiştik. Bunu şu şekilde düşünebilirsiniz, Ahmet adında bir arkadaşınız var. Şimdi Ahmet’in özelliklerini bana söyleyin desem, 180 cm boyu, 80 kg ağırlığı, karagözlü, yurdum delikanlısı olduğunu söyleyebilirsiniz. Evet, bunlar kesinlikle Ahmet’in özellikleridir.

Ancak, bazı durumlar vardır ki, Ahmet’in özelliğinden çok alışanlıklarını, vukuatlarını ve olaylar karşısındaki tutumunu anlatır.
Mesela, Ahmet esnediği zaman, ağzı bir karış açılır. Ahmet bağırdığı zaman, yedi mahalleden duyulur, Ahmet yemek yerken …, Ahmet TV seyrederken … gibi bunları uzatmak mümkündür. Bunlar Ahmet’in özelliklerinden çok Vukuat’larını betimlemektedir ve özellikleri ile birlikte şahsa munhasırdır
Userform_Initialize’ dediğimizde; aslen Ahmet’in bir sabah uyandığında yapacağı işlemleri anlatmaya çalışırız. Mesela, yüzünü yıkar, dişlerini fırçalar, çay suyunu ocağa koyar gibi …

VBA’da işin güzel yanı, Ahmet’e, normalde yaptıramayacağınız şeyleri, kodlarla istediğiniz gibi yaptırabilmenizdir.

Initialize; kelime anlamı olarak. “İlk defa Başlatmak” demektir…. Yani, Userform, başlatılırken (ekranda gösterilmeye hazırlanırken) yapılacak işlemleri, burada yazarız ve Userform göz önüne geldiğinde, tüm nesneler şekillenmiş, veriler yerli yerine yerleşmiş olur

5-2-2-ListBox’la alakalı kodları neden buraya yazdık
Userform_Initialize olayının altına yazdığımız kodları inceleyelim.

Kod:
Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 2
    ListBox1.ColumnWidths = "80;120"
    ListBox1.RowSource = "Data!B2:C" & Sheets("Data").Range("A65536").End(xlUp).Row
End Sub
İlk bakışta görünen şey; ListBox nesnesine ait işlemlerin yapıldığı … Çünkü hepsi, “Listbox1….” diye başlıyor

Biz Userform!u tasarlarken, tabiri caizse çıplak bir ListBox nesnesi aldık ve öylecene Userform’un üzerine bıraktık. Eğer VBA’da yeniyseniz; size, Zeus heykeli gibi ihtişamlı görünen bu nesnenin, biraz daha ilerledikten sonra; ne bakışlarında bir aşk ne de düzgün bir karakteri olduğunu görürsünüz …
Bu Zeus’un özelliklerini; Userform'la birlikte gösterilmeye hazırlanırken, biraz kurcalasak ve biraz hayat versek; rahmetli Hulusi Kentmen gibi sıcacık olur valla ...

Onun için, Userform'un başlatma olayının içine yazdık ki, Userform her gösterildiğinde (veya karşımızda çıktığında) Listbox da şekillensin ...

5-2-3-ColumnCount : Tahmin edeceğiniz gibi “Kolon (Sütun) Sayısı” demek ..

Listbox’ın içinde kaç sütun görmek istiyorsanız, ColumnCount özelliğini buna ayarlamalısınız. Örneğin, Adı ve Soyadının bulunduğu B ve C sütunlarını ListBox’da göstermek istiyorsanız, 2 yazmanız gerekir. Yok ben illaki yanında D sütunundaki Adres’i de göreceğim diyorsanız, 3 yazmanız gerekir.

5-2-4-ColumnWidths : “Kolon (Sütun) Genişlikleri” demek …
ListBox’ın az önce belirlediğimiz sütun sayısına göre; her bir sütunun genişliğini ayrı ayrı ayarlamak isterseniz, ColumnWidths özelliğini kullanınız.
Mesela, içinde iki sütun gösterilecek bir Listbox’ın ColumnWidths’i “80;120” olurken, içinde üç sütun barındıran bir Listbox için aynı özellik “80;120;100” olabilir. Tamamen paşa gönlünüze bağlı …

ColumnWidths belirlenirken, yazılacak sütun genişlikleri; çift tırnak içinde yazılmalı ve birbirinden “;” (noktalı virgül) kullanılarak ayrılmalıdır.

5-2-5-RowSource : “Satır (veya Veri) Kaynağı” demek …
ListBox’ta, Sayfadaki bir Aralığı (Range’i) gösterebilirsiniz. Bunun için, “SayfaAdi!HücreReferansı” notasyonuna uymak yeterlidir. Örneğin, “Sayfa1!A1:A10”, “Sayfa2!B2 : C25” gibi ….
Biz kodlarımızda şu şekilde de yazabilirdik.

Kod:
ListBox1.RowSource = "Data!B2:C1000"
Böyle yazsaydık; ListBox1; 1.000 satırı gösterecek ve topu kökü 20 tane veri olan bir listede, bir sürü boş satırı da alta doğru gösterecekti. Şu anki kodlarda; bunu, deneyip görünüz.

Bizse, Listbox’a yine aynı mantıkla; verinin olduğu son satıra kadar bir Liste yükledik. Böylelikle, ListBox’a, hiçbir boş satır ilave edilmedi.

5-2-6-ListBox1.RowSource = "Data!B2 : C" & Sheets("Data").Range("A65536").End(xlUp).Row

Kırmızı ile yazılı bölümü yazmamızdaki amacımız nedir?

RowSource özelliğini, kodlarımıza yazarken, aşağıdaki şekilde bir notasyona uymak zorunda olduğumuzu söylemiştim .

SayfaAdı!HücreReferansı
Mesela Sayfa2!A1 : C100 gibi...

Sizin kırmızı yazılı kod satırına dönersek; aslında, kırmızı olarak yazılan kısmın, notasyonu tamamlamak için kullanılan bir satır numarası olduğunu görüyoruz.
Yani, aslında, biz Data!B2 : C4 yazmak istiyoruz. Ama, sondaki "4" rakamı her zaman değişken... Çünkü "Data" sayfasına her an bir veri ekleniyor. O zaman o "4"ü her zaman hesap eden bir değişkeni, bu notasyona monte etmeliydik...

Kırmızı ile yazılan Sheets("Data").Range("A65536").End(xlUp).Row =4 olabileceği gibi, en son kaçıncı satırda kalındıysa ona göre artar veya eksilir. Böylecek bir her zaman, ListBox'ta Data sayfasındaki bütün bilgileri görebiliriz.

5-2-7-ListBox1.RowSource = "Data!B2 : C" & Sheets("Data").Range("A65536").End(xlUp).Row

C'nin ne olduğunu açıklıyor. Ama burda onu neden & ile ayırdık ?

Bir aralığı nasıl ifade ediyorduk ? ... Range("A2 : C10") gibi, değil mi ?
Peki, biz böyle sabit tanımlamayı kodlarımızda kullanısak, kıyamet kopana kadar bu aralığın dışına çıkabilirmiyiz hiç ? Hayır çıkamayız ... Çünkü, sütunları sabit, satırları sabit ... Bu sabit hücreler; A,B,C sütunlarındaki, 2. ila 10. satırlardaki hücrelerdir ...

Ömür boyu; bu hücreye mahkum olamayacağımıza göre, "Wallace" gibi "Freedom" dedirtecek bir yapımız olmalı ...

Yani, eni boyu uzayabilmeli...

O zaman; bizim öyle birşey yazmamız gerekir ki, Range'de ": C10" yazan yer değişebilsin ... Aslında; bir bilinmeyenli bir yapı var karşımızda ... Bilinmeyene, her zaman ki gibi X dersek ....

Range("A2 : CX")

Ama bir sorun var. VBA, bunu yemez... Eeee napıcaz, o zaman, VBA'yı kandıracak birşeyler uyduralım

Biliyorsunuz bu ucube "&" işaretin anlamı, Türkçe'mizde "VE" ye karşılık geliyor... Saatchi & Saatchi gibi bir reklam ajansı vardı ... Örnek bu geldi aklıma şu anda ...

"&" (yani VE) bir bağlaçtır. İki şeyi birbirine tutturur.

Sayfa üzerinde kullandığınız formüllerden hatırlayınız. =A1&B1 yazdığınızda; iki hücrenin bitiştirilmiş sonucunu elde ediyordunuz ....

VBA'da da; Range("A2 : CX") yazamayacağımıza göre, arkasına tuturacağımız bir değişkenle, Range'i ifade etmeliyiz.

Buna göre; eni boyu isteğimize göre değişebilen bir Range; Range("A2 : C" & X)
olarak tanımlanır.

6-Listbox'ta seçtiğimiz bir kişinin; "Data" sayfasındaki tüm bilgilerini, Textbox'lara yerleştirme kodlarını inceleyeceğiz ...

Birkaç mesaj önce; Schakal, konuyu belirli bir yere kadar güzel getirmiş ... Aşağı yukarı aynı mantık çerçevesinde, işlemleri yürüteceğiz.
Şimdi, VBE'ye geçin ve Userform'u görüntüleyin. Daha önce yerleştirdiğimiz Listbox'ın üzerine çift tıklayın.

Userform'un kod sayfasına yönlendirileceksiniz. ListBox'ın üzerinde yaptığımız bu çift tıklama hareketi, aynı zamanda, kod bölümünde otomatikman iki satırlık bir kod oluşmasına sebep oldu ...

ListBox1_Click adındaki bu olay prosedürü (Events); adından da anlaşılacağı gibi, bize bir olay tetiklendiğinde (Listbox'a Click yapıldığında) çalışacak kodları ifade ediyor.
Eğer; Listbox'a mouse'la tıklarsak bu kodlar çalışacak ... Ayrıca, klavyeden aşağı/yukarı ok tuşları ile liste içinde gezinmeler de ListBox tarafından Click olayı olarak algılanır ....

ListBox'ın daha bir çok Events'ı (vukuatı) vardır ...

Yanıp sönen Cursor'ı, Listbox1_Click olay prosedürünün arasında tutarak, VBE kod sayfasının sol üst tarafındaki "Açılan Kutu"yu incelerseniz, diğer Events'larını (Vukuat) görebilirsiniz. Aşağıdaki gibi ..

Events (olay/Vukuat) kavramları kafanızı karıştırmasın ... Aslında 10'larca komik Tik'i olan bir arkadaşınız (bizim ünlü Ahmet olsun mesela ) olduğunu düşünün ... Mesela, Ahmet'in karnını parmağınızla dürtüklediğinizde, acaip sesler çıkarır. Ahmet'in karşısında Limon yediğinizde, yüzü şekilden şekile girer ...
ListBox'ında böyle komik olmasa da Tik'leri var işte ... Her bir Tik'i bir olayı tetikler ve az önce size söylediğim açılan kutuda bu Tik'lerin listesini bulabilirsiniz. Ahmet'in (yani ListBox'ın) her bir Tik'e vereceği tepkiyi de kodlarla değiştirebilirsiniz....
Bu kadar gevezelikten sonra; a
şağıdaki kodları Listbox1_Click olayı için oluşan iki satırlık kodların altına kopyalayın.

Kod:
Private Sub ListBox1_Click()
    Bulunan_Satir_No = ListBox1.ListIndex + 2
    TextBox1.Text = Sheets("Data").Range("B" & Bulunan_Satir_No).Value
    TextBox2.Text = Sheets("Data").Range("C" & Bulunan_Satir_No).Value
    TextBox3.Text = Sheets("Data").Range("D" & Bulunan_Satir_No).Value
'Diğer Textbox'ları siz doldurunuz ....
End Sub
Sonucu, deneyip görünüz ... Daha sonra, diğer TextBox'ları doldurmak için kod'a geri kalan eklemeleri yapınız ...

7-LİSTİNDEX NEDİR?

ListIndex, kısaca ListBox'ın bir özelliğidir ... Adında anlayabileceğiniz gibi aslında "Listenin Sıra No"sudur. Yani, ListBox'ta bir satırı seçtiğiniz zaman, Listbox'ın bu özelliği, seçtiğiniz satırın no'sunu alır ... Burada satırdan kastım, Excel'in değil, bizzat ListBox'ın içinde alta alt dizilen satırlardır ...

Yalnız, bu ListIndex'in, gıcık bir tarafı vardır.... O da, ListBox'ın içindeki ilk satıra "0" (Sıfır) değer biçmesidir. Yani, siz hangi ListBox olursa olsun, ilk verisine (en üstteki satırına) tıkladığınızda (veya seçtiğinizde), ListIndex değeri "0" (Sıfır) olur... Yani; sıra numarasını 1'den değil, "0"'dan başlatır...
Hal böyleyken; ListBox'ın ilk satırını seçtiğimizde, Listbox'ın bize döndüreceği değer "0" sa ve bunun "Data" sayfasındaki karşılığı da 2.satır ise; o zaman; ListBox'ın döndürdüğü ListIndex değerine "+2" ilave yapmamız gerekir ...

8-LİSTBOX'TA EVENT

Biliyorsunuz, ListBox'a tıkladığımız zaman veya Listbox içinde klavyenin yukarı ve aşağı ok tuşlarına bastığımız zaman, mevcut kodlarımızda TextBox'lara bilgiler yükleniyordu ...

Ama bizim canımız, tek tıklama ile değil de, ListBox'a çift tıklandığında TextBox'a veri gelmesini çeksin

Bu durumda; kod sayfasının üstünde, sol tarafta duran "Açılan Kutu"dan (bundan sonra "Events Kutusu" diyeceğim) DblClick olayını seçmeliyiz...

Otomatikman, aşağıdaki gibi iki satırlık bir kod oluşacak ...

Kod:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
End Sub
Bu satırların arasına, ListBox1_Click olayında gördüğünüz, bütün kodları taşıyın ... Copy-Paste değil, Cut-Paste yapın.
Artık, Listbox2'ye çift tıkladığınızda, TextBox'lara veri yüklenir ...

9-LİSTBOX' SİL BUTONU

Listbox'tan bir seçim yapıp, "Sil" butonuna basmakla, Silme işleminin nasıl yapılacağınız açıklamaya çalışacağız.
Userformunuza, aşağıdaki gibi düğme daha ilave ediniz ve üzerine tıklayıp, "Sil" yazınız ... (veya özelliklerden/Properties penceresinden; Caption'ın karşısına, "Sil" yazınız ..).

Daha sonra, CommandButton3'ün üzerine çift tıklayıp, VBE'de otomatikman oluşan, iki satırlık CommandButton3_Click olay prosedürünü görün ...
Şimdi; bu iki satırın arasına aşağıdaki kodları yerleştirin.


Kod:
 If ListBox1.ListIndex >= 0 Then
        cevap = MsgBox("Bilgi Silinecek ... Emin misiniz ?", vbYesNo, "SİLME ONAYI")
        If cevap = vbYes Then
            Silinecek_Satir = ListBox1.ListIndex + 2
            Sheets("Data").Rows(Silinecek_Satir).Delete
        End If
    End If
9-1-KOD AÇIKLAMALARI

9-1-1-Kod: If ListBox1.ListIndex >= 0 Then

Daha önce, sizlere, Listbox'ın bir gıcıklığını olduğunu ve "0" dan başlayarak sıra numarasını (Index değeri) verdiğiniz söylemiştim. Hatırlayınız ...
O zaman, mantıken şöyle bir çıkarsama yapabiliriz.
Listbox'ın ListIndex değeri (yani sıra numarası) , mantıken "0" dan küçük olamaz. Eğer, Listbox'tan herhangi bir satır seçilmişse, MUTLAKA, bunun index (sıra) numarası, "0"dan büyük veya eşittir.

Eğer "0" (Sıfır) 'dan küçükse, Listbox'tan bir seçim yapılmamış demektir. Seçim yapmama, özel bir durumdur ve Listbox'ta herhangi bir seçim yapılmamışsa, Listbox'ın ListIndex değeri her zaman "-1"'e eşit olur.

Kısaca; kodumuzdaki bu satır, Listbox'tan bir seçim yapılıp yapılmadığını kontrol ediyor ... Dalgınlıkla, listeden bir eleman seçilmeden, "Sil" butonuna basılırsa, kodumuz çuvallamasın diye aldığımız bir önlem olarak düşünün.
9-1-2-Kod: cevap = MsgBox("Bilgi Silinecek ... Emin misiniz ?", vbYesNo, "SİLME ONAYI")

Burada; bizden bir cevap istenmektedir. Soruyu soran sa; MsgBox denen bir fonksiyon ....

MsgBox'ı daha önce kullanmıştık, hatırlarsanız ... Ama, bizim daha önce kullandığımız MsgBox (Mesaj Kutusu), sadece bir tane buton barındırıyordu ve yana döne o butona basmak zorundaydık.

Oysa ki, buradaki mesaj kutusunda; kullanıcıya referandum yapıyormuş gibi "Evet" veya "Hayır" seçenekleri sunuluyor. Demokrasinin gözünü seveyim ..
Kullanıcının hangi butona bastığına göre işlem yapabiliriz.
Eğer mesaj kutusundan cevap istiyorsak, bunu bir değişkene aktarmalıyız.
Genel Notasyon şu şekildedir ...

MsgBox("Kutunun içinde görünen Soru", "HangiButonların olacağı", "Mesaj Kutusunun Başlığı")

Kırmızı kısımları, canınız nasıl istiyosa, öyle doldurun. "Hangi butonların olacağı" kısmında, siz fonksiyonu yazarken, açılan bir listeden seçenekler sunulur. Ben bu listeden, VBYesNo'yu seçtim. Böylelikle, üstünde "Evet" ve "Hayır" yazan iki tane butonu oldu. Bu da ihtiyacımızı karşılıyor. Ama bir başka projede, bize vbYesNoCancel yani "Evet/Hayır/İptal" adlarında üç butonda lazım olabilirdi. O zaman; vbYesNoCancel'ı seçerdim.

Bu satırın sonunda, kullanıcının neye bastığını "Cevap" adlı değişkene yüklemiş ve dolayısıyla cevabı almış oluyoruz.

Şimdi de, aldığımız cevaba göre, durumu kontrol altına almamız lazım.
Eğer, Mesaj kutusunda "vbYesNo" parametresini kullandıysak, "Evet"e bamanın karşılığı vbYes, "Hayır"a basmanın karşılığı vbNo'dur.

9-1-3-Kod:If cevap = vbYes Then

Bu satırla da; aldığımız cevabın "Evet" olması halinde yapacağımız işlemi gerçekleştiriyoruz.
Eğer cevap Evet/vbYes ise; katliama başlayabiliriz.

9-1-4-Kod:Silinecek_Satir = ListBox1.ListIndex + 2

Önce, silinecek satır numarasını bulmamız gerekir. Yani, Listbox'ta seçtiğimiz satır, "Data" sayfasında kaçıncı satıra denk geliyor. ("+2" nin açıklamasını yapmıştık)

Evet, şu anda atış menziline girdik ve hedefe kilitlendik.
Şimdi de, bombayı salıyoruz...

9-1-5-Kod:Sheets("Data").Rows(Silinecek_Satir).Delete

Evet, bu tip satırlarda, hep hatırlıyoruz ki; Sheets("Data")'dan sonra, bir Range gelsin .... Sürpriz yaptım ... Gelmiyecek ..
Excel'de bir sayfanın Range'ini adreslerken; Sheets("Data").Range("A1") diye yazabiliyorken; neden komple bir satırı ifade etmek için, Sheets("Data").Rows(1) kullanmayalım .... Olur valla ...

9-1-6-Rows :

Kelime anlamı olarak "Satırlar" demektir. Ama, tek bir satırı da ifade edebilir. Mesela, Rows(1) veya Rows("1"), Komple 1.Satırı gösterir. Rows(2) veya Rows("2"), komple 2.Satırı, Rows("1:4") ise; 1,2,3,4 nolu satırları ifade eder.
Satırı bu şekilde belirttikten sonra; bu satırı yoketmek için sonuna "Delete" yazmamız yeterli ... Artık, bu satırı unutun ...
Daha sonraki, kod satırları da, tahmin edebileceğiniz gibi açılan IF lerin kapatılmasından ibarettir.

9-2-"Sil" işlemi ile birlikte, nasıl bütün TextBoxların içini boşaltırız ?

ListBox1'in DblClick olayında; TextBox'a bir değer atamak için söyle bir satır yazmıştık ...

Kod:
TextBox1.Text = Sheets("Data").Range("B" & Bulunan_Satir_No).Value
Bu; TextBox'ın içine, seçilen kişinin ismini alıp geliyordu. (Ahmet, Mehmet neyse ...)

Peki, aynı mantıkla;
TextBox1.Text="" yazsam nolur?

ÖRNEK 1:
If Cevap = vbYes Then
Silinecek_Satir = ListBox1.ListIndex + 2
Sheets("Data").Rows(Silinecek_Satir).Delete
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
End If

10-Userforma, neden bir tane "Temizle" veya "Yeni Kayıt" diye buton ekledik ?
Çünkü, TextBoxlar'daki verileri kaydederken (Kaydet butonuna basıldığında), bir ayrım yapmak zorundayız.

TextBox'lardaki veriler, "Data" sayfasına aktarılacak "YENİ" veriler mi, yoksa zaten varolan ama bizim Listbox'a tıklayıp, TextBox'lara yüklediğimiz "ESKİ" veriler mi?

Şimdi bir deneme yapalım ... ListBox'a çift tıklayıp, TextBoxlar'a ilgili kişini bilgilerini yükleyin. Şimdi de "Kaydet" butonuna basın ...
Neyle kaşılaştığınızı söyleyiniz ?

Siz, Textbox'lara "Data" sayfasındaki hangi kaydı gösterdiyseniz, onun bilgileri değişmiş olacak ... Bunun adı "Varolan Kaydı Düzeltme" veya "Revizyon"'dur ...
Dim Yeni_Mi as Boolean, Yeni_Mi=True/False gibi bir sürü şeyin kodlara eklendiği gördünüz ... Muhtemelen de karışık gelmiş olabilir. Ama inanın hiç karışık değil ... Sadece biraz mantık yürütmek yeterli ...

Amacımız; TextBox'larda bulunan bilgilerin; "Kaydet" butonuna basmadan önce; yeni mi veyahut halen kayıtlarda bulunan eski bir bilgi mi olduğunu anlayabilmek ...

Bir kere; yeni mi, eski mi nasıl ayıracağız ?
Biraz hafiyecilik oynayıp, bildiğimiz ipuçlarından çözümlemeye başlayabiliriz gibi ...
Herşeyi "Kaydet" butonuna endeksleyerek düşünün ... Aşağıda maddeleyeek anlatacağım herşey, "Kaydet" tuşuna basılmadan önce yapılan veya yapılabilecek işlerdir ...
1) Userform ilk açıldığında, TextBox'ların hepsi bomboş .... Daha sonra, TextBox'ları doldurdunuz ve "Kaydet" tuşuna bastınız ... TextBox'lardaki bilginin niteliği nedir?
a.Yeni b.Eski

2) "Yeni Kayıt" butonuna bastıktan sonra, TextBox'ların hepsi bomboş oldu ... Daha sonra TextBox'ları doldurunuz ve "Kaydet" tuşuna bastınız. TextBoxlardaki bilginin niteliği nedir?
a.Yeni b.Eski

3) "Sil" butonuna bastınız ve ListBox'ta görünen bir bilgiyi sildiniz ... Silme işleminden sonra, TextBox'ların hepsi boşaldı ... Daha sonra TextBox'ları doldurdunuz ve "Kaydet" tuşuna bastınız. TextBoxlardaki bilginin niteliği nedir?
a.Yeni b.Eski

4) ListBox'a Çift Tıkladınız ... TextBox'lara veriler yüklendi ve siz TextBoxlara yüklenen bilgileri değiştirdiniz. Örneğin, textBox'da Ali yazan ismi Ahmet yaptınız ve "Kaydet" tuşuna bastınız. TextBoxlardaki bilginin niteliği nedir?
a.Yeni b.Eski




Hüseyiи., CloundSand ve mulayimakca bunu beğendi.


Ze.uL isimli Üye şimdilik offline konumundadır   Alıntı
Alt 17 Nisan 2013, 15:49   #2 (permalink)
Death Surgeon

Hüseyiи. - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: 03 Ağustos 2011
Nerden: Karanlıklardan..
(Mesajlar): 8.363
(Konular): 2017
İlişki Durumu: Var
Burç:
Renkli Para : 403423
Aldığı Beğeni: 1924
Beğendikleri: 2408
Ruh Halim: Huzurlu
Takım :
ÖdülleriÜye Ödülleri: 1
Oscar Ödülü 
Standart

Eline sağlık, paylaşım için teşekkürler.





"Yürekten sevdiğin bir insan varsa, bir kişi olsun yeter,
hayatın kurtulmuş demektir…"
1Q84 - Haruki Murakami


Hüseyiи. isimli Üye şimdilik offline konumundadır   Alıntı
Reklam Alanı
Alt 31 Ağustos 2013, 10:14   #3 (permalink)
Üye

mulayimakca - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: 31 Ağustos 2013
(Mesajlar): 1
(Konular): 0
Renkli Para : 10
Aldığı Beğeni: 0
Beğendikleri: 1
Ruh Halim: none
Standart

"Varolan Kaydı Düzeltme" veya "Revizyon"' hakkında daha fazla bilgi verebilir misin?





Forumrenkli.com Türkiye'nin En Renkli Forumu !
mulayimakca isimli Üye şimdilik offline konumundadır   Alıntı
Reklam Alanı
Alt 04 Ekim 2013, 18:32   #4 (permalink)
Üye

Excelegitmeni - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: 25 Eylül 2013
(Mesajlar): 1
(Konular): 0
Renkli Para : 10
Aldığı Beğeni: 0
Beğendikleri: 0
Ruh Halim: none
Standart

teşekkürler





ÖZEL EXCEL EĞİTİMİ KURSU EĞİTMENİ

Konu Excelegitmeni tarafından (04 Ekim 2013 Saat 18:35 ) değiştirilmiştir..
Excelegitmeni isimli Üye şimdilik offline konumundadır   Alıntı
Yeni Konu Aç Cevap Yaz

Etiketler
anlatım, oluşturma, resimli, userform


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık


Forum Renkli Sosyal Medya
Forumrenkli Facebook Forumrenkli Twitter Forumrenkli RSS
Forum Renkli Desteklediklerimiz

Forum Renkli Yasal Uyarı!

Forum Renkli Türkiye'nin en renkli eğlence ve bilgi paylaşım platformudur. Hukuka, yasalara, telif ve kişilik haklarına bağlıdır. "5651 sayılı yasada" belirtilen "Yer Sağlayıcı" olarak hizmet sunmaktadır. İlgili yasaya göre site yönetiminin tüm içerikleri kontrol etme yükümlülüğü yoktur. Bu sebep ile sitemiz, uyarıları dikkate alarak yasa dışı paylaşımlar hakkında gerekli işlemleri yapmaktadır. Oluşabilecek yasal sorumluluklar "Üyelerimize" aittir.

Forum Renkli; Arkadaşlık, Dostluk, Eğlence, Paylaşım, Msn Nickleri, Msn Sözleri, Msn Avatarları, Ödüllü Yarışmalar, Msn Sözleri, Şiirler, Şarkılar, Moda, Sağlık, Tv, Dizi, Film, Komik, Komik Resimler, Komik Videolar, Haberler, Spor Haberleri ve Güncel Bilgi Paylaşımı gibi konuların kullanıcıları tarafından önceden onay almadan anında yayınlayabildikleri bir forumdur.

Copyright© 2011 - 2013, ForumRenkli.com® Tüm Hakları Saklıdır.


Forum Renkli Alexa Forum Renkli Sitemap



vBulletin® Version 3.8.7 ile güçlendirilmiştir.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd
Inactive Reminders By Realdizayn

Search Engine Optimization by vBSEO 3.6.1 ©2011, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557