|
|
|
 |
|
|
 |
 |
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 | |
|
|
 |
|
|
|