TOP

VBA-Ders 13.2. Dizileri Kullanma (Arrays) (Devam)


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

Dinamik dizi

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)

Ubound

Ö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

Verileri çeşitli dizi öğelerine kaydetme

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).

Dizi (Array)

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

Metni diziye dönüştür (VBA Split)

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