Genel Bakış
Array (Array işlevi), virgülle ayırdığınız değerlerden bir Variant dizi oluşturan VBA işlevidir. Birkaç sabit değeri ayrı ayrı değişkenlere ya da hücrelere yazmadan tek bir listede toplamak, döngüyle dolaşmak veya bir kontrol listesi olarak kullanmak için idealdir. Dönen dizi varsayılan olarak 0 indeksinden başlar.
Bir Array elemanı da başka bir dizi olabilir. Bu yapı iç içe (jagged) dizi olarak bilinir ve iki indeksle okunur:
Range.Value özelliğine bir Array atarsanız değerler yatay olarak (tek satırda yan yana) yazılır. Dikey yazmak için Application.Transpose yöntemini kullanın.
Makro çalışınca B2 hücresine Ocak, B3 hücresine Şubat ve B7 hücresine Haziran yazılır. Dizinin ilk elemanı 0 indeksinde olduğu için döngü 0'dan başlar ve satır numarası i + 2 olarak hesaplanır.
Array işlevinin alt sınırı B2 hücresinde 1, üst sınırı B3 hücresinde 3 olarak görünür. Eleman sayısı 3 bulunur. VBA.Array ile oluşturulan dizinin alt sınırı ise B5 hücresinde 0 değerini alır; çünkü Option Base bu çağrıyı etkilemez.
Ankara satırında C2 hücresi Evet, Konya satırında C3 hücresi Hayır değerini alır. Listede olmayan şehirlerde Application.Match hata verdiği için IsError denetimi Hayır sonucunu yazdırır. Kampanya şehirlerini değiştirmek için yalnızca Array içindeki değerleri düzenlemeniz yeterlidir.
Söz dizimi
Array işlevinin genel biçimi ve en yaygın kullanımı aşağıdaki gibidir:
VBA
4 satır
Array(arglist)
Dim dizi As Variant
dizi = Array(deger1, deger2, deger3)
- arglist: Diziye konacak değerlerin virgülle ayrılmış listesidir; isteğe bağlıdır. Hiç değer vermezseniz uzunluğu sıfır olan boş bir dizi oluşur. Değerler farklı veri türlerinde (metin, sayı, tarih, Boolean) olabilir.
- Sonucun atanacağı değişken: Variant türünde tanımlanmalıdır. Sabit boyutlu bir diziye (Dim ile boyutu belirtilmiş) ya da String gibi türlü bir değişkene doğrudan atama yapılamaz ve tür uyuşmazlığı hatası oluşur.
Dönüş değeri ve alt sınır
Array işlevi, içinde tek boyutlu dizi taşıyan bir Variant döndürür. Dizinin alt sınırı modülün başındaki Option Base deyimine bağlıdır.- Varsayılan durum: Option Base kullanılmadıysa alt sınır 0'dır; 5 değer verirseniz indeksler 0'dan 4'e gider.
- Option Base 1: Modülün başına bu deyimi yazarsanız Array ile oluşturulan dizilerin alt sınırı 1 olur.
- VBA.Array: İşlevi VBA.Array biçiminde tür kitaplığı adıyla çağırırsanız Option Base etkisiz kalır ve alt sınır her zaman 0'dır.
- LBound ve UBound: Dizinin sınırlarını öğrenmek için LBound ve UBound işlevlerini kullanın; eleman sayısı üst sınırdan alt sınırın çıkarılıp 1 eklenmesiyle bulunur.
Kullanım biçimleri
Bir elemana dizi adı ve parantez içindeki indeksle ulaşırsınız. Dizide dolaşmak için For...Next döngüsünü LBound ve UBound ile birlikte ya da For Each döngüsünü kullanabilirsiniz. Dizinin elemanları sabit değildir; sonradan değiştirebilirsiniz ama eleman sayısını Array ile artıramazsınız.Bir Array elemanı da başka bir dizi olabilir. Bu yapı iç içe (jagged) dizi olarak bilinir ve iki indeksle okunur:
VBA
3 satır
Dim ic As Variant
ic = Array(Array(1, 2), Array(3, 4))
' ic(1)(0) ifadesi ikinci iç dizinin ilk elemanını verir
1. Ay adlarını dizi ile sayfaya yazma
A sütununda sıra numaraları ve C sütununda aylık satış tutarları hazırdır. Ay adlarını B sütununa yazacak makroyu Alt+F11 ile açtığınız bir standart modüle yapıştırın. Dizi 0 indeksinden başladığı için döngü LBound ve UBound değerlerine göre kurulmuştur.
VBA
14 satır
Option Explicit
Sub AylariYaz()
Dim aylar As Variant
Dim i As Long
' Ay adlarını Array işleviyle bir Variant değişkene yükle
aylar = Array("Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran")
' Alt ve üst sınırı kullanarak sonlu bir döngü kur
For i = LBound(aylar) To UBound(aylar)
ActiveSheet.Cells(i + 2, 2).Value = aylar(i)
Next i
End Sub
Array
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Sıra | Ay Adı | Satış Tutarı |
| 2 | 1 | Ocak | 12.500,00 |
| 3 | 2 | Şubat | 13.800,50 |
| 4 | 3 | Mart | 15.200,00 |
| 5 | 4 | Nisan | 14.150,00 |
| 6 | 5 | Mayıs | 16.900,00 |
| 7 | 6 | Haziran | 18.250,00 |
AylarExcelDepo v1.0.0
2. Option Base ve VBA.Array farkı
Bu örnekte modülün en üstünde Option Base 1 yazılıdır. Aynı değerlerle önce Array, sonra VBA.Array ile iki dizi oluşturulur ve sınırları B sütununa yazılır. Kodu yeni bir standart modüle yapıştırın; Option Base deyimi yalnızca bulunduğu modülü etkiler.
VBA
20 satır
Option Base 1
Option Explicit
Sub SinirlariYaz()
Dim sehirler As Variant
Dim sabit As Variant
' Option Base 1 nedeniyle alt sınır 1 olur
sehirler = Array("Ankara", "İstanbul", "İzmir")
' VBA.Array, Option Base ayarını yok sayar ve alt sınır 0 olur
sabit = VBA.Array("Ankara", "İstanbul", "İzmir")
With ActiveSheet
.Range("B2").Value = LBound(sehirler)
.Range("B3").Value = UBound(sehirler)
.Range("B4").Value = UBound(sehirler) - LBound(sehirler) + 1
.Range("B5").Value = LBound(sabit)
End With
End Sub
Array
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Ölçüt | Değer |
| 2 | Array alt sınır | 1 |
| 3 | Array üst sınır | 3 |
| 4 | Eleman sayısı | 3 |
| 5 | VBA.Array alt sınır | 0 |
Alt SınırExcelDepo v1.0.0
3. Kampanya şehirlerini dizide arama
A sütunundaki şehirlerin kampanya kapsamında olup olmadığı C sütununa yazılacaktır. Kapsama giren şehirler kodun içinde Array ile listelenir ve Application.Match yöntemiyle aranır. Kodu bir standart modüle yapıştırın.
VBA
19 satır
Option Base 0
Option Explicit
Sub KampanyaKontrol()
Dim kapsam As Variant
Dim satir As Long
' Kampanya kapsamındaki şehirler
kapsam = Array("Ankara", "İzmir", "Bursa", "Antalya")
For satir = 2 To 9
' Match bulamazsa hata döndürür; IsError ile yakalanır
If IsError(Application.Match(ActiveSheet.Cells(satir, 1).Value, kapsam, 0)) Then
ActiveSheet.Cells(satir, 3).Value = "Hayır"
Else
ActiveSheet.Cells(satir, 3).Value = "Evet"
End If
Next satir
End Sub
Array
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Satış Adedi | Kampanya Kapsamında |
| 2 | Ankara | 240 | Evet |
| 3 | Konya | 180 | Hayır |
| 4 | İzmir | 310 | Evet |
| 5 | Trabzon | 95 | Hayır |
| 6 | Bursa | 205 | Evet |
| 7 | Van | 60 | Hayır |
| 8 | Antalya | 275 | Evet |
| 9 | Samsun | 120 | Hayır |
KampanyaExcelDepo v1.0.0
Kullanırken dikkat edin
- Variant zorunluluğu: Array işlevinin sonucunu yalnızca Variant türünde bir değişkene atayabilirsiniz. Değişkeni Dim x(2) As String gibi sabit boyutlu ya da türlü tanımlarsanız atama sırasında hata alırsınız.
- İndeks 0'dan başlar: Dizinin ilk elemanı varsayılan olarak 0 indeksindedir. İndeks sınırlarını elle yazmak yerine LBound ve UBound kullanın; böylece Option Base değişse de kodunuz bozulmaz. Sınırın dışına çıkarsanız Subscript out of range (dizin sınırlar dışında) hatası oluşur.
- Option Base yalnızca modülü etkiler: Option Base 1 deyimi yalnızca yazıldığı modüldeki Array çağrılarını ve dizi tanımlarını etkiler. Aynı projedeki başka modüllerde alt sınır yine 0 olur. Bu karışıklığı önlemek için VBA.Array kullanabilirsiniz.
- Büyük listeler için uygun değildir: Array işlevi kod içinde elle yazdığınız kısa listeler için uygundur. Yüzlerce hücredeki değeri diziye almak için bir Range nesnesinin Value özelliğini bir Variant değişkene atamak daha pratiktir; bu durumda dizi iki boyutlu ve 1 tabanlı olur.
- Hücreye yazarken yön: Bir Range nesnesine Array atadığınızda değerler yatay yazılır. Dikey yazmak için Application.Transpose kullanın. Aralığın boyutu dizinin eleman sayısıyla uyuşmazsa fazla hücrelere #YOK (#N/A) hatası yazılabilir.
- İlgili konular:
- Split ve Join: Metni diziye bölen ve diziyi metne birleştiren işlevler.
- LBound ve UBound: Dizinin alt ve üst sınırını veren işlevler.
- Option Base: Dizilerin varsayılan alt sınırını belirleyen deyim.
- Dim ve ReDim: Dizi tanımlama ve yeniden boyutlandırma deyimleri.
- IsArray: Bir değişkenin dizi içerip içermediğini sınayan işlev.
- Filter: Bir metin dizisini ölçüte göre süzen VBA işlevi.
- Application.Match: Bir değeri dizi ya da aralıkta arayan yöntem; çalışma sayfasındaki KAÇINCI işleviyle aynı mantıktadır.
- Range.Value: Hücre değerlerini dizi olarak okuma ve yazma özelliği.