13 Şubat 2016 Cumartesi

VB Kullanıcı Yönlendirme ile Excel’den Uygulamanızın Veritabanına Kayıt Aktarma

Kullanıcıdan veritabanımıza girip Access Dosya Menüsü> Al yolu ile Excel dosyasını aktarmasını isteyemeyeceğimize göre Excel'den veri almamız gerekirse kullanıcıya bunu nasıl yaptıracağız? Yazımda bunu anlatmaya çalıştım.
Kullanıcı Yönlendirme ile Excel’den Uygulamanızın Veritabanına Kayıt Aktarma
            Normal durumda Access’e Excel’den veri aktarmak için Access Veritabanının Dosya Menüsünden Dış Veri Al>Al seçenekleri ile açılan pencereden, dosya tipini Excel’e çevirerek seçim yaparsınız ve Access sizi verilerin aktarılması konusunda yönlendir. Bir uygulama hazırladığınızda, veri giriş sayfanız varsa ve kullanıcı aynı anda bir sürü veri girişi yapacaksa, kullanıcıdan bunları tek tek uygulama pencerenizden girmesini, yada Access veritabanınızı açarak yukarıdaki gibi Excel’de kayıtlı verilerini aktarmasını bekleyemezsiniz. Aşağıda Access’in yönlendirmesine benzer bir yönlendirme ile kullanıcıya bu işin nasıl yaptırılabileceğinin küçük bir örneği var. Tasarım ve kodlama çok basit. Dolayısıyla geliştirilmeye açık.
Ön Bilgiler:
            Uygulamanın bu bölümünün amacı, Access veritabanı ile bağlantılı çalışan ana uygulamamıza kullanıcının bir Excel dosyasında listelediği öğrenci bilgilerini veritabanımıza aktarmak. Bu yüzden deneme yapmadan önce bir veritabanımızın olması gerektiği açık. Buradaki veritabanı uygulamanın bulunduğu klasörde açılmış Veri adlı klasör içerisinde saklanan vtÖSS adlı Access veritabanı. Veritabanının kullanılan tablosu tblÖgrenciBilgileri (Şekil1). Yeniden tasarlamak isterseniz, bu tablonun alanlarını ve alan özelliklerini Şekil2’de görebilirsiniz.
           

Şekil 1


Şekil 2

Form
            FormName      : frmExcel
FormCaption  : EXCEL’den öğrenci aktarımı
BorderStyle    : 1-Fixed Single
Form Kontrolleri
            Forma 1 SStab ve 1 PictureBox yerleştiriyoruz. Özellik ayarlamalarını aşağıda gösterildikleri şekilde yapıyoruz.
            **************************************
            1) SSTab (Properties)
                        Tabs                            : 4
                        TabsPerRow               : 4
                        TabOrientation           : 1-ssTabOrientationBottom

                        Tab1  (Tabların Captionlarının çok önemi yok)
                                   Caption           : “DOSYAYOLU”
                        Tab2
                                   Caption           : “ALANLAR”
                        Tab3
                                   Caption           : “KONTROL”
                        Tab4
                                   Caption           : “AKTARMA”

            Tab1 Üzerine 1 Label, 1 TextBox, 1 CommandButton ve 1 CommonDialog  yerleştiriyoruz (Şekil3).
                        Label1 Caption                      : “Aşağıdaki alana verilerinizin bulunduğu Excel dosyasının yolunu girin yada GÖZAT butonu ile açılacak pencereden seçim yapın...”
                        Label1 FontSize                     : 12

                        TextBox Name                       : txtYol

                        CommandButton Name         : cmdGözat
                        CommandButton Caption     : “Gözat”

CommonDialog Name           : Common


Şekil 3

            Tab2 üzerine 1 CheckBox, 2 ComboBox, 2 MSFlexGrid, 2 CommandButton yerleştiriyoruz (Şekil4).
                        ChechBox Name                               : chkSütunBaşı
                        CheckBox Caption                            : “İlk satır sütun başlıklarını içeriyor”

                        MSFlexGrid1 Name                          : grdExcel
                        MSFlexGrid1 Rows                          : 5
                        MSFlexGrid1 Cols                            : 3
                        MSFlexGrid1 FixedCols                   : 0
                        MSFlexGrid1 FixedRows                 : 0
                        MSFlexGrid1 Selection Mode          : 2-By Column

                        MSFlexGrid1 Name                          : grdEşleme
                        MSFlexGrid1 Rows                          : 2
                        MSFlexGrid1 Cols                            : 4
                        MSFlexGrid1 FixedCols                   : 0
                        MSFlexGrid1 FixedRows                 : 1
                        MSFlexGrid1 Selection Mode          : 0-Free

                        Command1 Name                              : cmdBağla
                        Command1 Caption                          : “Bağla”
                        Command2 Name                              :cmdAtla
                        Command2 Caption                          : “Sütun Atla”


Şekil 4

            Tab3 üzerine 4 Label, 2 ListBox ve 1 CheckBox yerleştiriyoruz (Şekil5).
                        1.Label Caption (Label2)       : “Excel sütunlarındaki bilgiler, aşağıda yeniden gösterilmiş olan eşleştirmelerinize göre veritabanına aktarılacaktır. Lütfen eşleştirmelerinizi dikkatlice kontrol ediniz. yanlışlık yaptığınızı düşünüyorsanız, "<Geri" butonunu tıklayarak gerekli düzeltmeyi yapınız. Eşleştirmelere onay veriyorsanız Onay kutusunu işaretledikten sonra  "İleri>" butonunu tıklayınız."
                        1.Label (Label2) FontSize     : 10
                        2.Label (Label3) Caption       : “Dikkat ! Yanlış eşleştirmelerde tüm verileriniz yanlış alanlara aktarılabilecek, yada işlem tamamlanamayacaktır.” 
                        3.Label (Label4) Caption       : “Excel Sütunları”
                        4.Label (Label5) Caption       :  “Veri Alanları”
                       
                        ListBox’ları dizi olark ayarlıyoruz.
                        ListBox1 Name          : lstEşleme
                        ListBox1 Index          : 0
                        ListBox2 Name          : lstEşleme
                        ListBox2 Index          : 1

                        CheckBox Name        : chkOnay
                        CheckBox Caption     : “Eşleştirmelerim doğru. Devam edebilirim.”
                       

Şekil 5

            Tab4 üzerine 2 Label, 2 ListBox yerleştiriyoruz (Şekil6).
                        1.Label (Label7) Caption       : “Aktarım başladı”
                        1.Label (Label7) FontBold    : True
                        2.Label (Label8) Caption       : “Excel dosyanızda listelenmiş olan öğrenci bilgileri, uygulamaya aktarılıyor. Lütfen işlem tamamlanana kadar bekleyiniz...”

                        1.ListBox Name                     : lstSütunIndex
                        1.ListBox Visible                   : False
                        2.ListBox Name                     : lstAlanIndex
                        2.ListBox Visible                   : False


Şekil 6
**************************************
            1) Picture1 (Properties)
                        Picture1 Align                        : 2-Align Bottom
            Picture1 üzerine 3 CommandButton yerleştiriyoruz. Ve Bunları bir dizi haline getiriyoruz.
            1.Command Name     : cmdButon
            1.Command Caption  : “<Geri”
            1.Command Index     : 0
1.Command Visible   : False
            2.Command Name     : cmdButon
            2.Command Caption  : “İleri>”
            2.Command Index     : 1
            2.Command Enabled : False
            3.Command Name     : cmdButon
            3.Command Caption  : “İptal”
            3.Command Index     : 2


Kontrolleri forma yerleştirdikten sonra ilk taba geçiş yapıyoruz (Form açıldığında bu tab ile başlaması için) ve SSTab’ı alttan çekerek PictureBox’ın altına kadar uzatıyoruz. Sonra SSTab üzerinde Mouse ile sağ tıklayarak Send To Back komutunu veriyoruz ki PictureBox, tabımızın başlıklarını kapatsın. (Şekil7)


Şekil 7
            İşin esas yorucu ve sıkıcı kısmını atlatmış oluyoruz. Şimdi programın işleyişini ve aşama aşama kodları görebiliriz.
Öncelikle Project>Preferences seçenekleri ile açılan pencereden Microsoft Excel 10.0 Object Library (Sizde Excelin farklı bir versiyonu olabilir, bu durumda örneğin Microsoft Excel 11.0  Object Library gibi bir şey ararsınız. Bendeki Office XP idi).
Sonrasında Formun Option Explicit kısmında gerekli tanımlamaları yapalım. Burada tanımlayacağımız değişkenler, örneğin Formun Load olayında atanan bir değeri, bir ListBox’ın Click olayında kullanmak istediğimizde başvuracağımız değişkenlerdir. Bu değişkeni Form_Load içerisinde tanımlarsak, ona atanan değeri formun (yada başka bir kontrolün) diğer olaylarında kullanamazdık.

Option Explicit
      'Tüm form içerisinde farklı yordamlarda aynı şekilde kullanılacak değişkenler tanımlanıyor.
Dim Ex As Excel.Application ‘Excel dosyamızı açmamızı sağlayacak tanımlama
DosyaAdi As String ‘Excel Dosyamızın tam yolunu bu değişkene atayacağız.
Dim alan(10) As Integer, sr As Long, ilkhücre As String, başvuru As Integer, st As Long
Dim tabNo As Integer
Dim Bağlantı As Connection ‘Veritabanı ile bağlantı için
Dim KayıtSetiÖğrenci As Recordset ‘Veritabanındaki bir tabloya bağlantı için
Dim sqlMetni As String ‘Tabloyla bağlantı kurarken oluşturacağımız sorgu metni için
Dim ExVar As Boolean ‘Sistemimizin bir Exel Aplication ataması durumunda True değerini alacak.

1.Aşama         : Formun yüklenişi

Private Sub Form_Load()
'Veritabanı bağlantısını kur
1           Set Bağlantı = New ADODB.Connection
2                 Bağlantı.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & App.Path & "\Veri\vtÖSS.mdb"
'Kayıtseti oluştur
3                 sqlMetni = "SELECT * FROM tblÖgrenciBilgileri WHERE (((tblÖgrenciBilgileri.Okul)='" & Trim(mdlAyar.kurum) & "') AND ((tblÖgrenciBilgileri.ArşivYılı)=" & Trim(mdlAyar.MezuniyetYılı) & ")) ORDER BY Adı;"
4           Set KayıtSetiÖğrenci = New ADODB.Recordset
5                 KayıtSetiÖğrenci.Open sqlMetni, Bağlantı, adOpenKeyset, adLockOptimistic
'Tabno değişkenini sıfıra ayarla
6           tabNo = 0
'grdEşleme için biçim ayarları yap
7           grdEşleme.ColWidth(0) = 1450
8           grdEşleme.ColWidth(1) = 1450
9           grdEşleme.ColWidth(2) = 0
10          grdEşleme.ColWidth(3) = 0
11          grdEşleme.CellAlignment = 0
'grdEşleme gridinin başlıklarını ayarla
12          grdEşleme.Row = 0
13          grdEşleme.Col = 0
14          grdEşleme.Text = "Sütun" '1.Sütunun başlığı
15          grdEşleme.Col = 1
16          grdEşleme.Text = "Alan" '2.Sütunun başlığı
'Kayıtsetindeki alanların isimleri eşleşme için Combo2 listesine yazdır
17          Combo2.Clear
18          For i = 1 To KayıtSetiÖğrenci.Fields.Count - 1
19                Combo2.AddItem KayıtSetiÖğrenci.Fields(i).Name
20          Next
End Sub

Aslında kodların ne yaptığı içerisindeki açıklamalarda anlatılıyor. 1. ve 2. satırlarda veritabanımız ile bağlantıyı oluşturuyoruz. 3. Satırda kayıtsetimiz için bir seçme sorgusu oluşturuyor, 4. Satırda kayıtsetimizi tanımlıyor ve 5. satırda da sorgumuzu kullanarak tanımladığımız kayıtsetimizi açıyoruz. Sonrasında grdEşleme için gerekli biçim ve içerik ayarlamalarını yapıyoruz. 9. ve 10. satırlarda görülebileceği üzre grdEşleme gridinde 3. ve 4. sütunları gizliyoruz (Genişliği ‘0’ yaparak). Çünkü kullanıcı alan eşlemesi sırasında, ekranda o seçtiği alanların textlerini görürken, biz bu gizli olan sütunlara seçilen sütunun Combo index numarası ile seçilen alanın Field index numarasını yazdırıp işlerimizi kolaylaştıracağız.
Alanları gösterebilmek için de kayıtsetinini her bir alanının adını Combo2’ye aktarıyoruz. İlk alan otomatik sayı alanımız olduğundan ve kullanıcı bunun için değer belirleyemeyeceğinden dolayı, ilk alanı (Fields(0)) atlıyoruz. Böylelikle Combo2’deki her elemanın index numarası alan indexinin 1 küçüğü olmuş oluyor.

2.Aşama         : Formumuz yüklendikten sonra…
            Form yüklendiğinde kullanıcı ekranda, kendisinden, kayıtlarını sakladığı Excel dosyasının tam yolunu ilgili kutucuğa girmesi istenen ilk bölümle karşılaşacaktır. Bu durumda “Geri” butonu gizli ve “İleri” butonu da pasiftir. Kullanıcı bir dosya yolu belirlemeden ilerlenemez. Kullanıcı text kutusuna dosyanın tam yolunu kendi girebileceği gibi, Göz at butonu ile açılacak Aç Dialog Penceresinden de yararlanabilir.

 Private Sub cmdGözat_Click()
'Tab0 'da dosya seçiminde "Gözat" düğmesi tıklanınca
1    Common.DialogTitle = "Excel dosyasını seç"
2    Common.Filter = "Excel dosyaları|*.xls"
3    Common.InitDir = App.Path
4    Common.ShowOpen
5    txtYol.Text = Common.FileName
End Sub

Görüldüğü gibi kullanıcının karşılaşacağı “Aç Dialog Penceresi” nin başlığına 1.Satırda istediğimiz bir stringi atıyoruz. 2.satırda seçim için listelenmesini istediğimiz dosya türü için ayarlama yapıyoruz. (Common.Filter ayarlamasındaki ‘|’ simgesini Alt + 124 tuş kombinasyonu ile oluşturabilirsiniz). 3.Satırda Aç Dialog Penceresi görüntülendiğinde hangi klasöre odaklanacağını belirliyoruz. Burada biz uygulamamızın olduğu klasöre odaklanmasını istedik. Sonrasında kullanıcının seçtiği dosyanın tam yolunu text kutumuza aktarıyoruz.
Eğer kullanıcı elle yada aç diyalog penceresi ile Text kutusuna bi yol girdiğinde “İleri” butonumuz aktif hale geliyor. Kullanıcı bu butona tıklayınca neler olacak?

3.Aşama         : İkinci Taba ilerleyiş.
İleri, Geri ve iptal butonlarının tıklanması ile aşağıdaki yordam tetiklenecek. Buraya sadece 1.taba doğru ilerlendiğinde gerçekleşecek oly kodlarını yazdım. Şimdilik Buton tıklama kodumuz böyle.
Private Sub cmdButon_Click(Index As Integer)
'İleri, Geri ve İptal butonları
1    Select Case Index
2        Case 0 'Geri butonu
             ‘Geri Butonu tıklanınca olacak olaylar
             ‘Bu bölümün kodları 5.Aşama’da yerleştirilecek
3            End If
4        Case 1 'İleri butonu
5                tabNo = tabNo + 1
6                cmdButon(0).Visible = True
7                Select Case tabNo                   
8                    Case 1 'İkinci Tab (Tab1). Excel dosyasından örnek gösterilecek ve sütun-Alan eşleştirmeleri yapılacak
9                        DosyaAdi = txtYol.Text
10                       If Dir(DosyaAdi) = "" Then
                        'Dosya yoksa bunu kullanıcıya bildir ve ilerleme
11                          MsgBox "Belirttiğiniz dosya bulunamadı. Lütfen dosya yolunu kontrol edin.", vbCritical, "DOSYA BULUNAMADI!"
12                           tabNo = tabNo - 1
13                       Else
                        'Dosya varsa işlemleri yap
                            'Bir excel şablonu yarat
14                           Set Ex = CreateObject("Excel.Application")
15                           ExVar = True
                            'Excel dosyasını bu şablonla aç
16                           Ex.Workbooks.Open (DosyaAdi)
17                           Ex.Visible = False
 18                              st = 0
 19                               grdExcel.Row = 0
                                'Boş bir sütuna rastlayıncaya kadar
                                'İlk Excel satırını gridin ilk satırına al
 20                              While Ex.Cells(1, st + 1) <> ""
 21                                   grdExcel.Cols = st + 1 'Exceldeki sütun sayısına göre, griddeki sütunu arttır
 22                                   grdExcel.Col = st
 23                                   grdExcel.Text = Ex.Cells(1, st + 1)
 24                                   st = st + 1
 25                               Wend
                            'Sonra excelden 4 satır daha al örnek olsun diye
 26                           For i = 1 To 4
 27                               For j = 0 To grdExcel.Cols - 1
 28                                   grdExcel.Row = i
 29                                   grdExcel.Col = j
 30                                   grdExcel.Text = Ex.Cells(i + 1, j + 1)
 31                               Next
 32                           Next
                            'Excel çalışma kitabını kaydetmeden kapat
 33                           Ex.Workbooks(1).Close (False)
                            'Şablonu da kapat ve sıfırla
 34                           Ex.Application.Quit
 35                           Set Ex = Nothing
                            'Excelin ilk satırının sütun başı olup olmamasına göre
                            'İlk satırıyla yada sıralı olarak sütun numaralarıyla
                            'Combo1 listesini oluştur tabi önce Combo1'i boşalt
 37                           Combo1.Clear
 38                           grdExcel.Row = 0
 39                           For i = 0 To grdExcel.Cols - 1
 40                               grdExcel.Col = i
 41                               If chkSütunBaşı.Value = 1 Then
 42                                   Combo1.AddItem grdExcel.Text
 43                               Else
 44                                   Combo1.AddItem i + 1 & ".Sütun"
 45                               End If
 46                           Next
                            'Combo1'i ilk elemanı görüntülenecek şekilde ayarla
 47                           Combo1.ListIndex = 0
                           
 48                           grdEşleme.Col = 0
                            'Combo1 içerisindeki elemanları sırası ile
                            'gdrEşlemenin ilk sütununa aktar
 49                           For i = 0 To Combo1.ListCount - 1
 50                               grdEşleme.Rows = i + 2
 51                               grdEşleme.Row = i + 1
 52                               grdEşleme.Text = Combo1.List(i)
 53                               grdEşleme.CellAlignment = 0
 54                           Next
 55                       End If
 56                  Case 2 '3.Tab (Tab2). Eşleşmelerin kontrolü istenecek, onay verilirse işlem devam edecek.
                        ‘3.Taba doğru ilerlenmişse olacak olaylar
                        ‘Bu bölümün kodları 4.Aşama’da yerleştirilecek
 57                   Case 3 '4.Tab (Tab3). Son tab.
                        ‘Son Taba gelinmişse olacak olaylar
                        ‘Bu bölümün kodları 6.Aşama’da yerleştirilecek
 58              End Select
                'Ön hazırlıkları yukarıdaki bölümlerde yaptıktan sonra
                'Hazırlığı yapılmış Tab'ı göster
 59              SSTab1.Tab = tabNo
 60      Case 2 'İptal butonu
            ‘İptal butonuna tıklayınca olacak olaylar
 61   End Select
End Sub

            Uygulamamız tıklanan butonu Index değişkeninden öğrenip, Select-End Select bloğu içerisinde değerlendirecek. Eğer ‘İleri’ butonuna tıklanmışsa uygulama Case 1 olan bölüme gidecek ve öncelikle tabNo değişkenini 1 arttıracak. Bu arada eğer ‘Geri’ butonu gizli ise onu görünür hale getirecek. Sonra yine Select – End Select bloğu ile hangi taba doğru ilerlendiğini bulacak. Bunu TabNo değişkeninden öğrenecek ve ona göre ilgili tabın kodlarını çalıştıracak. Biz tab2’ye doğru ilerlediğimizden Tab2’nin TabIndex’i 1 olacağından TabNo değişkeninin değeri de 1 olacaktır. Bir karışıklık olmaması açısından Tab’ları isimleri ile belirtmeyi uygun görüyorum. Gitmek istediğimiz tab “ALANLAR”. Uygulama bu tabı göstermeden önce ayarlamalarını yapacak. 9.Satırda text kutusundaki değeri DosyaAdi değişkenine aktararak,  10. satırda bir dosya yolu belirtilip belirtilmediğini kontrol ediyoruz. Eğer bir dosya belirtilmemiş yada belirtilen dosya bulunamamışsa 11. satırla kullanıcıyı uyarıyoruz, 12. satırla da değerini arttırdığımız TabNo değişkenini tekrar 1 azaltıyoruz ki uyarı işlemleri sonrası ekran dosya seçim penceresinde kalsın.
            Eğer bir dosya belirtilmiş ve belirtilen dosya bulunmuşsa, yeni bir Excel applicationu yaratıyoruz, applicationun yaratıldığını uygulamaya bildiriyoruz ( ExVar=True) ve bu application ile belirtilen dosyayı açıyoruz (Satır 14-17).
            Şimdi sıra geldi, kullanıcıya örnek bir seçim alanı göstermek. Amacımız uygulama penceremizde kullanıcının Excel listesinin bir örneğini göstererek, çalışmaları kolaylaştırmak. Bunun için Excelin ilk satırını, boş bir sütuna rastlayıncaya kadar hücre hücre grdExcel’in ilk satırına yazdırıyoruz (Satır 20-25). While Ex.Cells(1, st + 1) <> "" kodu seçilen Excel hücresi boş olduğunda döngüye girilmemesini sağlar. Biz grid için 3 sütun tanımlamıştık. Bu yüzden eğer Exceldeki sütun sayısı bundan fazla ise, grideki sütunları da buna göre arttırıyoruz. Buna dikkat etmek gerekir. İlk satırı aktardıktan sonra, sütun sayısını bilmenin verdiği rahatlıkla kolay bir şekilde 4 satır daha aktarıyoruz ki 5 satırlık bir örneğimiz olsun, göz doldursun. (Satır 26-32). Bu işlem sırasında iç içe 2 For-Next döngüsü kullandık. Dıştaki döngü satırlar arasında ilerlemeyi gerçekleştirirken, içteki döngü ile hali hazırdaki satırın sütunlarında ilerlememizi sağlıyoruz. grdExcel ile kullanıcıya Excel dosyasının basit bir örneğini göstermiş oluyoruz.
           
Not: Bir gridde bir hücrenin özelliklerine ulaşmak için önce satır ve sütun numaraları belirtilir, sonra örneğin içindeki yazı öğrenilir, değiştirilir, hücre biçimlendirilir vs. 3.Satır, 5.Sütunda yer alan hücre içerisine, bu hücrenin sütun ve satır numaralarını şöyle yazdırabiliriz
            Grid.Row = 2
            Grid.Col = 4
Grid.Text =  Grid.Row + 1 & “.Satır “ & Grid.Col + 1 & “.Sütun” (Yada direkt 3.Satır 5.Sütun)

            Satır 33-35 arası Excel sayfasının kapatılması ve yarattığımız şablonların bellekten atılması için.
            37. ve 46. satırlar arasında Excel sayfasının (yada grdExcel gridinin) ilk satırını hücre hücre Combo2’ye kontrol ederek yüklüyoruz. Şöyle ki, eğer chkSütunBaşı onay kutusu işaretlenmişse, yani ilk satır excelde sütun başlıklarını anlatıyorsa hücredeki değeri, değilse sırasıyla 1.Sütun, 2.Sütun gibi değerleri yazdırıyoruz. Ardından da ilk elemanı seçili hale getiriyoruz.
            Eşleşmeleri yazdırıp görüntüleyeceğimiz yer ise grdEşleme. Bu yüzden Combo1’e eklediğimiz elemanları, grdEşleme’nin ilk sütununa, her biri bir satıra gelecek şekilde yazdırıyoruz. Tabi burada da satır sayısını arttırmayı unutmuyoruz. Küçük bir biçimleme için de hücre hizalamasını sağa yanaşık yaptırıyoruz.
            Sonra 59 satıra atlayıp TabNo ön hazırlığı yapılmış olan Tabı SSTab1.Tab=TabNo atanması ile görüntülüyoruz.
            Artık kullanıcı sütunları alanlarla eşleştirmeye hazır. Ama önce Exceldeki ilk satırın sütun başlarını tuttuğunu belirtebilir. Bunu chkSütunBaşı onay kutusunu işaretleyerek yapacak.

Private Sub chkSütunBaşı_Click()
'Excel sayfasındaki ilk satırın
'Sütun başlıkları olup olmadığına dair onay kutusu
'Onay kutusu işaretli ise, ilk satır başlık satırı demektir
1    If chkSütunBaşı.Value = 1 Then
     'İlk satır başlıkları içeriyorsa
     'Griddeki (grdExcel) satırı başlık formatına getir
2        grdExcel.FixedRows = 1
3    Else
    'İlk satırda da normal kayıt varsa
    'Griddeki ilk satırı da normal yap
4        grdExcel.FixedRows = 0
5    End If
   
6    Combo1.Clear
7    grdExcel.Row = 0
8    grdEşleme.Col = 0
    'İlk satırın durumuna göre Combo1 ve grdEşleme dolduruluyor
9    For i = 0 To grdExcel.Cols - 1
10        grdExcel.Col = i
11        If chkSütunBaşı.Value = 1 Then
        'İlk satır sütun başlıklarını içeriyorsa
        'Combo1'i ve grdEşleme'nin ilk sütununu
        'Bu başlıklarla doldur
12            Combo1.AddItem grdExcel.Text
13            grdEşleme.Row = i + 1
14            grdEşleme.Text = grdExcel.Text
15        Else
        'Excelde başlık yoksa
        'Excel sütunlarını 1.Sütun, 2.Sütun ... n.Sütun diye adlandır
        've igili yerleri bunlarla doldur
16            Combo1.AddItem i + 1 & ".Sütun"
17            grdEşleme.Row = i + 1
18            grdEşleme.Text = i + 1 & ".Sütun"
19        End If
20    Next
    'Combo1'de ilk sütunun adını görüntüle
21    Combo1.ListIndex = 0
End Sub
           
Her şey açık. Eğer ilk satırın sütun başı olup olmaması durumu değiştirilmişse (veya ilk defa belirleniyorsa) Combo1 deki ve grdEşleme içerisindeki sütun adları değiştiriliyor. Bir de farklı olarak, eğer ‘İlk satır sütun başlıklarını tutar’ denmişse, yani chkSütunBaşı value değeri 1 ise, grdExcel deki ilk satır FixedRow yapılıyor. Yani başlık satırı. (Satır 2)
            Şimdi kullanıcımız verileri eşleştirebilir. Yani ecxelin hangi sütunundaki bilgiler, tablomuzun hangi alanına kaydedilecek. Bunun için kullanıcı Combo1’den Excel sütununu, Combo2’ den de tablo alanını seçecek ve “Bağla” butonuna tıklayınca seçilen sütun için, seçilen alanın bilgisi, grdEşleme içerisinde belirtilen sütunun karşısındaki hücreye yazdırılacak.

Private Sub cmdBağla_Click()
    'Combo1'den seçilen Excel sütunu ile
    'Combo2'den seçilen Kayıtseti alanı eşleştiriliyor
    'Bu eşleştirme grdEşleştirme içerisinde gösteriliyor
    'Ayrıca işlem yapmada kolaylık olması açısından
    'Excel sütun numarası ve Field indexi de grdEşleme içerisideki
    'gizli sütunlara aktarılıyor. Son aşamada bu gizli olanlar kullanılacak
1     grdEşleme.Col = 1
2     grdEşleme.Row = Combo1.ListIndex + 1
3     grdEşleme.Text = Combo2.Text
4     grdEşleme.Col = 2
5     grdEşleme.Row = Combo1.ListIndex + 1
6     grdEşleme.Text = Combo1.ListIndex + 1
7     grdEşleme.Col = 3
8     grdEşleme.Row = Combo1.ListIndex + 1
9     grdEşleme.Text = Combo2.ListIndex + 1
10    If Combo1.ListIndex < Combo1.ListCount - 1 Then
11        Combo1.ListIndex = Combo1.ListIndex + 1
12    End If
End Sub

            Burada vurgulanması gereken iki nokta var. Birincisi kullanıcı alanların bağlanmasını istediğinde Combo1’ de seçilen elemanın index numarasının bir fazlasının grdEşlemenin 3. yani ilk gizli sütununa (Satır 4-6), Combo2’ de seçilen elemanın index numarasının bir fazlasının da gridin 4. yani 2.gizli sütununa yazdırılıyor olması Satır 7-9). İkincisi de kullanıcıya kolaylık olması açısından, Combo1 deki seçimin bir sonraki elemana geçirilmesidir. Bu işlem de son elemanda olunup olunmadığı kontrol edilerek 10. ve 12. satırlar arasında gerçekleştirilir.
            Kullanıcı, Excele, uygulama veritabanına aktarılmayacak fazladan bir sütuna veri girmiş ve bunun bağlanmasını istememişse onunla hiç işlem yapmayabilir yada o sütun Combo1’de görüntülendiğinde Sütun Atla butonunu tıklayabilir.

If Combo1.ListIndex < Combo1.ListCount - 1 Then
        Combo1.ListIndex = Combo1.ListIndex + 1
End If

            Kullanıcı eşleşmeyi de belirttiğine göre ilerlemesi için bir engel yok gibi.

4.Aşama         : 3.Tab “KONTROL”
            İleri butonu tıklandığında yine “KONTROL” tabına geçilmeden önce hazırlık yapılacak. Nedir bu hazırlık? grdEşlemenin 1. ve 2. sütunlarına yazdırılmış olan sütun ve alan değerlerinin lstEşleme liste kutularına aktarılması.
Üçüncü aşamada ilk ilerleme işlemimizde kodun genelini vermiştim. Şimdi orada varolan boşluklardan birini dolduruyoruz.
 54                           Next
 55                       End If
 56                  Case 2 '3.Tab (Tab2). Eşleşmelerin kontrolü istenecek, onay verilirse işlem devam edecek.
                        '3.tabdaki (tab2) listeleri sıfırla
 1                       For i = 0 To 1
 2                           lstEşleme(i).Clear
 3                       Next
                         'grdEşleme içerisine yazdırılmış olan eşleşmeleri bu listelere aktar
 4                       grdEşleme.Col = 1
 5                       For i = 0 To Combo1.ListCount - 1
 6                           lstEşleme(0).AddItem Combo1.List(i)
 7                           grdEşleme.Row = i + 1
 8                           lstEşleme(1).AddItem grdEşleme.Text
 9                       Next
                        'İlerlemeyi engelle (Şimdilik)
 10                       cmdButon(1).Enabled = False
                        'İlerleme ancak eşleşmelerin doğru olduğuna dair olan onay kutusu işaretlenirse mümkün olacak
 57                   Case 3 '4.Tab (Tab3). Son tab.
                        ‘Son Taba gelinmişse olacak olaylar
 58              End Select
                'Ön hazırlıkları yukarıdaki bölümlerde yaptıktan sonra
                'Hazırlığı yapılmış Tab'ı göster
 59              SSTab1.Tab = tabNo
 60      Case 2 'İptal butonu

Satır 1-3 arası listeler temizleniyor. 5-9 arasında da değerler listelere aktarılıyor. chkOnay kutusu işaretlenene kadar da ilerleme engelleniyor (cmdButon(1).Enabled = False). 59. satırda yine önceden söylendiği gibi Tab gösterime sunuluyor.

Kullanıcı eşleştirmelerin doğru olduğunu belirtmek için chkOnay kutusunu işaretlemeli.

Private Sub chkOnay_Click()
'Sütun-Alan eşleştirmelerinin doğruluğuna dair teyit isteyen onay kutusu
1 Dim mesaj As String
2 Dim cevap
3 var = False
4    If chkOnay.Value = 1 Then
     'Eşleştirmeler doğru ise işleme devam et
5           cmdButon(1).Enabled = True
6   Else
        'Onay alana kadar ilerleme yasağı getir
7       cmdButon(1).Enabled = False
8   End If
End Sub

Onay kutusunu işaretledikten sonra ileri butonunu tıklayarak işlemi devam ettirebilir. Diyelim ki eşleştirmeleri yanlış ve bunu düzeltmek istedi. O zaman geri butonu ile bir önceki taba dönecek.

5.Aşama         : Geri dönüş
Bu aşamada Geri butonu tıklanınca ne yapar ona bakalım.
Private Sub cmdButon_Click(Index As Integer)
'İleri, Geri ve İptal butonları
    Select Case Index
        Case 0 'Geri butonu
1            tabNo = tabNo - 1
2            cmdButon(1).Enabled = True
3            If tabNo = 0 Then
4               cmdButon(0).Visible = False
5            End If
6            SSTab1.Tab = tabNo
        Case 1 'İleri butonu
                tabNo = tabNo + 1

Oldukça basit. TabNo bir azaltılıyor, ileri butonu aktifleştiriliyor ve eğer ilk taba geri dönülmüşse, Geri butonu gizleniyor. Sonra da Tab gösteriliyor.

Varsayımımıza göre kullanıcı yanlış eşleştirmeler yapmıştı. Geri döndü ve bunları düzetti İleri butonunu tıkladı KONTROL sayfasına geldi, kontrol etti ve doğru görerek İleri butonunu tekrar tıkladı.
            Bu tıklama ile kullanıcı son aşamaya geçiş yapmak üzere. Artık kayıtlar veritabanına aktarılacak.

6.Aşama         : Aktarım

 57                   Case 3 '4.Tab (Tab3). Son tab.
                        'İleri ve Geri butonlarını kilitle
 1                       cmdButon(1).Enabled = False
 2                       cmdButon(0).Enabled = False
 3                       'Bu tabda yer alan gizli listeleri boşalt
 4                           lstAlanİndex.Clear
 5                           lstSütunİndex.Clear
 6                       'grdEşleme gizli sütunlarındaki sayısal bağları buradaki listelere aktar
 7                       For i = 1 To grdEşleme.Rows - 1
 8                           grdEşleme.Row = i
 9                           grdEşleme.Col = 3
 10                           If grdEşleme.Text <> "" Then
                            'Boş olanlar varsa atla
                            'Boş olan değerler, exceldeki ilgili sütunun aktarıma dahil edilmediği anlamına gelir.
 11                               lstAlanİndex.AddItem grdEşleme.Text
 12                               grdEşleme.Col = 2
 13                               lstSütunİndex.AddItem grdEşleme.Text
 14                           End If
 15                       Next
                        'Tab3'ü görünür hale getir
 16                       SSTab1.Tab = tabNo
                        'Ve excel dosyası ile iletişim kurarak aktarıma başla
 17                       Dim ExSatır As Integer
 18                       Dim dolu As Boolean
 19                       Set Ex = CreateObject("Excel.Application")
 20                       DosyaAdi = txtYol.Text
 21                       Ex.Workbooks.Open (DosyaAdi)
 22                       Ex.Visible = False
 23                       If chkSütunBaşı.Value = 1 Then
 24                           ExSatır = 2
 25                       Else
 26                           ExSatır = 1
 27                       End If
 28                       dolu = True
                        'Tüm sütunları boş bir satıra rastlayıncaya kadar devam et
                        'Bu satırın geldiği 'dolu' değişkenine "False" değeri atanarak bildirilecek
                        'İlk satırı sorgusuz al, çünkü 'dolu' değişkeninin değeri "True"
 29                       While Not dolu = False
                        'Bu döngü satırlar arasında dolaşmaya yarayacak
                        'Döngünün her başlaması yeni bir satıra geçildiği anlamına gelir
                            'Kayıtsetini kayıt eklenecek duruma getir
 30                           KayıtSetiÖğrenci.AddNew
                            'Belirtilen sütunları ara ve hücredeki veriyi
                            'Eşleştirilen Field alanına aktar
                            'Bu döngüde bir satırın tüm sütunları taranıp, kayıtsetinin ilgili alanına aktarılıyor
 31                           For i = 0 To lstAlanİndex.ListCount - 1
                            'Sıradaki satırın ilk sütunundan başla
 32                  Ex.Cells(ExSatır, Val(lstSütunİndex.List(i))).Activate
 33     KayıtSetiÖğrenci.Fields(Val(lstAlanİndex.List(i))) = Ex.Cells(ExSatır, Val(lstSütunİndex.List(i)))
                            'Aynı satırın diğer sütununa geç
 34                           Next
                            'Bir satırın tüm sütunları taranmışsa kayıtsetini kaydet
 35                           KayıtSetiÖğrenci.Update
                            'Diğer satıra geçmek için satır numrasını arttır
 36                           ExSatır = ExSatır + 1
                            ''dolu' değişkenini "False"ye ayarla, başlangıç için
 37                           dolu = False
 38                           For i = 1 To Combo1.ListCount
                            'Bu döngü sıradaki satırde en az bir dolu hücre olup olmadığına bakacak
                            'Tek bir tane de olsa bu bir kayıt anlamına geleceğinden
                            'Uygulama bu satırı da veritabanına aktaracak
                            'Yeni satırın, tüm sütunlarını tara, dolu hücre var mı bak
 39                               If Ex.Cells(ExSatır, i) <> "" Then
                                'Bu satırın herhangi bir yerinde bir dolu hücreye rastlarsan
 40                                   dolu = True ''dolu' değişkenini "True" yap
                                    'Diğer sütunlara bakmana gerek yok, bu döngüden çık
 41                                   Exit For
 42                               End If
 43                           Next
 44                       'Döngü şartına bak ve uygunsa sıradaki satırı aktarmaya başla
 45                       Wend
                        'İşlem bitti, Excel dosyasını ve şablonunu kapat, sıfırla
 46                       Ex.Workbooks(1).Close (False)
 47                       Ex.Application.Quit
 48                       Set Ex = Nothing
                       
 49                       Label7.Caption = "Aktarım tamamlandı."
 50                       Label6.Caption = "Eşleştirmeleriniz doğrultusunda Excel listesi uygulama veritabanına aktarıldı. " & Chr(34) & "Son" & Chr(34) & " düğmesine tıklayarak " & Chr(34) & "Öğrenci Bilgileri" & Chr(34) & " ekranına dönüp, aktarımın sonuçlarını kontrol edebilirsiniz."
 51                       cmdButon(2).Caption = "Son" 'İptal butonunu "Son" butonu yap
 52                       cmdButon(1).Visible = False 'İleri butonunu gizle
 53                       cmdButon(0).Visible = False 'İleri butonunu gizle
                 End Select
                'Ön hazırlıkları yukarıdaki bölümlerde yaptıktan sonra
                'Hazırlığı yapılmış Tab'ı göster
 59              SSTab1.Tab = tabNo
 60      Case 2 'İptal butonu
            ‘İptal butonuna tıklayınca olacak olaylar
 61   End Select
End Sub

“AKTARMA” tabına geçerken İleri ve Geri butonları pasifleştiriliyor ve bu tabdakki listeler boşaltılıyor. Ardından grdEşlemenin gizlediğimiz sütunlarına yazdırdığımız veriler listelere yükleniyor (Satır 1-15). 16.Satır ile diğerlerinden farklı olarak, Tab işlemler bitmeden gösterime sunuluyor ki, buradaki Label’larda yazanların bir anlamı olsun.
            Sonrasında yapacağımız işlem 2. Tab “ALANLAR” da yaptığımızdan farklı değil while-wend döngüsü ile satırlarda ilerlemeye başlıyoruz ve tüm sütunları boş bir satıra rastlayıncaya kadar, her satırın Combo1 deki sütun sayısı kadar sütununa göz atıp buradaki değeri ilgili kayıtseti alanına aktarıyoruz. Sütunlarda ilerlemeyi For-Next döngüsü ile yapıyoruz ve her sütun için alan ayarlamasını son tabdaki gizli listelerdeki verilere göre yapıyoruz. Örneğin bu listelerden lstSütunİndex’in ilk elemanı 2, lstAlanİndex’in ilk elemanı 4 olsun. Uygulama bu veriyi
Kayıtseti.Fields(4) = Ex.Cells(ExSatır, 2)
Şeklindeki bir ifade ile kaydedecektir. İşte yukarıdaki kodların 33. satırında yapılan budur. Listelerin aynı sıradaki her elemanını bu kodda bir araya getirir.
            For  i = 0 to lstAlanİndex.ListCount
Kayıtseti.Fields(lstAlanİndex’teki i. eleman) = Ex.Cells(ExSatır, lstSütunİndex’teki i.eleman)
      Next

            Aktarma işlemi tamamlandıktan sonra Label ‘ları aktarmanın bittiğini belirten bir şekilde değiştiriyoruz ve İleri, Geri butonlarına ihtiyacımız kalmadığı için onları gizliyoruz. İptal butonuna ise ‘Son’ yazısı yazdırıyoruz ki, kullanıcı bunu tıklayıp formu kapatabilsin.

İptal butonu, üzerinde yazan yazı ne olursa olsun aynı işlevi görüyor: Formu kapatmak!

                'Ön hazırlıkları yukarıdaki bölümlerde yaptıktan sonra
                'Hazırlığı yapılmış Tab'ı göster
 59              SSTab1.Tab = tabNo
 60      Case 2 'İptal butonu
  1          Unload me
 61   End Select
End Sub


Son aşama       : Uygulamanın tüm kodları bir arada

Option Explicit
      'Tüm form içerisinde farklı yordamlarda aynı şekilde kullanılacak değişkenler tanımlanıyor.
Dim Ex As Excel.Application ‘Excel dosyamızı açmamızı sağlayacak tanımlama
DosyaAdi As String ‘Excel Dosyamızın tam yolunu bu değişkene atayacağız.
Dim alan(10) As Integer, sr As Long, ilkhücre As String, başvuru As Integer, st As Long
Dim tabNo As Integer
Dim Bağlantı As Connection ‘Veritabanı ile bağlantı için
Dim KayıtSetiÖğrenci As Recordset ‘Veritabanındaki bir tabloya bağlantı için
Dim sqlMetni As String ‘Tabloyla bağlantı kurarken oluşturacağımız sorgu metni için
Dim ExVar As Boolean ‘Sistemimizin bir Exel Aplication ataması durumunda True değerini alacak.

Private Sub chkOnay_Click()
'Sütun-Alan eşleştirmelerinin doğruluğuna dair teyid isteyen onay kutusu
Dim mesaj As String
Dim cevap
var = False
    If chkOnay.Value = 1 Then
    'Eşleştirmeler doğru ise işleme devam et
        cmdButon(1).Enabled = True
    Else
    ‘Değilse
        'Onay alana kadar ilerleme yasağı getir
        cmdButon(1).Enabled = False
    End If
End Sub

Private Sub chkSütunBaşı_Click()
'Excel sayfasındaki ilk satırın
'Sütun başlıkları olup olmadığına dair onay kutusu
'Onay kutusu işaretli ise, ilk satır başlık satırı demektir
    If chkSütunBaşı.Value = 1 Then
    'İlk satır başlıkları içeriyorsa
    'Griddeki (grdExcel) satırı başlık formatına getir
        grdExcel.FixedRows = 1
    Else
    'İlk satırda da normal kayıt varsa
    'Griddeki ilk satırı da normal yap
        grdExcel.FixedRows = 0
    End If
   
    Combo1.Clear
    grdExcel.Row = 0
    grdEşleme.Col = 0
    'İlk satırın durumuna göre Combo1 ve grdEşleme dolduruluyor
    For i = 0 To grdExcel.Cols - 1
        grdExcel.Col = i
        If chkSütunBaşı.Value = 1 Then
        'İlk satır sütun başlıklarını içeriyorsa
        'Combo1'i ve grdEşleme'nin ilk sütununu
        'Bu başlıklarla doldur
            Combo1.AddItem grdExcel.Text
            grdEşleme.Row = i + 1
            grdEşleme.Text = grdExcel.Text
        Else
        'Excelde başlık yoksa
        'Excel sütunlarını 1.Sütun, 2.Sütun ... n.Sütun diye adlandır
        've igili yerleri bunlarla doldur
            Combo1.AddItem i + 1 & ".Sütun"
            grdEşleme.Row = i + 1
            grdEşleme.Text = i + 1 & ".Sütun"
        End If
    Next
    'Combo1'de ilk sütunun adını görüntüle
    Combo1.ListIndex = 0
End Sub

Private Sub cmdAtla_Click()
    If Combo1.ListIndex < Combo1.ListCount - 1 Then
        Combo1.ListIndex = Combo1.ListIndex + 1
    End If
End Sub

Private Sub cmdBağla_Click()
    'Combo1'den seçilen Excel sütunu ile
    'Combo2'den seçilen Kayıtseti alanı eşleştiriliyor
    'Bu eşleştirme grdEşleştirme içerisinde gösteriliyor
    'Ayrıca işlem yapmada kolaylık olması açısından
    'Excel sütun numarası ve Field indexi de grdEşleme içerisideki
    'gizli sütunlara aktarılıyor. Son aşamada bu gizli olanlar kullanılacak
    grdEşleme.Col = 1
    grdEşleme.Row = Combo1.ListIndex + 1
    grdEşleme.Text = Combo2.Text
    grdEşleme.Col = 2
    grdEşleme.Row = Combo1.ListIndex + 1
    grdEşleme.Text = Combo1.ListIndex + 1
    grdEşleme.Col = 3
    grdEşleme.Row = Combo1.ListIndex + 1
    grdEşleme.Text = Combo2.ListIndex + 1
    If Combo1.ListIndex < Combo1.ListCount - 1 Then
        Combo1.ListIndex = Combo1.ListIndex + 1
    End If
End Sub

Private Sub cmdButon_Click(Index As Integer)
'İleri, Geri ve İptal butonları
    Select Case Index
        Case 0 'Geri butonu
            tabNo = tabNo - 1
            cmdButon(1).Enabled = True
            If tabNo = 0 Then
               cmdButon(0).Visible = False
            End If
            SSTab1.Tab = tabNo
        Case 1 'İleri butonu
                tabNo = tabNo + 1
                cmdButon(0).Visible = True
                Select Case tabNo
                    Case 0 'İlk Tab (Tab0).Giriş tabı. Dosya seçimi yapılıyor.
                   
                    Case 1 'İkinci Tab (Tab1). Excel dosyasından örnek gösterilecek ve sütun-Alan eşleştirmeleri yapılacak
                        DosyaAdi = txtYol.Text
                        If Dir(DosyaAdi) = "" Then
                        'Dosya yoksa bunu kullanıcıya bildir ve ilerleme
                            MsgBox "Belirttiğiniz dosya bulunamadı. Lütfen dosya yolunu kontrol edin.", vbCritical, "DOSYA BULUNAMADI!"
                            tabNo = tabNo - 1
                        Else
                        'Dosya varsa işlemleri yap
                            'Bir excel şablonu yarat
                            Set Ex = CreateObject("Excel.Application")
                            ExVar = True
                            'Excel dosyasını bu şablonla aç
                            Ex.Workbooks.Open (DosyaAdi)
                            Ex.Visible = False
                                st = 0
                                grdExcel.Row = 0
                                'Boş bir sütuna rastlayıncaya kadar
                                'İlk Excel satırını gridin ilk satırına al
                                While Ex.Cells(1, st + 1) <> ""
                                   'Exceldeki sütun sayısına göre, griddeki sütunu arttır

                                    grdExcel.Cols = st + 1                                     grdExcel.Col = st
                                    grdExcel.Text = Ex.Cells(1, st + 1)
                                    st = st + 1
                                Wend
                            'Sonra excelden 4 satır daha al örnek olsun diye
                            For i = 1 To 4
                                For j = 0 To grdExcel.Cols - 1
                                    grdExcel.Row = i
                                    grdExcel.Col = j
                                        grdExcel.Text = Ex.Cells(i + 1, j + 1)
                                Next
                            Next
                            'Excel çalışma kitabını kaydetmeden kapat
                            Ex.Workbooks(1).Close (False)
                            'Şablonu da kapat ve sıfırla
                            Ex.Application.Quit
                            Set Ex = Nothing
                            'Excelin ilk satırının sütun başı olup olmamasına göre
                            'İlk satırıyla yada sıralı olarak sütun numaralarıyla
                            'Combo1 listesini oluştur tabi önce Combo1'i boşalt
                            Combo1.Clear
                            grdExcel.Row = 0
                            For i = 0 To grdExcel.Cols - 1
                                grdExcel.Col = i
                                If chkSütunBaşı.Value = 1 Then
                                    Combo1.AddItem grdExcel.Text
                                Else
                                    Combo1.AddItem i + 1 & ".Sütun"
                                End If
                            Next
                            'Combo1'i ilk elemanı görüntülenecek şekilde ayarla
                            Combo1.ListIndex = 0
                           
                            grdEşleme.Col = 0
                            'Combo1 içerisindeki elemanları sırası ile
                            'gdrEşlemenin ilk sütununa aktar
                            For i = 0 To Combo1.ListCount - 1
                                grdEşleme.Rows = i + 2
                                grdEşleme.Row = i + 1
                                grdEşleme.Text = Combo1.List(i)
                                grdEşleme.CellAlignment = 0
                            Next
                        End If
                    Case 2 '3.Tab (Tab2). Eşleşmelerin kontrolü istenecek, onay verilirse işlem devam edecek.
                        '3.tabdaki (tab2) listeleri sıfırla
                        For i = 0 To 1
                            lstEşleme(i).Clear
                        Next
                        'grdEşleme içerisine yazdırılmış olan eşleşmeleri bu listelere aktar
                        grdEşleme.Col = 1
                        For i = 0 To Combo1.ListCount - 1
                            lstEşleme(0).AddItem Combo1.List(i)
                            grdEşleme.Row = i + 1
                            lstEşleme(1).AddItem grdEşleme.Text
                        Next
                        'İlerlemeyi engelle (Şimdilik)
                        cmdButon(1).Enabled = False
                        'İlerleme ancak eşleşmelerin doğru olduğuna dair olan onay kutusu işaretlenirse mümkün olacak
                    Case 3 '4.Tab (Tab3). Son tab.
                        'İleri ve Geri butonlarını kilitle
                        cmdButon(1).Enabled = False
                        cmdButon(0).Enabled = False
                        'Bu tabda yer alan gizli listeleri boşalt
                            lstAlanİndex.Clear
                            lstSütunİndex.Clear
                        'grdEşleme gizli sütunlarındaki sayısal bağları buradaki listelere aktar
                        For i = 1 To grdEşleme.Rows - 1
                            grdEşleme.Row = i
                            grdEşleme.Col = 3
                            If grdEşleme.Text <> "" Then
                            'Boş olanlar varsa atla
                            'Boş olan değerler, exceldeki ilgili sütunun aktarıma dahil edilmediği anlamına gelir.
                                lstAlanİndex.AddItem grdEşleme.Text
                                grdEşleme.Col = 2
                                lstSütunİndex.AddItem grdEşleme.Text
                            End If
                        Next
                        'Tab3'ü görünür hale getir
                        SSTab1.Tab = tabNo                       
                        'Ve excel dosyası ile iletişim kurarak aktarıma başla
                        Dim ExSatır As Integer
                        Dim dolu As Boolean
                        Set Ex = CreateObject("Excel.Application")
                        DosyaAdi = txtYol.Text
                        Ex.Workbooks.Open (DosyaAdi)
                        Ex.Visible = False
                        If chkSütunBaşı.Value = 1 Then
                            ExSatır = 2
                        Else
                            ExSatır = 1
                        End If
                        dolu = True
                        'Tüm sütunları boş bir satıra rastlayıncaya kadar devam et
                        'Bu satırın geldiği 'dolu' değişkenine "False" değeri atanarak bildirilecek
                        'İlk satırı sorgusuz al, çünkü 'dolu' değişkeninin değeri "True"
                        While Not dolu = False
                        'Bu döngü satırlar arasında dolaşmaya yarayacak
                        'Döngünün her başlaması yeni bir satıra geçildiği anlamına gelir
                            'Kayıtsetini kayıt eklenecek duruma getir
                            KayıtSetiÖğrenci.AddNew
                            'Belirtilen sütunları ara ve hücredeki veriyi
                            'Eşleştirilen Field alanına aktar
                            'Bu döngüde bir satırın tüm sütunları taranıp, kayıtsetinin ilgili alanına aktarılıyor
                            For i = 0 To lstAlanİndex.ListCount - 1
                            'Sıradaki satırın ilk sütunundan başla
                                Ex.Cells(ExSatır, Val(lstSütunİndex.List(i))).Activate
                                KayıtSetiÖğrenci.Fields(Val(lstAlanİndex.List(i))) = Ex.Cells(ExSatır, Val(lstSütunİndex.List(i)))
                                
                            'Aynı satırın diğer sütununa geç
                            Next
                            'Bir satırın tüm sütunları taranmışsa kayıtsetini kaydet
                            KayıtSetiÖğrenci.Update
                            'Diğer satıra geçmek için satır numrasını arttır
                            ExSatır = ExSatır + 1
                            ''dolu' değişkenini "False"ye ayarla, başlangıç için
                            dolu = False
                            For i = 1 To Combo1.ListCount
                            'Bu döngü sıradaki satırde en az bir dolu hücre olup olmadığına bakacak
                            'Tek bir tane de olsa bu bir kayıt anlamına geleceğinden
                            'Uygulama bu satırı da veritabanına aktaracak
                            'Yeni satırın, tüm sütunlarını tara, dolu hücre var mı bak
                                If Ex.Cells(ExSatır, i) <> "" Then
                                'Bu satırın herhangi bir yerinde bir dolu hücreye rastlarsan
                                    dolu = True ''dolu' değişkenini "True" yap
                                    'Diğer sütunlara bakmana gerek yok, bu döngüden çık
                                    Exit For
                                End If
                            Next
                        'Döngü şartına bak ve uygunsa sıradaki satırı aktarmaya başla
                        Wend
                        'İşlem bitti, Excel dosyasını ve şablonunu kapat, sıfırla
                        Ex.Workbooks(1).Close (False)
                        Ex.Application.Quit
                        Set Ex = Nothing
                       
                        Label7.Caption = "Aktarım tamamlandı."
                        Label6.Caption = "Eşleştirmeleriniz doğrultusunda Excel listesi uygulama veritabanına aktarıldı. " & Chr(34) & "Son" & Chr(34) & " düğmesine tıklayarak " & Chr(34) & "Öğrenci Bilgileri" & Chr(34) & " ekranına dönüp, aktarımın sonuçlarını kontrol edebilirsiniz."
                        cmdButon(2).Caption = "Son" 'İptal butonunu "Son" butonu yap
                        cmdButon(1).Visible = False 'İleri butonunu gizle
                        cmdButon(0).Visible = False 'İleri butonunu gizle
                End Select
                'Ön hazırlıkları yukarıdaki bölümlerde yaptıktan sonra
                'Hazırlığı yapılmış Tab'ı göster
                SSTab1.Tab = tabNo
        Case 2 'İptal butonu
            Call frmÖgrenci.yenile
            Unload Me
    End Select
End Sub

Private Sub cmdGözat_Click()
'Tab0 'da dosya seçiminde "Gözat" düğmesi tıklanınca
    Common.DialogTitle = "Excel dosyasını seç"
    Common.Filter = "Excel dosyaları|*.xls"
    Common.InitDir = App.Path
    Common.ShowOpen
    txtYol.Text = Common.FileName
End Sub

Private Sub Combo1_Click()
    'Combo1 de seçilen elemana göre gridde ilgili sütunu seçili yap
    grdExcel.Col = Combo1.ListIndex
    'Bunun için Sütun belirtilip, bu sütunun ilk satırından başlanarak
    grdExcel.Row = 0
    'Son satırına kadar tüm satırları seçime dahil ediliyor
    grdExcel.RowSel = grdExcel.Rows - 1
End Sub

Private Sub Form_Activate()
    MDIForm1.Caption = "ERT-ÖSS ANALİZ [" & Me.Caption & "]"
    MDIForm1.Enabled = False
End Sub

Private Sub Form_Load()
    'Veritabanı bağlantısını kur
    Set Bağlantı = New ADODB.Connection
    Bağlantı.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & App.Path & "\Veri\vtÖSS.mdb"
    'Kayıtseti oluştur
    sqlMetni = "SELECT * FROM tblÖgrenciBilgileri WHERE (((tblÖgrenciBilgileri.Okul)='" & Trim(mdlAyar.kurum) & "') AND ((tblÖgrenciBilgileri.ArşivYılı)=" & Trim(mdlAyar.MezuniyetYılı) & ")) ORDER BY Adı;"
    Set KayıtSetiÖğrenci = New ADODB.Recordset
    KayıtSetiÖğrenci.Open sqlMetni, Bağlantı, adOpenKeyset, adLockOptimistic
    'Tabno değişkenini sıfıra ayarla
    tabNo = 0
    'grdEşleme için biçim ayarları yap
    grdEşleme.ColWidth(0) = 1450
    grdEşleme.ColWidth(1) = 1450
    grdEşleme.ColWidth(2) = 0
    grdEşleme.ColWidth(3) = 0
    grdEşleme.CellAlignment = 0
    'grdEşleme gridinin başlıklarını ayarla
    grdEşleme.Row = 0
    grdEşleme.Col = 0
    grdEşleme.Text = "Sütun" '1.Sütunun başlığı
    grdEşleme.Col = 1
    grdEşleme.Text = "Alan" '2.Sütunun başlığı
    'Kayıtsetindeki alanların isimleri eşleşme için Combo2 listesine yazdır
    Combo2.Clear
    For i = 1 To KayıtSetiÖğrenci.Fields.Count - 1
        Combo2.AddItem KayıtSetiÖğrenci.Fields(i).Name
    Next
End Sub

Private Sub Form_Unload(Cancel As Integer)
    KayıtSetiÖğrenci.Close
    Set KayıtSetiÖğrenci = Nothing
    Bağlantı.Close
    Set Bağlantı = Nothing
        If ExVar = True Then
            Ex.Workbooks(1).Close (False)
            Ex.Application.Quit
        End If       
    Set Ex = Nothing
End Sub

Private Sub lstEşleme_Click(Index As Integer)
Dim diğeri
    If Index = 0 Then
        diğeri = 1
    Else
        diğeri = 0
    End If
    lstEşleme(diğeri).ListIndex = lstEşleme(Index).ListIndex
    lstEşleme(diğeri).TopIndex = lstEşleme(Index).TopIndex
End Sub

Private Sub txtYol_Change()
    cmdButon(1).Enabled = True 'İleri butonu
    cmdGözat.Default = False
    cmdButon(1).Default = True 'İleri butonu
End Sub


Sonsöz:
            Yukarıda açıklamasını yapmadığım iki yordam var. Bunlardan ilki (Form_Unload) form kapanırken Kayıtseti, Veritabanı bağlantısı ve Exel Aplication’u kontrol ediyor açıksa kapatıyor ve değerleri sıfırlayarak belleği boşaltıyor. Diğeri ise KONTROL tabındaki listelerimizin tıklanması durumunda ne olacağını gösteriyor. Listeler uzun olduğunda ListBox içerisine tüm elemanlar sığmayacağından bir kaydırma çubuğu eklenecektir. Kullanıcı listenin altında bulunan bir eşleşmeyi görmek için listelerden birinin kaydırma çubuğunu kullanacak, orada eşleşmesini merak ettiği bir elemanı tıklayacak. Eğer sadece diğer listenin ListIndex özelliğini tıklanan listenin ListIndex özelliğine eşitlemiş olsaydık, diğer listeden aynı sıradaki eleman seçilmiş olacak, ama altlarda kaldığı için göremeyecektik. İşte bu durumda biz hemen bu listenin en üst elemanının indexini liste kutusunun topIndex özelliği ile öğreniyoruz ve diğer listenin TopIndexine de bu değeri atıyoruz. Böylelikle listelerin seçilmiş elemanları aynı hizada oluyor, karşılaştırması kolaylaşıyor. Görsel olarak da rahatsız etmiyor.

            Normalde uygulama çok basit kaçtı, dediğim gibi geliştirmeye açık. Ama bu kadar basit şeyi çok uzatıp çok da karışık anlatmış olabilirim. Şimdiden özür diliyorum. Umarım bu karışıklığın içinden çıkıp işinize yarayacak bir-iki şey bulursunuz. Hepinize güzel günler.

Hiç yorum yok:

Yorum Gönder