ARRAYS

1 - Arrays Nedir?

     Array, aynı veri tipine sahip farklı değerlerin bir veya birden fazla boyutta statik veya dinamik olarak depolanabilmesini sağlayan bir çeşit dizi yapısıdır. Arrays konusu, VBA ve çoğu programlama dili açısından çok önemli bir konu olduğu için kişisel bilgilerimin yanında bazı internet sitelerinde yer alan bilgileri de kullanarak daha zengin ve eksiksik bir içerik oluşturmayı çalışacağım. Bu sayede birçok sitenin sunduğu bilgilere ait genel bir bakış açısı kazanabileceksiniz. Bilgileri aldığım internet sitelerinin linklerini de bilgilerle birlikte paylaşıyor olacağım.

    Bir değişkenin veri depolayabileceği bir adet bölümü/yeri(compartment) varken, bir ‘Array’ in veri depolayabilecek birçok bölümü/yeri vardır. Aynı tipte veriler ile çalışmak için bir Array tanımlanabilir. Sonrasında ise verilerin hepsine ulaşmak için Array’e veya Array içerisinde yer alan bir değer ulaşmak için ise Array’in içindeki değerlere tek tek ulaşılabilir. Örnek vermek gerekirse, bir yılın her günü yaptığımız harcamaları ayrı ayrı kaydetmek için 365 adet değişken tanımlamak yerine, 365 elemanlı bir Array tanımlanabilir. Her eleman bir günün harcama değerini alır. Array içerisinde elemanların sıra numarası 0’dan başlar. Bu sebepten üst sınır 364 sayısı olup toplam 365 gündür.(https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/using-arrays)

    Genel olarak programlama dillerinde Array kullanımının avantajlarını sıralayacak olursak(https://www.educba.com/advantages-of-array/);

    #Bellek, bir array içerisinde dinamik olarak yer değiştirebilir. Bu da bilgisayar belleğinin boşa kullanılmasının önüne geçer.

    #Bir Array içerisinde, değerler bellekte bir birlerine yakın konumda bulunurlar. Bu da bilgisayar tarafında ön belleğe alınmalarını kolay hale getirir. Önbellek canlısıdırlar(Cache Friendly). Bunun sonucunda Array içerisinde gerçekleştirilen bir iterasyon işlemi, başka veriler üzerinde gerçekleştirilebilecek iterasyon işlemlerinden çok daha hızlı gerçekleşecektir.

    #Array’de verilere ulaşabilmenin süreleri bilinebilir. Array’ler söz konusu olduğunda bilgisayar array’in ve verilerin nerede olduğunu, belleğin neresinde depolandığını tam olarak bilir. Sonuç olarak ARray verilerine ulaşmak hem hızlı hem de ulaşılabilecek süre tahmin edilebilirdir. 

    # Kolay hata ayıklama. Bağlantılı listeler göz önünde bulundurulduğunda genellikle bir sıralamanın gerçek olup olmadığının kontrolü zaman alan bir işlemdir. Arraylerin kendine ait indexlemesi olduğu için bu işlem kolayca gerçekleştirilebilir.

      # Bellek kullanımında daha az yere ihtiyaç duyar. Sadece barındırıdığı değerler, başlama adresi ve uzunluğu için bellekte yer tutar.

     # Değişkenlerden daha avantajlıdır. Array homojen bir veri koleksiyonudur. Yani aynı değişken altında birçok değer barındırabilir. Eğer kullanıcı aynı tipte farklı değerler depolamak istiyorsa, en iyi seçeneği Array’lerdir.

      # Veri yapısı bakımından üstündür. Aynı tipte farklı verileri depolayabilmesinin yanısıra depoladığı bu verileri belli bir sıraya göre depolar. Yani sıra numarası(index) kullanarak istediğimiz veriyi Array içerisinden çekebiliriz. 

      # Code’un tekrar kullanılabilmesi konusunda çok avantaj sağlar. Array’lerin en önemli özelliklerinden birisi de bir kere tanımlandıktan sonra defalarca kullanılabiliyor olmalarıdır. Bu durum da hem codun birden çok kullanılabilmesini hem de kolay okunabilmesini sağlar.

     # Çok boyutlu Array’ler. Array’lerden oluşan Array’ler olarak düşünebilirsiniz. Benzer tipteki verileri depolamakta ve codun herhangi bir noktasında kullanılabilirler. Depolanabilecek veri sayısı, Array boyutlarının büyüklüklerinin çarpılmasıyla bulunurlar.

2 - Statik Array

    Eğer Arrays içerisinde tanımlanabilecek değerlerin sayısı Sub-Routine içerisinde rakamsal olarak girilerek belirleniyorsa bu tip Arrays’e ‘Statik Array’, ‘Array’ herhangi bir şekilde alabileceği değer sayısı bakımından sınırlandırılmamış ve alabileceği değer sayısını güncelleyebiliyorsa da bu tip arrays’e ‘Dinamik Array’ denir. 

2.1 - Tek Boyutlu Arrays

    Eğer bir Array içerisinde tanımlanılan değerlere ek olarak her bir değişkene ait farklı değerler de depolanıyorsa ‘Çok Boyutlu’, sadece liste halinde tek tek değerler tanımlanıyorsa ise bu bir Arrays/Array’lere de ‘Tek Boyutlu Değerler’ denir.

    İlk olarak örneklerde kullanacağımız ‘Marka ve Modeline Göre Otomobil Fiyatları’ tablomuzu hatırlayalım.

Arrays - ExampleTable

 

Örnek - 2.1.1

    Tek boyutlu bir Array oluşturarak ilk örneğimize başlayalım. Arrays konusunda değinmemiz gereken pek çok nokta var ancak bir paragrafın içinde bu noktalara değinmekten ziyade örneklerin içinde, kod satırlarını incelerken bahsetmek dikkat etmemiz gereken noktaların akılda daha kalıcı olmasını sağlayacaktır. Bu kapsamda tablomuzda yer alan ilk 3 araba markasını bir Array içine değer olarak aktaralım.

Arrays - Example_Code_V01– İlk olarak değişken yerine bir Array tanımlıyoruz. Sizin de bir numaralı satyırda gördüğünüz gibi Array tanımlama esas itibariyle normal bir değişken tanımlamayla neredeyse aynı. Aradaki tek fark parantez içerisinde yazılan 2 rakamı. Parantez içinde yazılan bu ‘2’ rakamı bize ilk başta 3 şey ifade eder. 

# Arrays, taşıdığı değerler bir sıraya göre bünyesinde barındırır ve ilk değer 0’dan başlar. Yani biz parantez içerisinde 2 yazdığımız zaman aslında, tanımladığımız Array’ın 0, 1, 2 sıra numaralarını sahip 3 adet değer barındırabileceğini belirtiyoruz. Farklı olarak “UcuzArabalar( 1 to 3)” şeklinde de Array’ın kaç adet değer barındırabileceğini girebilirsiniz. Bu stilini tercih ederseniz, sıra numrası 1’den başlayacak şekilde Array içinde depolanacaktır.  Tercih size kalmış. Biz örneklerde her ikisini de kullanacağız. 

NOT_1: 

Array konusunu çalışırken kesinlikle ‘Locals‘ penceresini yardımcı olarak kullanın. Locals penceresinde tanımlanan Array’lerin ağaçsı yapısı çok net bir şekilde görülebilir, bu sayede Array’ın ne olduğu görsel olarak da önünüze serilmiş olur.

    2-3-4 numaralı maddelerde hazırlamış olduğumuz ucuzdan pahalıya araba tablosunun ilk 3, yani en ucuz 3 araba marka ve modelini birleştirerek ‘String’ olarak tanımladığımız UcuzArabalar(2) değişkenine atıyoruz. İşlem çok basit. UcuzArabalar(2) Array’ının 0, 1 ve 2 sıra numaralı 3 adet değer alabileceğini biliyoruz. Bu sıra numaralarını kullanarak(Index) UcuzArabalar(2) Array’ının, 3 adet alanına, worksheet üzerindeki ilgili hücrelerin değerlerini atıyoruz. Bu şekilde değer atama işlemini gerçekleştiriyoruz. F8 ile Sub-Routine’i adım adım çalıştırdığımızda, Locals penceresi üzerinde Array ve Array’a ait değerleri izleyebilirsiniz.

Arrays - Example_Code_V0_Locals

    Locals penceresinde tanımlamış olduğumuz Array ve değerlerini görebilir ve kontrolünü yapabiliriz.

    5-6-7 Bu 3 maddede ise artık 3 adet değer ihtiva eden Array kullanılarak Sheet2′ A1, A2 ve A3 hücrelerine bu değerleri yazdırıyoruz. Bu işlemi gerçekleştirirken yaptığımız tek şey ilgili hücrenin değerini, Array’de indeks kullanarak belirlediğimiz değere atamaktır. 

    8– Son olarak bu satırda ise tanımladığımız Array ve değerleri ‘Erase’ metodu ile siliyoruz.

     Bu örnek ile çok basit bir şekilde Arrays konusuna giriş yaptık. Siz de taktir edersiniz ki sadece 3 adet değişken için kimse kolay kolay Array oluşturmaz, ancak şimdilik bu kısma takılmayın. Bir sonraki örnekte daha fazla veriyi zahmetsiz bir şekilde Array’a atamayı göreceğiz.

Örnek - 2.1.2

    Arrays değer atama işlemi 2.1.1 örneğinde yaptığımız gibi gerçekleştirilirse çok vakit alacaktır ve gördüğünüz gibi değerlere özel değişken atamaktan bir farkı da olmayacaktır. Bu sebepten Arrays, değer sayısı çok olduğu durumlarda avantajlı hale gelir ve kullanımı mantıklı olur. 

    Çok sayıda değerin Array içerisine atanmasında döngülerden, özellikle For Next döngüsünden faydalanılır. 

Arrays - Example_Code_V1Bu Sub-Routine’de listedeki 10 araba Array içerisine değer olarak taşınacaktır. 

1-UcuzArabalar10(9) isimli, 0’dan 9’a 10 adet değer alabilecek bir Array tanımlanmıştır.

2-For Next döngüsünde döngü sayısını alacak (Iterative) Sayac değişkeni tanımlanmıştır.

3-Herhangi bir karışıklığı önlemek amacıyla, “Marka ve Modeline Göre Otomobil Fiyatları” tablosunun olduğu sayfa seçilmiştir.

4– Bu maddede ise For döngüsü ile ilk 10 değer belirlenen hücreden başlamak üzere okunarak, Array’e değer olarak atanmıştır.

4.1. Bu satır ile Sayac değişkenin her bir değer artışıyla, sheet1 üzerinden değerleri tek tek okuyup Array içine yazdırılmasını sağlıyoruz.

    For döngüsü Offset kullanarak, marka sütununda alt alta olan değerleri tek tek okuyarak, Array içine kaydediyoruz. Yine Locals penceresinden Array görünümünü inceleyelim.

Arrays - Example_Code_V1_Local

    Locals penceresinde UcuzArabalar10 isimli Array’ı ve ihtiva ettiği değerleri net bir şekilde görebilmekteyiz. Basit bir For döngüsü yardımıyla oluşturduğumuz kod ile ister 10 ister 10000 adet veriyi Array içerisine kayıt edebiliriz.

    4′ Bu kod ile For döngüsünü sonlandırıyoruz.

    5- Sheet2 seçiyoruz.

    6 – 6.1 – Bu sefer For döngüsünü tersine oluşturarak, Array içindeki değerlere index numaralarını kullanarak ulaşıp, sırayla A sütununa yazdırıyoruz. Bir yandan Sayac değişkeni sayesinde alt hücreleri seçiyoruz, aynı zamanda da index numaralarının değişimi ile farklı değerler yeni hücrelere atanıyor.

    6′ – For döngüsünü sonlandırıyoruz.

    7 – Sheet1 seçiyoruz.

   8 – Tanımlanmış olan UcuzArabalar10 Array’ı siliyoruz. 

    For döngüsünü daha önceden işlemiş olduğumuz için, bu bölüm içerisinde detaylı bir şekilde açıklanmamıştır. Tekrar For Döngüsünü gözden geçirmek isteyenler, aşağıdaki tuş ile ilgili ders içeriğine ulaşabilirler.

3 - LBound & UBound

    Bir önceki örnekte(Örnek 2.1.2) döngülerin tanımlanan bir Array’e değer atanırken nasıl kullanıldığını gördük. Tek veya çok boyutlu Array’lere veri aktarımında döngüler çok kullanışlı bir alternatiftir. Bu bölümde ise döngülerin kullanımı esnasında, kullanacağımız LBound ve UBound fonksiyonlarıyla işimizi bir nebze daha kolaylaştıracağız. 

    Şimdi bir üstte yer alan Sub-Routine’i sonraında ise LBound ve UBound kullanarak hazırladığımız alternatif Sub-Routine’i inceleyelim.  

Arrays - LBound & UBound

    İki Sub-Routine arasında yazım olarak fark olsa da her ikisi de aynı görevi yerine getirir. Şimdi farklılığı oluşturan ilk Sub-Routine ile ikinci Sub-Routine arasındaki 4-A ve 6-A’ satırlarını inceleyelim. 

       For Sayac = 0 To 9           <=========>             For Sayac = LBound(UcuzArabalar10) To UBound(UcuzArabalar10)

     4. Satır ve A Satırını karşılaştırdığımızda aslında fark çok net bir şekilde görünmektedir. Ancak yine de bu iki fonksiyonun görevini tam olarak açıklayalım. 

     -LBound= Bu fonksiyon, tanımlanmış bir Array yapısının, tanımlanan alt sınırını verir. 

     -UBound= Bu fonksiyon, tanımlanmış bir Array yapısının, tanımlanan üst sınırını verir. 

    Not: Eğer Array çok boyutluysa parametre olarak ilk önce Array ismini, ikinci olarak da kaçıncı boyut olduğunu girmeliyiz. Çok boyutlu (MultiDimensinal Array)  örneğinde detaylı olarak göreceğiz.

    Örnek vermek gerekirse;

Dim Array1(10) As String

Dim Array2(1 to 16) As String

Dim Array3(10 To 55) as String

     LBound(Array1) = 0

     LBound(Array2)=1

     LBound(Array3) = 10

     UBound(Array1) = 10

     UBound(Array2)=16

     UBound(Array3) = 55

     For döngüsünde ihtiyaç duyduğumuz döngü aralığının el ile değil de LBound ve UBound kullanarak otomatik olarak girmiş oluyoruz. Bu sayede, array içerisinde barındırılan değişken sayısında bir güncelleme olması durumunda, tekrar Sub-Routine içerisinde yer alan For döngülerinin döngü aralığını girmek zorunda kalmıyoruz.    

     Bu aşamada bu iki fonksiyonun bize kazandırabileceklerini tam olarak kavrayamayabilirsiniz. Ancak Dinamik ve Çok Boyutlu Array kısımlarına geldiğimizde, daha net bir şekilde faydalarını görebileceksiniz.

4 - Çok Boyutlu Arrays - MultiDimension Arrays

    Çok boyutlu Arrays en basit anlatımıyla; Array içerisinde yer alan değişkenlerin de kendi altında başka değişkenlere sahip olmasıdır. Array içerisinde Array gibi düşünebilirsiniz. Bu yapının anlaşılması için kullanılabilecek en iyi materyal Locals penceresidir. Locals penceresinde çok boyutlu olan bir Array net bir şekilde sanki bir ağacın dalları gibi gözlemlenebilir. Biz bu derste sadece 2 boyutlu Arrays işleyeceğiz ancak size örnek oluşturması için 5 boyutlu bir Array’in Locals penceresindeki görünümünü sizinle paylaşıyorum.

Arrays - 5D_Example

    Locals penceresi sayesinde Arrays yapısı çok basit bir şekilde görüntülenebilmektedir. Şimdi ise çok boyutlu(MultiDimension Arrays) Arrays nasıl tanımlanır onu görelim. 

    

4.1 - Çok Boyutlu Arrays(MultiDimension Arrays) Nasıl Tanımlanır?

    Tek boyutlu Arrays ile Çok boyutlu Arrays arasında en temel fark, açıklamada da bahsettiğim gibi depolanan her değişken bir Array gibi hareket ederek, kendi altına başka değişkenler de alabilmesidir. 

    Tek boyutlu Arrays tanımlarken, Array’ın alabileceği değer sayısı belirtilir. Çok boyutlu Arrays’de ise ek olarak, değer olarak alınan bu değişkenlerin kendilerinin de kaçar adet değer alabileceği yazılır. Toplamda Array içerisine alınan değerler ise boyutların alabileceği değerlerin çarpımı ile bulunur. Aynı bir tablonun sahip olduğu elemanlar gibi. Satır x Sütun sayısı bize nasıl bir tablonun eleman sayısını veriyorsa, Arrays’de boyutların birbiri ile çarpımı ise toplam eleman sayısını veya daha doğrusu Array’ın alabileceği toplam eleman sayısını verir. 

    Büyük veri gruplarının Arrays içerisine depolanması esnasında yaşayabileceğimiz en büyük sıkıntı farklı veri tipinde değerlerin değişken olarak Arrays içerisine tanımlanmasıdır. Örnek olarak eğer bir araba modeli ve bu modele ait fiyatları Array içerisinde depolamak istersek String veya Doublei Long şeklinde yapacağımız Array tanımlama işleminin ardından Sub-Routine hata verecektir. Bu hatanın engellenebilmesi için Array’ın veri tipini ‘Variant’ olarak tanımlıyoruz ve VBA Editor’un veri tipi tayinini her bir değer için bizim yerimize yapmasını sağlıyoruz. 

    Bu basit açıklamalardan sonra örneğimize geçelim ve uygulamalı olarak çok boyutlu Arrays’i inceleyelim.

Arrays - MultiDimension Arrays

    Yan tarafta Arabalar adında 2 boyutlu olarak tanımlanmış bir Array görmektesiniz. Bu Array’ı tanımlama sebebimiz yukarıdaki tabloda gördüğünüz bütün verilerin tek bir Array yapısı içine kaydedilmesinin istenmesidir. Süyun başlıkları hariç, ki isterseniz siz kendi yaptığınız örnekte dahil edebilirsiniz, ilk 10 arabayı bir Array içerisine sıra numaralarından başlamak üzere kaydedeceğiz. İlk olarak Array değişkenini tanımlayarak bu işleme ve Sub-Routine’e başlayalım.

 # 1 – Dim Arabalar( 0 To 9, 0 To 8) As Variant. Şimdi bu yapıyı bölelim. 

Tek boyutlu Arrays oluştururken kaç adet veri depolanabileceğini de aynı buradaki örnekte gibi parantez içerisine yazarak belirliyorduk. Ancak buradaki fark artık tek değil 2 boyutlu bir değişken oluşturmamız. Haliyle de her boyuta ait depolanabilecek veri sayısını sırayla giriyoruz. Bu Arabalar Array’ında ilk boyut 0 To 9 yani toplamda 10 ve 2.boyut ise 0 To 8 yani toplamda 9 değer alabilecek şekilde tanımlama yapılmıştır. Bunun sebebi ise ilk 10 arabanın ve bu 10 arabaya ait tam 9 adet özelliğin Array içerisinde depolanmasının istenmesidir. 9 adet diyorum çünkü her satır Sıra No’dan Fiyat’a 9 adet hücreden oluşmaktadır.

    Eğer Arabalar Array’i 3 boyutlu tanımlanmak istenseyd;

    Dim Arabalar(0 To 9, 0 To 8, 0 To 10) As Variant olurdu. Tabi 10 rakamı sadece örnek oluşturması için kullanılmıştır. Yani Array’ın alabileceği 

değer kapasitesi= 10 x 9 x 11 = 990 olurdu. 

    Peki 4 boyutlu olsaydı?

    Dim Arabalar(0 To 9, 0 To 8, 0 To 10, 0 To 5) As Variant olurdu. Yani Array’ın alabileceği değer kapasitesi= 10 x 9 x 11 x 5 = 4950 olurdu. 

    Tablomuzda gördüğünüz gibi birden fazla tipte değişken yer almaktadır. İşte bu noktada Array’ın tanımlandığı veri tipini Variant yapmış olmamız bu Sub-Routine’in çalışmasını olanak vermiştir. Siz de bu Sub-Routine’i bilgisayarınızda çalıştırırken Locals penceresinden VBA Editor’un nasıl farklı veri tiplerine farklı değerler atadığını F8 tuşu vasıtasıyla gözlemleyin.

    # 2 – Dim D1 As Integer. Burada D1 aslında boyut kelimesinin ingilizcesi olan “Dimension” kelimesinin baş harfi olarak seçilmiş ve yanına 1 eklenmiştir. D1 değişkenini tanımlamamızın sebebi ise For döngüsü ile tablomuzdaki verilerin sütun ve satırlar arasında .OffSet metodu ile hareket ederek okuyabilmektir. Sırayla bir satır bitirildikten sonra diğer satıra geçilecek şekilde For döngüsü oluşturulmuştur.

    # 3 – Dim D2 As Integer. İç içe oluşturulan For döngülerinin(Nested), satır boyunca hücreler üzerinde ilerlenebilmesine ve okunmasına olanak veren iç For döngüsünde kullanılmak üzere oluşturulmuş bir sayaçtır(Iterative). 

    # 4 – For D1 LBound(Arabalar,1) To UBound(Arabalar,1) 

Arrays - Example_Code_V3_MultiDimensionArrays_1    Sol tarafta basit çizimlerle LBound ve UBound ile çalışırken, boyutların nasıl çizildiğini anlatmaya çalıştım. Burada da metin olarak anlatmak istiyorum. 

    Tanımlanan çok boyutlu bir Array’de LBound ve UBound fonksiyonları kullanılırken, alt ve üst sınırlarının alınacağı boyutun yazım sırası yazılır. 

    Bizim örneğimiz 2 boyutlu olduğu için kurmuş olduğumuz For döngüsünde eğer birinci boyutun alt ve üst sınırını For döngüsünde kullanmak istersek, aynı 4 numaralı kod satırında yaptığımız gibi;

    LBound(Arabalar, 1) ve UBound(Arabalar, 1) şeklinde fonksiyonları kullanırız. 

    LBound(Arrayİsmi, Rakamla Boyut Sırası) olarak da aklınızda bu kullanımı tutabilirsiniz. 

'Değer Yazdırma
For D1 = LBound(Arabalar, 1) To UBound(Arabalar, 1) '_____________________4
For D2 = LBound(Arabalar, 2) To UBound(Arabalar, 2) '_________________4.1
Arabalar(D1, D2) = Sheet1.Range("a3").Offset(D1, D2).Value '______4.1.1
Next D2 '_____________________________________________________________4.1'
Next D1 '_________________________________________________________________4'

    4 numara ve alt maddelerinden oluşan For döngüsü ile yaptığımız işlemini biraz daha açıklamak istiyorum. Burada en basit şekliyle yaptığımız işlem; Range(“A3”) ile başlayan, toplam 10 satır ve 9 sütundan oluşan tablodaki verileri, tanımlamış olduğumuz 2 boyutlu ve toplam 90(0 To 9, 0 To 8) adet veri kaydetme alanına aktarmaktır.

    Arrays içine veri aktarılırken bu 90 adet veri alanına veriler tablodan tek tek okunarak tek tek yazdırılır. Bu aşamada Sub-Routine bir yandan Arrays içindeki veri depolama alanını her bir veri aktarımından sonra değiştirirken, bir yandan da tabloda değeri okunan hücre değiştiriliyor.

     Array(D1, D2) = Range(“a3”).OffSet(D1, D2).Value ifadesinde For döngüsü sayesinde eşitliğin her iki tarafı da her döngü sayısı ile birlikte bir artıyor. Eşitliğin sağında bu sayede satır satır bütün tablo taranarak, Array içerisinde yer alan farklı alanlara atanıyor. 

    Locals penceresinde yaşanan bu işlemi gözlemleyelim. 

 

    

    Üst kısımda tablomuzu görüyoruz. Altta ise Sub-Routine çalıştırıldıktan sonraki Locals penceresini. Kırmızı ve mavi ile altları çizilen numaralar D1 değişkenini gösteriyor. Yani Array için bir numaralı boyutun INDEX’ini, OffSet metodu içinse dikey yönde yapılacak öteleme işleminin miktarını belirtir. D2 ise Array’in 2.Boyut index’ini ve OffSet metodunun yatay doğrultuda yapacağı öteleme miktarını belirtir.  

    D1 ve D2 aynı eşitlik içerisinde hem Array’in index’i hem de tablodaki OffSet milktarını belirttiği için, For döngüsü ile D1 ve D2 değişkenlerinin değişimi, Array’ın veri depolayacağı alanı ve tablodaki hücreyi aynı anda etkiler ve değiştirir. Tabloda aynı satır üzerindeki veriler okunurken, okunan veriler Array’ın birinci boyutunda yer alan değişkenlerin alt değişkenleri içerisine yazdırılır.

     NOT_1:

    Variant olarak tanımlanan Arabalar Array’inin içindeki alanlara değer atandıkça, VBA tarafından uygun Veri tiplerinin nasıl atandığını Type Sütunundan görebilirsiniz. Dikkat çekmesi amacıyla yeşil ile altları çizilmiştir.

Arrayws - Example_Code_V3_MultiDimensionArrays_Locals

    Tablodaki değerlerin okunup Array içerisine yazılması ile Locals penceresinde gördüğümüz yapı ortaya çıkar. Lürfen sizde F8 ile Sub-Routine’inizi çalıştırın ve Locals penceresinde gerçekleşen veri atama işlemini gözlemleyin. 

    For Next döngüsünü hatırlamak isteyenler altta yer alan tuş vasıtasıyla ilgili sayfayı ziyaret edebilir.

    # 5 – 5 numara ve alt başlıklarından oluşan bu ikinci For döngüsü ise Array’den verilerin okunup başka bir sayfaya yazdırılmasını sağlayan kod bloğudur. İşlem tamamiyle tam tersidir. İlk For döngüsünde tablonun verileri okunup Array’e yazdırılırken, bu ikini For döngüsünde veriler Array’den okunuyor ve hücrelere yazdırılıyor. Sonuç olarak Sheet2 sayfasının görünümü aşağıdaki şekli alıyor.

    # 6 – Bu kısımda ise Arabalar Array’ini siliyoruz ve Sub-Routine’den çıkıyoruz.

5 - Dinamik Arrays - Dynamic Arrays - ReDim Kullanımı

    Dersin bu noktasına kadar üzerinde çalıştığımız örnekler çok basit ve az değerden/değişkenden oluşan örneklerdi. Bu sebepten dolayı rahat bir şekilde boyutların alt ve süt sınırlarını elle girebildik. Peki Array içerisine kaydetmek istediğimiz veriler ya hergün değişiyorsa? Her gün ilgili sayfaları açıp da tekrar tekrar boyutların büyüklüklerini, Array’in barındırabileceği veri sayısını mı güncelleyeceğiz. Tabi ki HAYIR. Bu gibi durumlarda yani içeriğin dinamik olduğu durumlarda, biz de DYNAMIC ARRAYS kullanacağız. Bu sayede Array’in içeriğe göre kendisini ayarlamasını sağlayacağız. 

    En basit anlatımla dinamik array’ler, Array’ı oluşturan boyutların genişliklerini veri kaynaklarından kendileri okuyabilen Array’lerdir. Şimdi çok boyutlu bir Array’ı Dinamik Array’e dönüştürürken kullandığımız kodları inceleyelim. 

Arrays - Dynamic Arrays

    Çok basit bir teori üzerine kurulan Dynamic Arrays, tablo halindeki verilerin, satır ve sütunlarını oluşturan hücreleri sayarak, boyutların üst sınırları yerine yazabilen Array türü olarak tanımlanır. Şimdi yandaki örneğimizde Dynamic Arrays’in nasıl oluşturulduğunu görelim.

    Sadece çok boyutlu Arrays örneğine eklenen satırlar bu bölümde açıklanacaktır.

# 1 – Dynamic Array’i tanımlama aslında iki aşamalı bir işlemdir. İlk önce boyutu ve alacağı değer yazılmadan, içi boş bir Array tanımlıyoruz. 

# 2 – Değişkenleri tanımladıktan sonra ise bu değişkenlerin değerlerini atıyoruz. D1 değişkeni, “A3” hücresi ile başlayan ve veri sütununu oluşturan hücrelerin sayısıdır. D2 değişkeni ise “A3” hücresi ile başlayan ve veri satırının oluşturan hücrelerin sayısıdır. Konu ile ilgili olarak Hücre ve Alan Yönetimi dersini inceleyebilirsiniz.

    # 4 – Son olarak da Array’ı tekrardan tanımlıyoruz. Bunun için ReDim ifadesini kullanıyoruz.

    Artık tablomuza ait satır ve sütun sayılarını birer değişkene atadığımız için, rakamlar yerine boyutların üst sınırlarında bu değişkenleri kullanıyoruz.

    ReDim Arabalar(0 To D1, 0 To D2) 

    En başta tanımlamış olduğumuz bu Array’i tekrar tanımladığımız bu aşamda, Array’in veri tipini tekrar yazmıyoruz. Sadece parantez içindeki kısma boyutlar ile ilgili aralığı giriyoruz. Veri tipi ilk tanımlanan Array ile aynı olarak işlem görecektir.

    Bu noktadan sonra ise bütün kod bir önceki örnek ile ayndır. Tablomuz 9 sütun ve 11 satırdan oluştuğu için, otomatik olarak Array kendi içinde var olan değişkenleri saklayabildiği alanları(teorik) 9 x 11 = 99 olarak belirleyecektir. İlk boyut 11 değişkenden ikinic boyut ise 9 değişkenden oluşacaktır. Bu sayede tablodaki bütün veriler Array içerisinde depolanabilecektir. 

     Bu Sub_Routine’in çalıştırılması ile Array içerisinde yer alan veriler Sheet2’ye aktarılır. Aşağıdaki görsel bu işlemin sonucunda oluşan görünümdür.

Arrays - Dynamic Arrays

6 - Array Oluşturmanın En Kolay Yolu

    Bu dersin ilk 5 bölümünde Array’lerin nasıl oluşturulabileceği ile ilgili olarak gerekli bütün bilgileri detaylı bir şekilde işledik. Bu bölümde ise size Array’lere veri aktarımı bakımından, işlediğimiz bunca derse ne gerek vardı dedirtebilecek, basit bir yöntem göstereceğim. Ve bu yöntem, verilerin bulunduğu sayfanın seçilmesini, ki tamamen size kalmış, saymazsak sadece 2 satırdan oluşmaktadır. Şimdi kodu inceleyelim. 

Arrays - Defining Arrays

    

    # 1 – Boyutları belirtilmeden bir adet Array tanımlıyoruz.

    # 2 – Verilerin bulunduğu sayfanın seçilmesi. İsteğe bağlıdır ancak tavsiye edilir. (Bir alt satırdaki Range’den önce de kullanılabilir.)

    # 3 – Tanımlanmış olan Array içine seçilen alan içerisinde yer alan bütün değerler atanır. 

    # 4 – Tanımlanmış olan Array’ın silinmesi. 

    Evet bir array’ın tanımlanması asl itibariyle bu kadar kolay. Tabi bu Array’den veri eğer veri almak istersek yine For döngüsünü kullanmak zorundayız veya sadece indeks kullanarak yine verileri çekebiliriz. 

    Artık Array’ler ile ilgili olarak hem bütün programlama dilleri açısından hem de makrolar açısından güzel ve detaylı bilgilere ulaşabildiğinizi söyleyebiliriz. 

Dünya Çapında Araştırmacılara Ait Çalışmaları Okumak İsterseniz https://www.researchgate.net/profile/Ender_Dagdelen adresini Ziyaret Edebilirsiniz. Ana Sayfaya Dönmek İsterseniz De Aşağıdaki Tuşu Tıklayınız.

Herkese İyi Çalışmalar…

Soru ve Önerileriniz İçin;

[email protected]