Diziler (Arrays), Excel VBA dahil olmak üzere programlamada çok sık kullanılır.
Bir dizi aslında değerleri depolayacak birçok hücreye sahip tek bir değişkendir; tipik bir değişken ise yalnızca bir değeri depolayabilen yalnızca bir depolama hücresine sahiptir.
Bir diziye, içerdiği tüm değerlere başvurmak istiyorsanız bir bütün olarak erişilebilir veya tek tek öğelerine başvurabilirsiniz.
Bir diziyi aynı veri türünden bir dizi değerle çalışacak şekilde bildirebilirsiniz. Bunu zaten VBA-Lesson 6.2'de ele almıştık. Datatypes Ama şimdi daha da derine inelim...
500'e kadar değeri saklamanız gereken bir prosedür yazmaya çalıştığınızı düşünün. 500 ayrı değişken oluşturmak zorunda kalırsanız bu çok zor olacaktır. Dizinin ortasında bu değerleri saklamak ve onlarla çalışmak çok daha kolay olacaktır.
Dizileri kullanmanın ikinci nedeni hızlarıdır. Dizilerden veri okumak, Excel çalışma sayfasındaki tablolardan (hücrelerden oluşan) okumaktan çok daha az zaman alır.
İşte burada Excel'de VBA dizilerini kullanmanın bariz avantajını gösterecek bir örnek var.
İlk çalışma sayfası ("DS") bir veri kümesine sahiptir: 5000 satır x 3 sütun:
İkinci sayfada, yıla ve müşteriye göre tüm "Evet" yanıtlarını ("YES") dikkate alan bir özet tablo bulacaksınız:
Bu durumda prosedür, veri setini işlemek ve her yıl için "Evet" yanıtlarının sayısını ve her müşteri numarasını kaydetmek ve ardından bu verileri uygun hücrelere girmek için bir döngü kullanacaktır.
Diziler kullanılmadan bu prosedürün yürütülmesi Excel 131,44 saniye sürer:
Ancak önce verileri bir diziye ("DS" çalışma sayfasından) kaydetmek ve ardından aynı hesaplamaları ("DS" çalışma sayfası veri kümesi yerine dizileri kullanarak) gerçekleştirmek yalnızca 1,74 saniye sürecektir:
Dizide yalnızca "YES" yanıtlarını içeren verileri (ki bu, verinin yaklaşık 3/4'ü kadardır) depolayarak prosedürümüzü optimize etmeye karar verirsek, bu yalnızca 1,02 saniye sürer:
Bu, dizileri kullanmanın bir prosedürü 128 kat daha hızlı gerçekleştirmenize nasıl olanak tanıdığının iyi bir örneğidir. Aynı anda birçok veri seti ile çalışsaydık optimizasyonumuzun sonucu daha da iyi olurdu.
Örneğimizin detaylarına dersin sonunda döneceğiz.
Aşağıda VBA'da dizi bildirmeye ilişkin bazı örnekler verilmiştir (eğer ilk iki örnek size açık değilse, okuyun):
'Tek boyutlu bir dizi bildirme örneği Dim array1(4) 'İki boyutlu bir dizi bildirme örneği Dim array2(6, 1) 'Dinamik bir dizi bildirmeye bir örnek Dim array3()
Dizileri bildirirken sabit değerler giremiyorsanız (çünkü bunlar örneğin veri kümesinin boyutuna bağlıdır), parantezleri boş bırakın.
Bir veri türü (string, long, vb.) bildirmeniz gerekmez; ancak çoğu durumda bu, prosedürünüzün yürütülmesini yavaşlatacaktır.
Bazı verileri bir dizide saklamayı deneyelim:
Bu durumda 11x1 değerlerini saklamak istiyoruz, dolayısıyla tek boyutlu bir dizi oluşturmamız gerekiyor:
'beyan Dim array_example(10)
Dizideki öğelerin numaralandırılmasının 0 ile başladığını unutmayın (bu, programlamada standarttır, dolayısıyla bu alışkanlığa hemen başlamaya değer, ancak aslında bu yaklaşımı VBA'da değiştirebilirsiniz).
Dizideki her öğe artık değerini alacaktır:
'Değerleri bir diziye kaydetme array_example(0) = Range("A2") array_example(1) = Range("A3") array_example(2) = Range("A4") array_example(3) = Range("A5") array_example(4) = Range("A6") array_example(5) = Range("A7") array_example(6) = Range("A8") array_example(7) = Range("A9") array_example(8) = Range("A10") array_example(9) = Range("A11") array_example(10) = Range("A12")
Her dizi öğesini normal bir değişkenmiş gibi çalıştırabilir veya değiştirebilirsiniz.
Sırada array_example(8) kullandığımız bir örnek var:
Sub example() 'beyan Dim array_example(10) 'Değerleri bir diziye kaydetme array_example(0) = Range("A2") array_example(1) = Range("A3") array_example(2) = Range("A4") array_example(3) = Range("A5") array_example(4) = Range("A6") array_example(5) = Range("A7") array_example(6) = Range("A8") array_example(7) = Range("A9") array_example(8) = Range("A10") array_example(9) = Range("A11") array_example(10) = Range("A12") 'Test 1 MsgBox array_example(8) '=> şunu döndürür: 04/02/2016 'Değerlerden birini değiştirme array_example(8) = Year(array_example(8)) 'Test 2 MsgBox array_example(8) '=> şunu döndürür: 2016 End Sub
Diziyi daha hızlı kaydetmek için For döngüsü daha iyi bir seçenek olacaktır:
'beyan Dim array_example(10) 'Değerleri bir diziye kaydetme For i = 0 To 10 array_example(i) = Range("A" & i + 2) Next