Ünite 8: VBA ile Dosya İşlemleri

Giriş

MS Excel çalışmaktayken kendi verilerinin depolanacağı bir disk alanına sahiptir. Ancak bazı durumlarda dış kaynaklı verileri MS Excel içerisine aktarmak ya da yapılan işlemlerden sonra elde edilen verileri dış bir kaynağa (bilgisayar içerisinde farklı tipte bir dosya) aktarmak gerekli olabilir. VBA özellikleri, MS Excel yazılımında, neredeyse tüm programlama dillerinde ortak bir özellik olarak bulunan, dış kaynaklara erişip, içlerinde depolanan verileri içe aktararak çalışmak ya da oluşturulan verileri dış kaynaklara depolamak fonksiyonları bulunmaktadır.

MS Excel yazılımı dâhilînde dış kaynaklı dosya erişimi, genel kullanımlar göz önünde bulundurulduğunda, dış kaynaklı bir dosyadan MS Excel içine veri aktarmak için okuma işlemi ve dış kaynaklı bir dosyaya, MS Excel verisi aktarmak için yazma işlemi olmak üzere iki farklı dosya erişimi fonksiyonundan bahsedilebilir. Dosyadan okuma fonksiyonları aracılığıyla, el ile oluşturulan ya da MS Excel dışında bir yazılımın oluşturduğu veri kaynakları, otomatik olarak okunup içe aktarılarak, MS Excel dâhilînde kullanılabilir olacaktır. Ayrıca, MS Excel ile yapılan işlemler sonrasında elde edilen veriler de belirli bir formatta dışa aktarılarak, bu verilerin farklı yazılımlar tarafından kullanılması sağlanabilir. Üzerinde işlemler yapılan veri grubu dış kaynaklı bir dosyaya, çoğu zaman da kullanılacak diğer yazılım ile uyumlu bir dosyaya yazdırılarak kullanımı sağlanır. MS Excel sayfası dışında dış kaynaklı bir dosya ile veri alışverişi işlemi yapılacaksa öncelikle MS Visual Basic programlama dili ve VBA platformu tarafından desteklenen dosya türlerini belirlemek gereklidir. MS Visual Basic programlama dili aşağıda listelenen üç farklı türdeki dosyayı desteklemektedir.

  1. Ardışık Erişimli Dosyalar
  2. Rastgele Erişimli Dosyalar
  3. İkili Dosyalar

Dosyalarla Çalışmak

Dosyalarla çalışmak için öncelikle dosyalarla yapılan işlemler konusunda bilgi sahibi olmak gereklidir. Bu işlemleri Dosya Erişimi ve Dosya Yönetimi şeklinde sınıflandırmak doğru olacaktır (S:159, Resim 8.1).

Dosya yönetimi, dosyanın oluşturulması, kopyalanması, silinmesi ve taşınması işlemlerinden oluşmaktadır. Herhangi bir yazılım ile oluşturulan veriler, bir yere depolanmadan önce bellekte tutulur. Eğer işlemlerden elde edilen veriler MS Excel sayfası yerine başka bir dosya üzerinde depolanacaksa öncelikle depolamanın yani bir anlamda kaydetmenin üzerine yapılacağı dosya oluşturulmalıdır. Dosya oluşturma işlemi bilgisayarın depolama ünitelerinden belirlenen bir tanesi üzerinde bir dosya yaratmak olarak da tanımlanabilir.

Dosya oluşturmanın dışında, dosyanın farklı bir depolama birimine bir nüshasının daha oluşturulması ise dosyanın kopyalanması olarak adlandırılır. Dosya, üzerinde kayıtlı bulunduğu depolama ünitesi, dizin, klasörden alınarak başka bir yere taşınabilir.

Dosya erişimi ise her ne kadar dosya üzerinden veri okunması, dosyaya veri yazılması ve/veya veri eklenmesi olarak bağımsız işler hâlinde tanımlansa da ardışık olarak gerçekleştirilen üç aşamalı işlemlerin bütününü kapsamaktadır.

  1. Dosyanın Açılması: Dosyanın oluşturulması işlemi tamamlandıktan sonra, üzerine veri yazma işlemi yapılabilecek biçimde dosyanın açılmasını sağlama işlemidir. Üzerinde işlem yapmak üzere dosyanın açılması için Open komutu kullanılır.
  2. Dosyanın İşlenmesi: Bir dosya, içinden veri okumak, üzerine veri yazmak ya da bu işlemlerin her ikisini de aynı anda gerçekleştirmek amacıyla açılabilir. Veri okuma/ yazma ile ilgili bu işlemler, dosyanın işlenmesi olarak adlandırılır. Dosyanın işlenmesi sırasında yapılacak işlemler için dosya biçimi de önemlidir.
  3. Dosyanın Kapatılması: Dosyanın kapatılması, işletim sistemi tarafından bu dosya için ayrılan bellek parçasının serbest bırakılmasını ve son hali oluşturulan dosyanın sabit sürücü üzerinde kalıcı olarak depolanmasını sağlayacaktır. Üzerinde işlem yapılan dosyanın kapatılması için Close komutu kullanılır. Eğer üzerinde çalışılan birden fazla dosya varsa Reset komutu ile tamamının kapatılması mümkündür. Kısaca tanımlanan bu işlemler, MS Visual Basic ortamında bazı komutlar ile gerçekleştirilmektedir.

Bir dosyadan veri okuma ya da dosyaya veri yazma işlemi yapılmadan önce ilgili dosya açılmalıdır. Eğer dosya sabit disk üzerinde mevcut değilse yani henüz yaratılmamış bir dosya ile çalışmak istenirse, öncelikle dosya yaratılmalıdır. Dosyalar açılırken Open komutundan faydalanılır. Open komutunun en yalın kullanımı şu şekildedir:

Open Dosya_Adı As #1

VBA ortamında açılan dosyaların tümüne tanımlayıcı tekil bir numara atanır. Açılan dosya için dosya tanımlayıcı tekil numarası #1 olarak belirtilmiştir. Bundan sonraki işlemlerde dosya tanımlayıcı tekil numarası olarak bu sayı kullanılacaktır. Bu tanımlayıcı tekil numaralar sayesinde birden fazla dosya ile aynı anda çalışmak mümkündür. FreeFile fonksiyonu ile birlikte kullanıldığı durumlarda boşta bulunan en küçük numaranın dosya tanımlayıcı tekil numarası olarak atanması sağlanır.

Dosya açmak için kullanılan Open komutunun tüm özellikleri kullanılarak yazım biçimi ise aşağıdaki gibidir:

Open Dosya_Adı For Dosya_Tipi [Access Erişim_Tipi][Lock_Tipi] As [#] Dosya_No [Len Kayıt_Uzunluğu]

Dikkat edilecek olursa dosya açmak için kullanılan farklı terimler bulunmaktadır. Bu terimlere kısaca göz atılacak olursa;

Dosya_Adı: Sabit sürücü gibi bir depolama biriminde dosyayı tanımlamak için gerekli olan isimdir. Açılması istenen dosya tipine göre uzantı verilerek dosyanın oluşturulması sağlanır.

Dosya_Tipi: Bu terim ile açılacak olan dosyanın türü ve yapılacak işlem belirlenir. Argüman değerleri istenilen özelliklere göre değişmekle birlikte;

  • Input: Dosya sadece Giriş yani okuma işlemleri için açılır.
  • Output: Dosya sadece Çıkış yani yazma işlemleri için açılır.
  • Append: Dosyanın içeriğine yeni veriler eklenmek istendiğinde kullanılır.
  • Random: Dosya rastgele erişim yani açıldıktan sonra kayıt okumak ve yazmak için açılır.
  • Binary: Dosyanın ikili kipte açılmasını sağlar.

Input, Output ve Append terimleri ardışık erişimli dosyalarda kullanmak için oluşturulmuş terimlerdir. Random terimi rastgele erişimli dosyalarda, Binary terimi de ikili dosyalarda kullanılır.

Erişim_Tipi: Bu terim yalnızca Rastgele Erişimli Dosyalarda kullanılmaktadır ve dosyanın okumak (Read), yazmak (Write) ya da her iki işlemi (Read/Write) birden yapmak için açılmasını sağlar.

Lock_Tipi: Bu terim ile dosyanın açık tutulduğu süre içerisinde işletim sisteminin hakları belirlenmektedir. İşletim sistemleri üzerinde aynı anda birden fazla uygulama çalışması mümkündür. VBA dışında bir uygulama da kullanılan ve açık olan dosyaya erişmek ve üzerinde işlem yapmak isteyebilir. Lock_Tipi terimi alacağı değerler ile bu hakları kilitler ya da serbest bırakabilir. Ağ ortamında kullanılan bilgisayarlarda Lock_Tipi teriminin önemi artmaktadır. Farklı bilgisayarlardaki uygulamaların dosyaya erişim yetkileri bu sayede düzenlenir. İfadenin alacağı değerler aşağıda belirtilmiştir:

  • Shared: Diğer uygulamalar ile dosyanın paylaşılmasını sağlar.
  • Lock Read: Dosyanın okumaya kilitlenmesini sağlar, bu sayede diğer uygulamalar dosya üzerindeki verilere hiçbir şekilde erişemezler.
  • Write Lock: Dosyanın yazmaya karşı kilitlenmesini sağlar. Diğer uygulamalar dosya üzerindeki veriler üzerinde herhangi bir değişiklik yapamazlar.
  • Lock Write Read: VBA dışında herhangi bir uygulamanın dosyaya erişimi yasaklanır.

As: Daha önce de bahsedildiği gibi, dosya açma işlemi sırasında her bir dosyaya birbirinden farklı olmak kaydıyla bir tanımlayıcı tekil numara verilmekte, bu sayede hem üzerinde çalışılan dosyalara erişim kolaylaşmakta hem de birden fazla dosya ile aynı anda çalışmak mümkün olmaktadır. As #1 şeklinde açılan dosya, yine sadece #1 tanımlayıcı tekil numarasıyla dosya ismi verilmeden kolayca kapatılabilmektedir.

Len Kayıt_Uzunluğu: Bu terim, yalnızca rastgele erişimli dosyalar için kullanılmaktadır. Bu tür bir dosya kullanımında MS Visual Basic yazılım ortamı, dosya içerisindeki kayıt uzunluğu veya kayıt yapısı ile ilgili bir bilgi barındırmaz. Bu sebeple rastgele erişimli bir dosya açılmadan önce kayıt yapısı hakkında bilgi sahibi olmak gereklidir. Kayıt_Uzunluğu parametresi, kayıt katarının kapladığı toplam hafıza değerini ifade eder. Bu değer programcı tarafından hesaplanabilir ya da Len (Kayıt_Uzunluğu) terimi ile yazılım tarafından otomatik olarak hesaplanması sağlanabilir.

Bir dosya açık iken kullanımda olacağından silinemez. S:160, Resim 8.3’te bu durumun bir örneği gösterilmiştir. VBA tarafından okunmak, yazılmak ya da her iki işlev için açılan dosya, işi bittikten sonra kapatılmalıdır. Dosyayı kapatmak için iki ifade kullanılabilir.

Bunlardan ilki;

Close # [Dosya_Numarası]

ifadesidir. Üzerinde çalışılan dosyayı belirleyebilmek ya da birden fazla dosya ile aynı anda çalışmak amacı ile her bir dosyaya birbirinden farklı tanımlayıcı tekil bir numara atama işlemine ihtiyaç duyulur. Dosyanın açılması esnasında kullanıcı tarafından ya da yazılım ortamının desteğiyle FreeFile terimi tarafından atanan bu tanımlayıcı tekil numaraya, kapatma işleminde de gerek duyulmaktadır. Close komutundan sonra kullanılan # [Dosya_Numarası] ifadesi ile kapatılmak istenen dosya tanımlayıcı tekil numarası belirtilerek dosya kapama işlemi gerçekleştirilebilir.

Unutmamak gerekir ki kapatma işlemi, üzerinde çalışılan dosyanın yalnızca kullanıma kapatılmasını sağlar. Dosyanın silinmesi ya da dosya içerisinde bulunan kayıtların temizlenmesi gibi bir işlem yapmaz. Dosya kapatma işlemi, o anda açık bulunan tüm dosyaların kullanıma kapatılması istendiğinde Reset komutu kullanılır. Bu komut, Open komutu ile açılmış ve o anda yazılım ortamı tarafından kullanılan tüm açık dosyaların herhangi bir tanımlayıcı tekil numara belirtmeden kapatılmasını sağlamaktadır. Reset komutu o anda açılmış olan tüm dosyalar için geçerli olduğundan, bu komut ile o anda açık bulunan dosyalardan herhangi birinin kapatılarak diğerlerinin açık durumda bulunmayı sürdürmesi amacı ile kullanılamaz. İfade kullanıldığı an açık olan tüm dosyalar kullanıma kapatılacaktır.

Dosya Erişimi

Dosya erişimi, açılan bir dosya üzerinde okuma, yazma ya da okuma ve yazma işlemlerini yapabilmek anlamına gelmektedir. Yaratılan dosya öncelikle erişim tipine uygun şekilde açılmalıdır. Dosya ancak açıldıktan sonra dosya içerisindeki kayıtların okunması ve işlenmesi mümkündür. Dosya içerisindeki kayıtları değiştirmek, kayıt eklemek ya da boş bir dosyaya yazma işlemleri ise dosya gerekli yetkilerle açıldıktan sonra gerçekleştirilmesi gereken işlemlerdir.

Ardışık erişimli dosyalara veri yazmak için kullanılan Print komutu aslında bir MS Excel hücresi ya da bir VBA Formu üzerine veri yazdırılmasına benzemektedir. Bilindiği gibi bu komut ile tırnak içerisine alınmış bir karakter dizisi, belirlenen hedefe yazdırılır. Aynı mantıkla daha önce yazma yetkisi ile açılmış bir dosyanın tanımlayıcı tekil numarası kullanılarak ilgili dosya işaret edilirse tırnak içerisinde yazılan karakter dizesi dosya içerisine yazdırılacaktır. Örneklendirmek için S:163, Resim 8.5’te görülen yazdırma kodu çalıştırıldığında, yaratılan dosyanın çıktısı S:164, Resim 8.6’da incelenmelidir.

Print komutunda satır aralarını ayarlamak için noktalı virgül ve virgülden faydalanılır. Noktalı virgül ile ayrılan değerler önceki değerin bitiminden hemen sonra, virgül ile ayrılan değerler ise baskı sınırı olarak adlandırılan, 14 sütundan sonra yeni değerin yazdırılacağını göstermektedir. Her virgül karakteri, değerleri, bir sonraki 14 baskı sınırına ilerletmektedir. Bu sebeple gerekli durumlarda birden fazla virgül yan yana kullanılabilir.

Dikkat edilmesi gereken noktalardan biri de Print komutu ile yazdırılan metinlerin kod her çalıştığında eski verilerin üzerine tekrar yazılacağıdır. S:164, Resim 8.7’de bulunan kod bir butonun tıklama işlemine atanmıştır. Buton tıklandığında işlem yapılacak ve gerekli dosyaya komutlar aracılığıyla gönderilen değerler yazdırılacaktır. Bu kayda başka bir nesne eylem ikilisi ile farklı bir değer yazdırılması durumunda daha önce dosya üzerine yazdırılmış bulunan değerler silinecek ve yeni değerler onların yerini alacaktır.

Write komutu tıpkı Print komutu gibi ardışık erişimli dosyaya veri yazdırmak için kullanılan bir komuttur. Dosyaya yazdırılacak olan veriler virgül ile ayrılır ancak burada Print komutundan farklı olarak virgül, aralık tanımlamak için değil, değerleri birbirinden ayırmak için kullanılmaktadır. S:165, Resim 8.9’da Print için tanımlanan değerlerin Write komutu ile yazıldığı kod parçacığı ve S:165, Resim 8.10’da bu kodun dosya üzerindeki çıktısı görüntülenmektedir.

Input komutu, ardışık erişimli bir dosyadan okunan verileri değişkenlere atamak için kullanılır. Komuttan sonra içerisinden veri okunacak dosya tanımlayıcı tekil numarası yazılmalı, daha sonra ise okunan verilerin atanacağı değişkenler belirtilmelidir. Bu değişkenler daha önceden tanımlanmış yerel ya da global değişkenler olabilir. Input komutu ile değerler tek tek atanabilir.

Line Input Komutu ardışık erişimli dosyalardaki verileri satır satır okumayı sağlayan komuttur. Input komutu ile tek tek okunarak ayrı değişkenlere atanan veriler yerine dosyaya Print ya da Write komutları ile kaydedilmiş tüm bir satırı okumak amaçlanmaktadır. S:167, Resim 8.13’te, dört ayrı değişkene atanan dört satırlık Deneme_Dosya.txt verisi, A1 hücresinden başlayarak aşağıya doğru yazdırılmıştır. S:167, Resim 8.14’te bu kod çalıştırıldığında yapılan işlem görülmektedir. Dikkat edilecek olursa dosya yalnızca okumak için açılmıştır.

Bu kod için dört ayrı String tip değişken tanımlanmış ve bu değişkenlere okunan her bir satır A1, A2, A3 ve A4 hücrelerine yazdırılmıştır. Write komutu ile dosyaya yazdırılan veriler, tıpkı S:165, Resim 8.10’da, yani kod çıktısında görüldüğü gibi satır hâlinde, hücrelere değer olarak atanmıştır.

EOF (End of File – Dosya Sonu) ve LOF (Length of File – Dosya Uzunluğu) ifadeleri, dosyalarla çalışma esnasında sıkça başvurulan iki ifadedir. EOF ifadesi kullanıldığında, açık olan dosyanın sonuna gelinip gelinmediği test edilir. Bu sayede dosya içerisindeki kayıtlar okunurken, var olan tüm kayıtların okunup okunmadığı, dosyanın sonu test edilerek anlaşılabilir. EOF ifadesini kullanırken hangi dosya ile ilgili işlem yapılmak isteniyorsa o dosyanın tanımlayıcı tekil numarasından faydalanılır. LOF ifadesi ise yine dosya tanımlayıcı tekil numarasından faydalanılarak, o dosya içerisindeki kayıtların uzunluğu hakkında bilgi verir. LOF ifadesinin rastgele erişimli dosyalarda, kayıt sayısının hesaplanmasına yönelik kullanımı da mevcuttur.

Ardışık erişimli dosyalarda dosyaya veri girişi yapmak için kullanılan komutlar, Print ve Write, veri okumak için kullanılan komutlar ise Input ve Line Input olarak açıklanmıştır. Rastgele erişimli dosyalar ve ikili dosyalarda ise bu işlemler Put ve Get komutları ile gerçekleştirilir. Put komutunu, gerekli durumlarda üzerinden veri girişi yapılacak olan dosyanın tanımlayıcı tekil numarasından sonra, Kayıt_Sayısı değeri ile birlikte kullanmak da mümkündür. Dosyaya kaydedilecek olan değerler ise daha sonra yazılarak komut tamamlanır.

Put komutu ile üzerine veri yazılmış ya da daha önceden verilerle dolu bulunan bir dosyadan veri okuma işlemi ise Get komutu ile yapılabilir. Get komutu ile okunan veriler yine Input komutunda olduğu gibi önce değişkene ya da değişken yapısına, sonra da gerekli görülürse MS Excel hücrelerine yazdırılabilir. Get komutu da Put komutu gibi öncelikle hangi dosyadan veri okunacağını belirlemek amacıyla dosya tanımlayıcı tekil numarasına ihtiyaç duyar. Daha sonra verilerin hangi değişkene ya da değişken yapısına atanacağı belirlenir. Put komutu için kullanılan örnekten veri okuyarak MS Excel hücrelerine yazan kod parçacığı S:169, Resim 8.17’de görülmektedir.

Get komutu için ikinci bir buton eklenmiş ve kod bu butona tanımlanmıştır. Değişken yapısı olarak Put komutu için oluşturulan bilgi yapısından faydalanılmış ve yapı içerisindeki değişkenlere atanan değerler, MS Excel sayfasında A1, B1 ve C1 hücrelerine ayrı ayrı yazdırılmıştır. Kod çalıştırıldıktan sonra MS Excel sayfası çıktısı S:169, Resim 8.18’de görülmektedir.

Put ve Get komutları aynı zamanda ikili dosyalar için de kullanılmaktadır. Put komutu dosya tanımlayıcı tekil numarasından sonra değişken değerlerini ikili dosya üzerine gönderir. Dikkat edilmesi gereken hususların başında, Get ile ikili dosya üzerinden veri okurken değişken tiplerinin, dosya yazımında kullanılan veri tipleriyle aynı olmasıdır.

VBA ortamında dosyalarla çalışırken sık karşılaşılan sorunlardan biri de üzerinden veri okunmak istenilen dosyanın veri yapısı hakkında bilgi sahibi olunmaması durumudur. Böyle durumlarda dosyayı ikili dosya olarak açarak verileri her defasında bir bayt şeklinde okumak bir çözüm olabilir.

Seek ifadesi sayesinde üzerinde çalışılan dosyada istenilen kayda gidilebilmektedir. Loc ifadesi ise o anda etkin olan kaydın numarasını döndürerek hangi kayıtta olduğunun kullanıcı tarafından belirlenmesine yardımcı olmaktadır. Seek ifadesi kaydın yerini belirleyen bir işaretçi gibi düşünülürse Loc ifadesinin sadece bu işaretçinin değerini döndüren bir fonksiyon olduğu anlaşılmaktadır.

Bazı kayıtlara, genellikle güvenlik nedeniyle kullanıcı tarafından erişilmemesi gerekli olabilmektedir. Lock ifadesi ile gerekli bir ya da daha fazla kaydı kilitlemek mümkün olmaktadır. Lock ifadesinden sonra dosyanın tanımlayıcı tekil numarası ve kilitlenmek istenilen kayıt uzunluğu girilmelidir. Kayıt uzunluğu girilmediyse tüm dosya kilitlenir. Lock ifadesi ile kilitlenen bir dosya ya da dosya içerisindeki kayıtların bir bölümü, Unlock ifadesi ile açılabilmekte ve tekrar kullanıcı kullanımına sunulmaktadır.