Anasayfa | Akademik Forum | Sizden Gelenler | Sipariş
Menü Açıklamaları
Sorular - Cevaplar
Makaleler
Makrolar
Yerleşik İşlevler
Animasyonlar
Yumurtalar
Fonksiyonlar
MTK Programlar
ExcelCE
Dosya İndir
Neler Yaptık?
İletişim
Makaleler
TXT Dosyaları ve Excel İlişkisi - 2 - M. Temel Korkmaz - 01.08.2001
Geçen sayımızda kaldığımız yerden devam ediyoruz. Bu ay hem örnekleri hem de konuyu aynı anda anlatmış olacağız. Excel’de UserForm kullanmasını bilmeyen okurlarımız biraz zorlanabilirler fakat biraz da olsa UserForm kullanmış okurlarımız bu ayki yazıyı zevkle uygulayacaklardır.

DENEME ÖRNEKLERİ:

Örnek 1 :
Bu denemede bir Excel dosyası olan CSV uzantılı dosya türünü kullanacağız. Excel sayfasında hazırlamış olduğumuz verileri bir saklama dosyası olarak Deneme.CSV dosyasına kaydedeceğiz.

WRITE FONKSİYONU


Sıralı erişimli açılmış bir veri dosyasına aktarılacak bilgileri kaydetmek amacıyla kullanılan bir fonksiyondur.

Write # [Dosya numarası], Bilgiler

Sub DosyayaYazdir()
 
satir = 1
 
Open "C:\Veri\Deneme.csv" For Output As #1
   
satir = Worksheets("Sayfa1").Range("A1").CurrentRegion.Rows.Count
   
For i = 1 To satir
     
Write #1, Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4)
   
Next i
 
Close #1
End Sub

Şekil-1 bizim verilerimizi düzenlediğimiz Excel Çalışma sayfasıdır. Şekil-2 ise, yukarıdaki makroyu çalıştırdığımızda elde ettiğimiz bir CSV uzantılı Excel sayfasıdır.

Örnek 2 :
Şekil-1’deki tablonun aynısını kullanarak aşağıdaki kodu yazdık ve çalıştırdık. Bu iki kod arasındaki farkı görün.


PRINT FONKSİYONU


Write fonksiyonu gibi bu fonksiyon da sıralı erişimli bir veri dosyasına veri aktarmak için kullanılır.

Print # [Dosya numarası], Bilgiler

Sub DosyayaYazdir1()
 
satir = 1
 
Open "C:\Veri\Deneme1.csv" For Output As #1
   
satir = Worksheets("Sayfa1").Range("A1").CurrentRegion.Rows.Count
   
For i = 1 To satir
     
Print #1, Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4)
   
Next i
  
Close #1
End Sub

Verilerin tek bir sütuna yazıldığına dikkat edin. (Şekil-3)

Örnek 3 :
Deneme.csv dosyasındaki verileri, şu anda çalıştığımız Excel dosyasında bulunan Sayfa2’ye geri alacağız. Yani bu defa dosyadan okuyacağız. Bunun için aşağıdaki kodu yazın ve çalıştırın.

EOF FONKSİYONU


Erişim numarası verilen dosyanın en sonundaki veriye gelindiğinde True değerini döndürür. Tamamen bir dosya kontrol fonksiyonudur. Sıralı erişime sahip dosyalarda kullanılır.

EOF (Dosya numarası)

Sub DosyadanAl1()
 
satir = 1
 
Open "C:\Veri\Deneme.csv" For Input As 1
   
Do While Not EOF(1)
     
Line Input #1, kayit1
     
If kayit1 <> Empty Then
        Cells(satir, 1) = kayit1
       
satir = satir + 1
     
End If
    Loop
  Close #1
End Sub

Excel sayfasına aldığımız verilerin daha önceden kayıtlı bir csv dosyası olduğuna dikkat edin. Ve alınan verilerin tırnaklarla ayrılmış fakat aynı sütunda bulunduğuna dikkat edin. Yukarıdaki koda bir satır daha ekleyelim ve verilerimizi istenilen şekle sokalım. Tabi ki bunun için daha önceden bildiğimiz komutları kullanacağız. (Şekil-4)

LINE INPUT FONKSİYONU

Numarası verilmiş ve sıralı erişime sahip olan bir dosyadan, atanılan değişkene bir satırlık veri okumak için kullanılan fonksiyondur.

Line Input # [Dosya numarası], değişken

Sub DosyadanAl1()
 
satir = 1
 
Open "C:\Veri\Deneme.csv" For Input As 1
   
Do While Not EOF(1)
     
Line Input #1, kayit1
     
If kayit1 <> Empty Then
        Cells(satir, 1) = kayit1
       
satir = satir + 1
     
End If
    Loop
  Close #1
 
Cells(1, 1).CurrentRegion.TextToColumns _
     
DataType:=xlDelimited, Comma:=True
End Sub

Makroyu çalıştırdığınızda Şekil-5’deki görüntüyü elde edeceksiniz.


INPUT FONKSİYONU


Açık olan ve dosya numarası belli olan veri dosyasından karakter okumamk için kullanılan bir fonksiyondur.

Input # [Dosya Numarası], bilgiler

Yukarıdaki örneklerle aynı işlemi yapan farklı bir örnek. Bu örneklerden hangisini uygularsanız uygulayın aynı sonuca varacaksınız. Siz bu örnekler üzerinde oynamalar yapın. Mesela satır, sütun ve kayıt sayılarında oynayın. Aldığınız değişik sonuçları yorumlayın.

Sub DosyadanAl2()
 
satir = 1
 
Open "C:\Veri\Deneme.csv" For Input As #1
   
Do While Not EOF(1)
     
Input #1, kayit1
     
If kayit1 <> Empty Then
        Input #1, kayit2, kayit3, kayit4
       
Cells(satir, 1) = kayit1
       
Cells(satir, 2) = kayit2
       
Cells(satir, 3) = kayit3
       
Cells(satir, 4) = kayit4
       
satir = satir + 1
      End If
    Loop
  Close #1
End Sub

LOF FONKSİYONU

Erişim numarası verilen bir dosyanın byte cinsinden büyüklüğünü verir.

LOF (Dosya numarası)

Örnek 4 :
“C:\Veri” klasörüne kaydedilmiş “Deneme1.csv” dosyasının uzunluğunu bulup, mesaj kutusuna aktaralım. (Şekil-6)

Sub DosyaUzunlugu1()
 
Open "C:\Veri\Deneme1.csv" For Input As #1
   
dosyaUzun = LOF(1)
 
Close #1
 
MsgBox "Deneme1.csv dosyası " & dosyaUzun & " bytedir."
End Sub

Örnek 5: Daha önce “C:\Veri” klasörüne kaydedilmiş altı adet “Test” dosyasının uzunluklarını bulup Excel Çalışma sayfasına aktaracak kodu yazın. (Şekil-7)

Sub DosyaUzunlugu2()
 
For i = 1 To 6
   
Open "C:\Veri\Test" & i & ".TXT" For Input As #i
    
 dosyaUzun = LOF(i)
   
Close #i
   
Cells(i, 1).Value = "Test" & i & ".TXT"
   
Cells(i, 2).Value = dosyaUzun
  Next i
End Sub

Örnek 6: Şimdi vereceğimiz örnekte ise Binary modunu kullanacağız. Deneme.csv dosyasından A1 hücresine verileri alırken, B1 hücresinde de her veri alındığında byte olarak uzunluğunu okuyacaksınız.


LOC FONKSİYONU


Açık olan bir dosyada bulunulan yeri belirlemek için kullanılan bir fonksiyondur.

Loc (Dosya numarası)

Aşağıda verdiğimiz örneği uyguladığınızda bundan neyin bahsedildiğini daha iyi kavrayacaksınız. İmleç “Deneme.csv” dosyasında nereden veriyi alıp aktarıyorsa, imlecin konumunu B1 hücresinde değiştiriyor. (Şekil-8)


Sub LocFonk()
 
Open "C:\Veri\Deneme.csv" For Binary As #1
   
Do While uzunluk < LOF(1)
     
veri = veri & Input(1, #1)
     
uzunluk = Loc(1)
     
Cells(1, 1) = veri
     
Cells(1, 2) = uzunluk
   
Loop
  Close #1
End Sub

Daha önce Binary modunun veri kayıtlarını karakter karakter incelediğinden bahsetmiştik.

FREEFILE FONKSİYONU


Kullanılmış olan veri dosyasının dosya numarasını veren bir fonksiyondur.

FreeFile (DosyaNumarası)

Buraya kadar anlattığımız bölümde, dosya açılıyor, veri yazılıyor ve dosya tekrar kapatılıyordu. Fakat ne yaparsanız yapın aynı dosyaya herhangi bir veriyi başka bir zamanda kaydetmek istediğinizde, dosyadaki eski veriler kayboluyor, yerine yeni veriler ekleniyordu. Oysa bir veri tabanı oluşturulmak istendiğinde, eski verilerle birlikte yeni verilerinde dosyada saklanması şarttır. Bu işlemi gerçekleştirmek için dosyayı “Append” modunda açmak gerekir. Aşağıda verdiğimiz örneği inceleyin.

Sub YeniVeriEkle1()
 
Open "C:\Veri\VeriEkle.TXT" For Append As #1
    Print #1, "M. Temel Korkmaz"
 
Close #1
End Sub

Makroyu ilk defa çalıştırdığınızda “C:\Veri” klasöründe “VeriEkle.TXT” adında yeni bir dosya açılacak ve bu dosyaya veriniz yazılacaktır. (Şekil-9)

Dosyayı ikinci defa çalıştırdığınızda ise Şekil-10’daki sonucu alacaksınız.

İkinci verinin de eklendiğini gördünüz. Şimdi örneği biraz geliştirelim. Veriyi değiştirmek istediğimizde her defasında kod sayfasındaki kodu değiştirmektense, veriyi belli bir hücre ya da hücre aralığından alsın. Konunun net anlaşılabilmesi için adım adım ilerleyelim. Önce veriyi tek bir aralıktan alsın.

Sub YeniVeriEkle2()
 
Open "C:\Veri\VeriEkle.TXT" For Append As #1
    
Print #1, Range("A1")
 
Close #1
End Sub

A1 hücresine yeni veriyi girip, makroyu çalıştırdığınız zaman aşağıdaki görüntüyü elde edeceksiniz. Her defasında aynı dosyaya veri yazdırıyoruz. Unutmayın kodu farklı bir sayfadan çalıştırdığınızda hücre adresini tam olarak tanımlamalısınız. Mesela

Worksheets(“Sayfa1”).Range(“A1”) şeklinde olmalı. Eğer farklı bir kitaptan çalıştırırsanız. Workbooks(“Kitap1”). Worksheets(“Sayfa1”).Range(“A1”) şeklinde olmalı. (Şekil-11)

Bir adım daha ilerleyelim ve birkaç hücreden veri alalım. Bunun için öncelikle Excel Çalışma sayfasını Şekil-12’deki gibi oluşturun. Kodu yazın, hücreleri doldurduktan sonra, makro kodunu atadığınız düğmeye tıklayın. (Şekil-13)

Sub YeniVeriEkle3()
 
Open "C:\Veri\VeriEkle.TXT" For Append As #1
   
Print #1, Range("B1"), Range("B2"), Range("B3"), Range("B4")
 
Close #1
End Sub

Bu defa profesyonel bir adım daha atalım ve veri kayıtlarımızı hazırladığımız form üzerinden kaydedelim. Önce Şekil-14’dekine benzer bir form oluşturun.

TextBox kutularının içerisine adlarını biz sırası belli olsun diye kendimiz yazdık. Bazen kullanıcılarımız kopyalama yöntemiyle nesneleri çoğalttıkları için, nesne sıraları farklılaşıyor.

Formun kod bölümüne aşağıdaki kodları ekleyin.

Private Sub CommandButton1_Click()
 
Open "C:\Veri\VeriEkle.TXT" For Append As #1
   
Print #1, TextBox1, TextBox2, TextBox3, ComboBox1
 
Close #1
End Sub

Private Sub CommandButton2_Click()
 
Unload UserForm1
End Sub

Private Sub UserForm_Initialize()
 
With ComboBox1
   
.AddItem "Excel"
   
.AddItem "Word"
   
.AddItem "Access"
   
.AddItem "Windows"
 
  .AddItem "Visual Basic"
 
End With
End Sub

Formu çalıştırın ve Şekil-15’deki gibi doldurduktan sonra “KAYDET” düğmesine tıklayın. (Şekil-16)

Artık basit bir veri tabanı programı hazırlamış gibi oldunuz. Tabi ki daha bir çok eksiklikler mevcut. Adım adım bu eksiklikleri giderelim.

İlk problem gibi görünen şey şu. “KAYDET düğmesine tıkladığımızda, dosyanın kaydedip kaydetmediğini anlamıyoruz bile. Bu da bizi şüphede bırakıyor. Her defasında VeriEkle.TXT dosyasını açıp bakmak biraz sıkıcı geliyor” diye düşünen kullanıcılar çok haklı. Bu problemi gidermek için yapılacak şey şu: Kod sonuna gelindiğini belli eden bir mesaj yayınlanmalı. Eğer mesaj kutusu ekrana geldiyse, o satıra gelene kadar bütün satırlar doğru olarak icra edilmiş demektir. Şimdi yukarıdaki kodun son satırına aşağıdaki gibi yeni bir kod ekleyelim. Diğer kodlar aynen kalacak.

Private Sub CommandButton1_Click()
 
Open "C:\Veri\VeriEkle.TXT" For Append As #1
   
Print #1, TextBox1, TextBox2, TextBox3, ComboBox1
 
Close #1
 
MsgBox "Veri tabanına verileriniz eklendi"
End Sub

KAYDET düğmesine tıkladığınızda önce verileriniz “VeriEkle.TXT” dosyasına kaydedilecek. Daha sonra kaydetme işleminin bittiğine dair mesajı alacaksınız. (Şekil-17) Mesaj kutusundaki “Tamam” düğmesine tıkladığınızda kod çalışması sonlanmış olacaktır. (Şekil-18)

Şimdi, de ikinci bir problemin olduğunu görüyoruz. Veriyi kaydettikten sonra, Verilerimiz yazdığımız kutuların boşalmasını istiyoruz. Her defasında elle bunları tek tek silmek gereksiz zaman kaybına neden oluyor. Bunun için ya kayıt işlemi tamamlandığında ya da Mesaj kutusundaki “Tamam” düğmesine tıkladığında kutuların içeriği de temizlensin istiyoruz. Bunun için koda aşağıdaki gibi yeni satırlar ekleyelim.

Private Sub CommandButton1_Click()
 
Open "C:\Veri\VeriEkle.TXT" For Append As #1
   
Print #1, TextBox1, TextBox2, TextBox3, ComboBox1
 
Close #1
 
MsgBox "Veri tabanına verileriniz eklendi"
 
TextBox1.Value = Empty
  TextBox2.Value = Empty
  TextBox3.Value = Empty
  ComboBox1.Value = Empty
End Sub

Şimdi amacımız verilerimiz aynı formu kullanarak bir CSV dosyasına kaydetmek olsun. Fakat sayfa düzenimizin de normal olarak Excel hücrelerindeki gibi olmasını istiyoruz. Kısaca veri sayfamıza verilerin Şekil-19’daki gibi yerleşmesini istiyoruz.

Kodu aşağıdaki gibi düzenlediğinizde alacağınız sonuca dikkat edin. (Şekil-20)

Private Sub CommandButton1_Click()
 
Open "C:\Veri\VeriTabanim.CSV" For Append As #1
   
Print #1, TextBox1, TextBox2, TextBox3, ComboBox1
 
Close #1
 
MsgBox "Veri tabanına verileriniz eklendi"
 
TextBox1.Value = Empty
  TextBox2.Value = Empty
  TextBox3.Value = Empty
  ComboBox1.Value = Empty
End Sub

Böyle bir veri tabanı dosyası oluşturmanın, TXT şeklinde bir veri tabanı dosyası oluşturmaktan pek fazla bir farkı yok. Her veriyi tek bir hücreye yazdırmak CSV uzantılı dosyalar için pek de kullanışlı değil. Aslında çözüm çok basit. “Print” komutu yerine “Write” komutunu kullanacağız.

Private Sub CommandButton1_Click()
 
Open "C:\Veri\VeriTabanim.CSV" For Append As #1
     Write #1, TextBox1, TextBox2, TextBox3, ComboBox1
 
Close #1
 
MsgBox "Veri tabanına verileriniz eklendi"
 
TextBox1.Value = Empty
  TextBox2.Value = Empty
  TextBox3.Value = Empty
  ComboBox1.Value = Empty
End Sub

Eski “VeriTabanim.CSV” dosyasını silin ve yukarıda kodu birkaç defa formu doldurarak çalıştırın. (Şekil-21)

İnsanoğlunda istekler bitmez. Ne kadar verirseniz verin o yine almak ister. Ne kadar öğretirseniz öğretin, o daha fazlasını öğrenmek ister. İlkini bilemiyoruz ama, kişi öğrenmek konusunda ne kadar istekli olursa o kadar iyi sonuca varır.

Burada şunu belirtelim ki, artık bu tür veri dosyası fonksiyonları pek fazla kullanılmıyor. Yapılan programlardan bir çoğu tamamen VERİTABANI mantığına dayandığı için, kaydedilme kolaylığı, erişim kolaylığı, rapor alma kolaylığı bunun gibi daha birkaç nedenden dolayı veri tabanı dosyaları kullanılmaktadır. Bu konu hakkında bir örnek daha verdikten sonra, VERİTABANI konusuna adım atacağız.

Şimdi vereceğimiz örnekte, bir veri dosyasına veri kaydetme, kaydedilen veriyi değiştirme ve silme gibi bazı özellikleri daha göreceksiniz. Bunun için aşağıda verdiğimiz örneği inceleyin. Hazırladığımız formlar hakkında görüntü ve bilgiler Şekil-22 ve Şekil-23’deki gibidir.

VBA sayfasında yeni bir modül açın ve bu modül sayfasının General –Decleration kısmına aşağıdaki kodu yazın.

Type KAYITLAR
  adsoyad As String * 20
  gorev As String * 25
  ikamet As String * 30
End Type

Global ALAN As KAYITLAR

Personel Bilgileri kaydet Formuna aşağıdaki kodları yazın.

Private Sub buldegformac_Click()
 
Unload frmkaydet
  Close #1
 
frmbuldeg.Show
End Sub

Private Sub kapat_Click()
 
Close #1
 
Unload frmkaydet
End Sub

Private Sub kaydet_Click()
 
ALAN.adsoyad = TextBox2
 
ALAN.gorev = TextBox3
 
ALAN.ikamet = TextBox4

 
Put #1, TextBox1, ALAN
 
TextBox1 = TextBox1 + 1
 
TextBox2 = ""
 
TextBox3 = ""
 
TextBox4 = ""
 
TextBox2.SetFocus
End Sub

Private Sub UserForm_Initialize()
 
TextBox1.Locked = True
  TextBox2.SetFocus
  Open "C:\Veri\Personel.txt" For Random As #1 Len = Len(ALAN)
   
TextBox1 = LOF(1) / Len(ALAN)
   
TextBox1 = TextBox1 + 1
End Sub

Private Sub UserForm_QueryClose (Cancel As Integer, CloseMode As Integer)
 
If CloseMode <> 1 Then Cancel = 1
End Sub

Personel Bul Değiştir Formuna da aşağıdaki kodları ekleyin.

Private Sub buldegistir_Click()
 
Get #1, TextBox1, ALAN
 
TextBox2 = ALAN.adsoyad
  TextBox3 = ALAN.gorev
  TextBox4 = ALAN.ikamet
End Sub

Private Sub buldegkapat_Click()
 
Close #1
 
Unload frmbuldeg
End Sub

Private Sub buldegkaydet_Click()
 
ALAN.adsoyad = TextBox2
 
ALAN.gorev = TextBox3
 
ALAN.ikamet = TextBox4
 
Put #1, TextBox1, ALAN
 
TextBox1 = ""
 
TextBox2 = ""
 
TextBox3 = ""
 
TextBox4 = ""
End Sub

Private Sub kaydetformac_Click()
 
Unload frmbuldeg
  Close #1
 
frmkaydet.Show
End Sub

Private Sub SpinButton1_SpinDown()
 
If TextBox1 = Empty Then
    TextBox1 = 1
 
ElseIf TextBox1 < 2 Then
    TextBox1 = 1
 
Else
   
TextBox1 = TextBox1 - 1
  End If
End Sub

Private Sub SpinButton1_SpinUp()
 
If TextBox1 = Empty Then
    TextBox1 = 1
 
Else
   
TextBox1 = TextBox1 + 1
 
End If
End Sub

Private Sub UserForm_Initialize()
 
Open "C:\Veri\Personel.txt" For Random As #1 Len = Len(ALAN)
End Sub

Private Sub UserForm_QueryClose (Cancel As Integer, CloseMode As Integer)
  If CloseMode <> 1 Then Cancel = 1
End Sub

Yukarıda hem kodları hem de ekran görüntülerini birlikte verdik. Bunun amacı hangi kodun nerede bulunduğunu görsel olarak da anlayabilmeniz için. Örneği ise açıklama ihtiyacı hissetmiyoruz. Çünkü örnekle ilgili bütün bilgileri zaten daha önceki bölümlerde öğrendiniz. Kodlarda size gereksiz gelen bazı yerler olabilir. Sakın böyle düşünmeyin. Gereksiz gördüğünüz bir çok kod, hatalara karşı alınmış bazı önlemlerdir.

Anlatmadığımız iki fonksiyon bu kodların içerisinde yer alıyor. Bunlardan ilki PUT fonksiyonu diğeri ise GET fonksiyonu.

PUT FONKSİYONU

Dosya değişkenlerini veri dosyasının içine kayıt yapmak için kullanan bir fonksiyondur.

Put # [Dosya No], [Kayıt No], geçici dosya değişkeni

GET FONKSİYONU

Veri dosyasından kayıt değişkenlerini kayıt numarasına göre okutulması için kullanılan bir fonksiyondur.

Get # [Dosya No], [Kayıt No], geçici dosya değişkeni

SEEK FONKSİYONU
Bir dosya içindeki kaydı okurken veya dosyaya kayıt yaparken konumlanmayı sağlayan bir fonksiyondur.

Seek # [Dosya No], pozisyon
Destek
M.ÖZTÜRK - Y.KARAMAN
Bu siteyi, "Hayatını çocuklarının Ahlâklı ve Dürüst yetişmesi için harcamış olan Cefakar ve Fedakar, Canım ANNEM'e adadım."
Copyright © 1998-2011 M. Temel Korkmaz - Tüm hakları saklıdır.