Visual Basic

Visual Basic Excel Dosyası Okuma

Herkese merhaba, Visual Basic yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda Visual Basic ile Excel dosyası okumayı anlatacağım. Hadi başlayalım !

Excel dosyaları 3 içerikten oluşmakta. Bunların birincisi nesne, ikincisi book ve üçüncüse sheet. Sheet sayfaları ifade ederken book sheetlerin birleşiminden oluşuyor ve nesne ise Excel’i temsil ediyor. Yani nesneyi kitap olarak düşünürsek; book kitabın içeriği ve sheet ise kitabın sayfalarını temsil edecektir. İşte Visual Basic’te de bu şekilde var olan Excel dosyalarını okuyabiliyoruz.

Bir Excel dosyası 3 parçadan oluşuyor dedik ya, öncelikle bu parçaları Visual Basic’te oluşturalım. Bunun için 3 tane değişken oluşturacağız ve bunların veritipi Object olacak çünkü nesne, book ve sheetler aslında birer object. Hadi şimdi bunlar için birer tane değişken oluşturalım.

Dim ExcelObj As Object
Dim ExcelBook As Object
Dim ExcelSheet As Object

Değişkenleri oluşturduk ama bu değişkenler ile Excel dosyasını açacağımızı ve içerisindeki sheetlere erişeceğimizi belirtmedik, öyle bomboş içerisinde veri olmayan amaçsız değişkenler oldu. Ayrıca değişkenleri Object türünde oluşturduk ama ne objesi tutacaklarını söylemedik.

İşte burada CreateObject() adındaki fonksiyon imdadımıza yetişiyor. Bu fonksiyon String tipte bir tane parametre istiyor ve parametre olarak gönderdiğimiz şeyin bir tane objesini oluşturuyor. Bu fonksiyon ile aklınıza gelebilecek tüm dosyaları oluşturabiliyorsunuz. Biz Excel dosyası üzerinde işlem yapacağımız için Excel’e yönelik şeyler kullanacağız.

ExcelObj değişkenimiz Excel’in kendisini tuttuğu için bu değişken Excel’in kendisini tutacak ve CreateObject() fonksiyonu ile Excel nesnesi oluşturmak için de parametre olarak Excel.Application vermemiz gerekiyor. ExcelSheet değişkenimizde sheetleri tutacağı için CreateObject() fonksiyonuna Excel.Sheet parametresi vermemiz gerekiyor. Bu iki kullanımla birlikte artık Excel nesnemiz ve içerisindeki sheetlerimizi kullanabiliyor olacağız.

Şimdi bu bahsettiğimiz şeylerin kodunu yazalım.

Set ExcelObj = CreateObject("Excel.Application")
Set ExcelSheet = CreateObject("Excel.Sheet")

Şimdi de Excel dosyasını açalım ve okumaya hazır hale getirelim. Bunun için oluşturduğumuz ExcelObj değişkeninin Workbooks sınıfı altındaki Open() fonksiyonunu kullanacağız. Bu fonksiyon Excel dosyasının yolunu String tipte parametre olarak istiyor ve bu fonksiyon tıpkı bir kullanıcı gibi parametre olarak verdiğimiz yoldaki Excel dosyasını açıyor. Fakat bir Windows kullanıcısından farkı Excel dosyasını bellekte açması, yani bizim yaptığımız gibi Excel görünmüyor, bunun yerine arkaplanda açılıyor.

ExcelObj.Workbooks.Open "c:/users/kullanici/desktop/excel.xls"

Excel dosyasını bellekte açtık, şimdide Excel içerisinde bulunan book ve book içerisinde bulunan sheetleri açalım. Book açmak için az önce değer ataması yaptığımız ExcelObj değişkeni altında bulunan WorkBooks() fonksiyonunu kullanacağız. Bu fonksiyon Integer tipte bir tane parametre istiyor ve bu parametre ile ilgili booku açıyor ve geriye book nesnesi döndürüyor.

Set ExcelBook = ExcelObj.WorkBooks(1)

Evet Excel dosyasını ve dosya içerisinde bulunan booku açtık, şimdi sıra geldi sheet yani sayfayı açmaya. Biliyorsunuz ki Excel dosyası içerisinde birden fazla sheet bulunabiliyor ve her bir sheet 1’den başlayarak sırayla numaralandırılıyor, tıpkı bir kitap gibi 🙂

Herhangi bir sheeti açmak içinde ExcelBook değişkeni altında bulunan WorkSheets() fonksiyonunu kullanıyoruz. Bu fonksiyon Integer tipte bir tane parametre istiyor ve verdiğimiz parametreye ait olan sheeti açarak okumaya hazır hale getiriyor.

Set ExcelSheet = ExcelBook.WorkSheets(1)

Bu zamana kadar yaptığımız işlemler ile her şeyi hazırladık, sıra geldi verileri okumaya.

Bildiğiniz üzere bir Excel dosyasında veriler sheetler içerisinde bulunuyor ve biz verileri okumak için sheetleri kullanıyoruz. Visual Basic’te bir kullanıcıyı taklit ettiği için verileri okumak için sheeti tutan nesneyi kullanmamız gerekiyor. Ayrıca Excel dosyasında veriler hücreler içerisinde yer aldığına göre Visual Basic ile Excel dosyasındaki verileri okumak için hücrelere erişmemiz gerekiyor. Hücrelerin sütun ve satır bazında (x, y) koordinat düzlemine göre koordinatları olduğuna göre satır ve sütunları gezerek tüm veriyi okuyabiliriz demektir.

Herhangi bir hücredeki veriyi okumak için sheeti tutan değişkenin (yani buradaki ExcelSheet değişkeni) altında bulunan cells fonksiyonunu kullanacağız. Bu fonksiyon sütun ve satır numaralarını ayrı ayrı olmak üzere 2 tane Integer tipte parametre alıyor ve bu parametreler hücrelerin koordinatlarını temsil ediyor. Yani örneğin (1, 1) koordinatında bulunan bir hücredeki veriyi okumak için ExcelSheet.cells(1, 1) şeklinde bir kullanım yapmamız gerekiyor. Peki tüm veriyi nasıl okuyabiliriz ? İşte burada döngüler yardımımıza yetişiyor. Hangi döngüyü kullanacağımız ise Excel dosyasının içeriğini bilip bilmememize göre değişiyor. Örneğin dosya içerisindeki sütun ve satırların sayısını biliyorsak for, bilmiyorsak while yada do-while kullanabiliriz. Tabiki ben her iki durumu da anlatacağım. İlk önce satır ve sütun sayısını bildiğimiz durumu ele alalım.

Örneğin Excel dosyası içerisinde 10 satır ve 20 sütun olduğunu varsayalım. Bu durumda bize 2 tane for döngüsü gerekecek. Birinci döngü ile sütunları, ikinci döngü ile de satırları dönmemiz gerekecek. Tabiki bu döngülerin iç içe olması gerekiyor. Peki hangi döngü içeride, hangisi dışarıda olması gerekiyor ?

sheet nesnesi altında bulunan cells() fonksiyonunun ilk parametresi sütun numarası, ikinci parametre ise satır numarasını temsil ettiği için sütunları gezdiğimiz döngü dışarıda, satırları gezdiğimiz döngünün de içeride olması gerekiyor. Ayrıca Excel’de satır numaraları 1’den başladığı için döngüyü 1’den başlatmamız gerekecek. Örneğin Excel dosyası içerisindeki her hücredeki veriyi messagebox olarak ekranda gösteren bir döngü kuralım.

for i = 1 to 20
    for j = 1 to 10
        MsgBox(ExcelSheet.cells(i, j)
    Next j
Next i

Evet bu kodları yazıp çalıştırdığınızda (1, 1) koordinatında buluna hücreden başlayarak tüm hücrelerdeki verileri messagebox olarak ekranda göreceksiniz.

Excel dosyasındaki satır ve sütun sayısını her zaman bilemeyebiliriz. Örneğin kullanıcıdan bir tane Excel dosyası seçmesini isteyip sonrasında dosyada bulunan tüm verileri bir tablo içerisinde göstermemiz gerekebilir. Bir Excel dosyasında en fazla 16384 sütun ve 1048576 satır bulunabileceğini göz önüne aldığımızda bu şekilde bir for döngüsü oluşturmamız hayli saçma olacaktır. Çünkü sütunları gezdiğimiz for döngüsü 16384 kere dönüp her bir adımda satırları gezdiğimiz for döngüsünün 1048576 kere döneceğini göz önüne alırsak toplamda 17179869184 tane döngü adımı oluşacaktır. Fakat kullanıcının seçtiği Excel dosyasında 1 satır ve 1 sütun varsa o zaman çok gereksiz bir şekilde çok büyük bir döngü dönecektir. Bu durumdan kurtulmak için mesela hücre hücre gezsek ve ilgili hücrede herhangi bir veri yoksa bir sonraki satıra gezsek nasıl olur ? Bu sayede veri biterse bi alt satıra geçecek ve 16384 kere değil veri bulunan hücre sayısı kadar döngü adımı oluşacaktır.

Böylesi bir durumda kullanacağımız en iyi döngü while yada do-while olacaktır. Ben while ile olanı anlatayım, ki zaten Visual Basic’te while ile do-while döngüleri arasında çok küçük bir fark olduğu için ufak bir değişiklik ile döngüler arasında geçiş yapabilirsiniz.

Şimdi öncelikle sütunlar arasında geçiş yapmak için bir tane, satırlar içinde geçiş yapmak için de bir tane olmak üzere toplamda 2 tane Integer tipte değişkenler oluşturmamız gerekiyor. Bu değişkenler aracılığıyla hücreler arasında geçiş yapacağız. Döngünün her bir adımında öncelikle o an üzerinde bulunduğumuz hücrede veri olup olmadığına bakacak, veri varsa hücre içeriğini okuyup messagebox ile gösterecek ve bir sonraki hücreye geçeceğiz. Eğer hücre içerisinde veri yoksa o zaman bir satır sonrasına ve ilk sütuna geçeceğiz. Şimdi bu teorik ifadeyi pratiğe dökelim ve kodunu yazalım.

Dim row as Integer, col as Integer
row = 1
col = 1
While Not IsEmpty(ExcelSheet.cells(col, row))
    MsgBox ExcelSheet.cells(col, row)
    row = row + 1
    If IsEmpty(ExcelSheet.cells(col, row)) Then
        row = 1
        col = col + 1
    End If
Wend

Görüldüğü üzere hem yazdığımız kod satır sayısı olarak, hemde performans olarak for döngüsü kullanımından daha iyi oldu 🙂 Bu kodları da yazıp çalıştırdığınızda for döngüsüyle yaptığımızın birebir aynısı olarak her bir hücrede bulunan veriyi messagebox olarak ekranda gösterecektir.

while döngüsü ile yaptık ya, hadi bunu do-while döngüsüne çevirelim.

Dim row as Integer, col as Integer
row = 1
col = 1
Do While Not IsEmpty(ExcelSheet.cells(col, row))
    MsgBox ExcelSheet.cells(col, row)
    row = row + 1
    If IsEmpty(ExcelSheet.cells(col, row)) Then
        row = 1
        col = col + 1
    End If
Loop

Bakın ne kadar da kolay bir geçiş oldu 🙂 while ifadesinin başına do ekledik ve while döngüsü bloğunu bitirdiğimiz Wend deyimi yerine Loop yazdık ve while döngüsü do-while döngüsüne dönüştü 🙂

Evet Excel dosyası ile işimiz bitti, tüm veriyi okuduk. Visual Basic, tıpkı bir kullanıcı gibi dosyayı açıyor demiştim ya, artık dosyayı kapatalım ki hem dosya bellekte yazılı kalmasın hemde bir başka kullanıcı (bir proses yada biz) o dosyayı okumak istediğinde hata almasın. Excel dosyasını kapatmak için de ExcelObj değişkeni altında bulunan WorkBooks sınıfının Close() metodunu kullanacağız. Bu metod herhangi bir parametre istemiyor ve ExcelObj değişkeniyle açtığımız yoldaki dosyayı kapatıp serbest bırakıyor.

ExcelObj.WorkBooks.Close

Evet artık tüm işlemlerimiz tamamlandı, Visual Basic ile Excel dosyasını okuma işlemi bu kadardı. Yazdığımız tüm kodları daha toplu ve anlaşılabilir olması için aşağıya bırakıyorum.

Dim ExcelObj As Object
Dim ExcelBook As Object
Dim ExcelSheet As Object
Dim row As Integer, col As Integer

Set ExcelObj = CreateObject("Excel.Application")
Set ExcelSheet = CreateObject("Excel.Sheet")
row = 1
col = 1

ExcelObj.WorkBooks.Open "C:/Users/kullanici/Desktop/excel.xls"
Set ExcelBook = ExcelObj.WorkBooks(1)
Set ExcelSheet = ExcelBook.WorkSheets(1)

' for ile hücre hücre okuyup veriyi messagebox ile gösterme
for i = 1 to 20
    for j = 1 to 10
        MsgBox(ExcelSheet.cells(i, j)
    Next j
Next i

' while ile hücre hücre okuyup veriyi messagebox ile gösterme
While Not IsEmpty(ExcelSheet.cells(col, row))
    MsgBox ExcelSheet.cells(col, row)
    row = row + 1
    If IsEmpty(ExcelSheet.cells(col, row)) Then
        row = 1
        col = col + 1
    End If
Wend

' do-while ile hücre hücre okuyup veriyi messagebox ile gösterme
Do While Not IsEmpty(ExcelSheet.cells(col, row))
    MsgBox ExcelSheet.cells(col, row)
    row = row + 1
    If IsEmpty(ExcelSheet.cells(col, row)) Then
        row = 1
        col = col + 1
    End If
Loop

Tüm Visual Basic yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.

Skorumuz:
Oy Vermek İçin Tıklayın
[Toplam: 0 Ortalama: 0]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu