Excel Forum
ALTIN ÜYELİK Hakkında Bilgi


Geri Git   Excel Forum > EXCEL-Soruları > Uygulamalı Excel Eğitimi
Atatürk
Şifremi Unuttum

DUYURU SİSTEMİ / REKLAM PANOSU

Uygulamalı Excel Eğitimi Bu başlıkta uygulamalı excel eğitimi verebilir yada verilen eğitimlere katılabilirsiniz. (Bu başlıkta yeni konu açılması onaya bağlıdır.)
Dosya ekleyebilirsiniz

Özel Arama


Yanıtla
 
Paylaş Konu Araçları Görünüm Modları
Eski 20-01-2011, 18:00   #1
pardus01
 
Giriş: 30/12/2010
Şehir: adana
Mesaj: 9
Excel Vers. ve Dili:
Excel 2010
Varsayılan Userform Resimli Detaylı Konu Anlatım

Ferhat Pazarçevirdi tarafından 2008 yılında anlatılan konular tarafımdan derlenerek okunabilir ve azami verim elde edilebilir şekilde redakte edilmiştir.

2. mesajda ise SORU-CEVAP şeklinde hazırlanan belge eklenmiştir.

Bu şekilde bir anlatım bulamadım ben başka biryerde; kendisine ve emeği geçen herkese teşekkürler..

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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
=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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
 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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
 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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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
pardus01 Çevrimdışı   Alıntı Yaparak Cevapla
Eski 24-01-2011, 09:37   #2
kagan.1299
 
Giriş: 23/10/2010
Şehir: mardin
Mesaj: 1
Excel Vers. ve Dili:
excel başlangıç
Varsayılan

kardeş Allah ne muradın varsa versin
kagan.1299 Çevrimdışı   Alıntı Yaparak Cevapla
Eski 24-01-2011, 10:08   #3
mustafakoker
Altın Üye
 
Giriş: 20/06/2008
Şehir: İstanbul/Maltepe
Mesaj: 633
Excel Vers. ve Dili:
Office 2010
Varsayılan

katkılarından dolayı tesekkur ederiz
__________________
Yolu,
Doğru Olanın.....
Yüküde,
Ağır Olur....!
mustafakoker Çevrimdışı   Alıntı Yaparak Cevapla
Eski 24-02-2011, 16:28   #4
EGZELL
 
Giriş: 14/02/2008
Şehir: istanbul
Mesaj: 132
Excel Vers. ve Dili:
2003 tr
Varsayılan

ellerinize sağlık, çok güzel bir çalışma olmuş...
EGZELL Çevrimdışı   Alıntı Yaparak Cevapla
Eski 06-03-2011, 14:56   #5
arifdurgut
 
Giriş: 21/02/2011
Şehir: elazığ
Mesaj: 8
Excel Vers. ve Dili:
2007
Varsayılan

Kardeş süper oldu fakat bir sorun var bazı resimler görünmüyor ayrıca listbox taki verileri düzeltmek isteyince yeni veri gibi algılıyor yardım edebilirmisin
arifdurgut Çevrimdışı   Alıntı Yaparak Cevapla
Eski 09-03-2011, 13:09   #6
arifdurgut
 
Giriş: 21/02/2011
Şehir: elazığ
Mesaj: 8
Excel Vers. ve Dili:
2007
Varsayılan

kardeş şöyle bir kod yazarsom
If Sheets("Sayfa2").Range("A2") <> Active Then
UserForm2 "TextBox3.Text" = Sheets(Sayfa2).Range("A3").Value
sayfa 2 de a2 hücresi aktif ise b2 hücresini userform 2 de textbox3 ün içinde görüntüleyebilirmiyim
arifdurgut Çevrimdışı   Alıntı Yaparak Cevapla
Eski 17-04-2011, 16:18   #7
mutemet68
 
Giriş: 16/11/2007
Şehir: aksaray
Mesaj: 8
Excel Vers. ve Dili:
dili türkçe versiyon ?
Varsayılan

selam kardeş ofis 2007 excelde nasıl olacak yazarsan menmun olurum.
mutemet68 Çevrimdışı   Alıntı Yaparak Cevapla
Eski 17-04-2011, 17:01   #8
Skorpiyon
Misafir
 
Mesaj: n/a
Varsayılan

Sayın mutemet68,

Visual Basic Düzenleyiciye Alt + F11 tuşları ile geçebilirsiniz.
  Alıntı Yaparak Cevapla
Eski 13-06-2011, 08:38   #9
rekkezum
 
rekkezum kullanıcısının avatarı
 
Giriş: 15/01/2008
Şehir: Vienna
Mesaj: 530
Excel Vers. ve Dili:
office 2013 Ingilizce
Varsayılan

Sayın Pardus01 öncelikle ellerine sağlık şahane bir çalışma olmuş
aynı konu ile ilgili eklediğim dosyaya bakıp yardımcı olabilirmisin?
forklift iconu na tıkladığında senin altattığın konu ile alakalı bir userform göreceksin kaydet e bastığında kaydetsin
ve sefe no ile kayıt edilenleri bulma ile alakalı bir dosya. yardıma ihtiyacım var
şimdien çok teşekkür ederim
Eklenmiş Dosyalar
Dosya Türü: rar gelen.rar (424.7 KB, 1316 Görüntülenme)
rekkezum Çevrimdışı   Alıntı Yaparak Cevapla
Eski 29-06-2011, 15:01   #10
neutralking
 
Giriş: 29/06/2011
Şehir: İstanbul
Mesaj: 2
Excel Vers. ve Dili:
Excell xp vb
Varsayılan

Pardus arkadaşım çok teşekkür ederim. Keşke her anlatım bu kadar detaylı olsa.

Çok güzel bir açıklama olmuş. Çok net ve anlaşılır. Çookkk sağolasın...
neutralking Çevrimdışı   Alıntı Yaparak Cevapla
Yanıtla


Konu Araçları
Görünüm Modları

Gönderme Kuralları
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Açık
SimgelerAçık
[IMG] kodu Açık
HTML kodu Kapalı


Saat 02:07


Bu forum Elit NET - www.elitnet.com.tr tarafından sunulmaktadır.

Excel Eğitimi - Mobil Uygulama - Çorlu - Çorlu Web Tasarım - Tarot Falı - invest in turkey - Lingerie - Dyeing Machine - Karton Bardak- Çorlu Özel Eğitim- Site Yönetimi- Led Aydınlatma- Pronet Tekirdağ- Çorlu Kamera- Pronet Edirne- Pronet Kırklareli- Pronet Çerkezköy- Pronet Çorlu- Pronet Lüleburgaz- Pronet Keşan- Çorlu Araç Takip- Çorlu Su Arıtma- Boru Profil- Gebze Emlak- Beylikdüzü Temizlik- İstanbul Burun Estetiği- Bakır Sülfat- Rampa- Rotary- Çorlu İnternet Sitesi- youngblood- Çorlu Palet- Çerkezköy Palet- Çorlu Prefabrik- Çorlu Sürücü Kursu- Çorlu Sandviç Panel- Şişli Avukat- Korona Test Kalemi- Çorlu Vinç- Çorlu Pimapen Tamiri- Çorlu Çelik Konstruksiyon-
Powered by vBulletin Version 3.7.2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Advertisement System V2.6 By   Branden