Birden fazla sütunda veri depolamak için dizinin farklı bir boyutuna ihtiyacımız var. Örnek:
Verileri iki boyutlu bir diziye kaydetme:
'beyan Dim array_example(10, 2) '11 x 3 "tanımlı" dizi 'Verileri bir diziye kaydetme For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
İşte bu değerlerle çalışmanın bazı örnekleri:
MsgBox array_example(0, 0) '=> şunu döndürür: 03.11.2026 MsgBox array_example(0, 1) '=> şunu döndürür: 24 MsgBox array_example(9, 2) '=> şunu döndürür: NO MsgBox array_example(10, 2) '=> şunu döndürür: YES
Bir an için dizimizdeki verileri düzenli olarak güncellememiz gerektiğini ve bu nedenle bildirim anında sabit değerler atayamadığımızı düşünelim...
Veritabanımızın boş olmayan son hücresinin yani diğer bir deyişle son satırının satır numarasını bulmak için aşağıdaki formülü kullanacağız:
last_row = Range("A1").End(xlDown).Row
Excel bildirimdeki değişkenleri kabul etmez.
Bunun yerine dinamik bir dizi bildirin (boş parantez kullanarak), ardından Redim'i kullanarak boyutunu tanımlayın:
Dim array_example() ReDim array_example(last_row - 2, 2)
Aşağıdaki prosedürü kullanarak veri kümenizin (tablonuzun) tüm satırlarını dizimizde saklayabilirsiniz:
Dim array_example() ReDim array_example(last_row - 2, 2)
Önceki örnekte dizimizdeki son sayı last_row - 2 idi:
For i = 0 To last_row - 2
Dizimizdeki son sayıyı belirlemenin başka bir yolu da Ubound'yi kullanmak olabilir:
For i = 0 To UBound(array_example)
Bu işlev, seçilen boyut için dizideki en büyük sayıyı döndürür (ilk boyut varsayılandır).
İşte bunu daha açık hale getirecek bazı örnekler:
Sub example() Dim array_example(10, 2) MsgBox UBound(array_example) '=> şunu döndürür: 10 MsgBox UBound(array_example, 1) '=> şunu döndürür: 10 MsgBox UBound(array_example, 2) '=> şunu döndürür: 2 End Sub
Bir diziyi, bir döngü kullanmadan bile bir çalışma sayfasındaki bir hücre aralığındaki değerlerle doldurmak mümkündür:
'beyan Dim array_example(10, 2) '11 x 3 "tanımlı" dizi 'Verileri bir diziye kaydetme For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Önceki kod etkili bir şekilde şu şekilde değiştirilebilir:
'beyan Dim array_example() 'Verileri bir diziye kaydetme array_example = Range("A2:C12").Value
İkinci yöntem birinciye göre daha çekici görünse de çoğu durumda uygulamanın size birinciye göre daha fazla zaman kaybettirebileceğini unutmayın.
Dizinizdeki verileri bu şekilde saklarsanız ilk sayı 0 yerine 1 olacaktır, bu da karışıklığa neden olabilir...
Daha sonra kodu artırma sürecinde, dizide yalnızca belirli arama kriterlerini karşılayan verileri depolamaya karar verirseniz (veya tamamen farklı bir işlem gerçekleştirirseniz), farklı bir döngü işlevi kullanarak kodu tamamen yeniden yazmanız gerekecektir...
Ancak bu ikinci yöntem, büyük bir veri kümesinin tüm içeriğini kaydetmeniz gerekiyorsa oldukça kullanışlıdır çünkü döngüden daha hızlıdır (her 15.000 kayıt için yaklaşık 0,2 saniye tasarruf sağlar).
Ancak "sabit" içeriğe sahip bir dizi oluşturmanız gerekiyorsa.
Değerleri kasete kaydetmek bir çözüm olabilir:
Dim en(5) en(0) = "IF" en(1) = "VLOOKUP" en(2) = "SUM" en(3) = "COUNT" en(4) = "ISNUMBER" en(5) = "MID"
Neyse ki, bir dizi (Array) kullanarak bu kodu basitleştirebilirsiniz:
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
Burada Replace fonksiyonunun kullanımına ilişkin bir gösterim bulunmaktadır (bu, aşağıdaki örneği anlamanıza yardımcı olacaktır):
Sub replace_example() Dim var_translate As String 'Bu örnek için metin şeridi var_translate = "Hello World !" 'Metin şeridindeki "Dünya"yı "siz" ile değiştirin var_translate = Replace(var_translate, "World", "you") 'Değiştirildikten sonra bant MsgBox var_translate '=> "Merhaba!" değerini döndürür End Sub
Şimdi bir dizi değeri başka bir veri kümesiyle değiştirmek istiyorsak dizileri ve Array fonksiyonunu kullanmak son derece faydalı olacaktır:
Sub translate() 'Formüllerin İngilizceden Fransızcaya çevrilmesine ilişkin basitleştirilmiş bir örnek Dim var_translate As String 'Bu örnek için metin şeridi var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))" 'İki değer kümesi en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT") '"SI" yerine "IF", "RECHERVEV" yerine "DÜŞEYARA" vb. yazın. For i = 0 To UBound(en) var_translate = Replace(var_translate, en(i), fr(i)) Next 'Değiştirildikten sonra bant MsgBox var_translate '=> "çevirilecekFormula değerini döndürür: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))" End Sub
Split fonksiyonu karakter dizisini parçalara ayırmamızı ve ortaya çıkan değerleri bir diziye yazmamızı sağlar.
Şeridi diziye dönüştürmek için aşağıdakileri yapın:
variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"
VBA function Split işlevini kullanın ve ayırıcıyı belirtin:
en = Split(variable, "/")
"en" dizisi aşağıdaki değerleri döndürecektir:
MsgBox en(0) '=> şunu döndürür: IF MsgBox en(1) '=> şunu döndürür: DÜŞEYARA MsgBox en(2) '=> şunu döndürür: SUM MsgBox en(3) '=> şunu döndürür: COUNT MsgBox en(4) '=> şunu döndürür: ISNUMBER MsgBox en(5) '=> şunu döndürür: MID
Aşağıdaki 3 dizi de aynı değerleri döndürecektir:
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",") en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
Aşağıdaki örnek, dizedeki üçüncü değeri döndürür:
MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> şunu döndürür: SUM
Split'nin tersi, VBA function Join'dir.
Bu fonksiyon bir dizinin değerlerini bir dizgede toplar.
MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> şunu döndürür: 12345