Bu eğitimde VBA Array, çeşitli dizi türleri, variant array ve dizi yöntemleri programlama örnekleri yardımıyla açıklanacaktır:
Normal bir VBA değişkeni, tek bir verinin değerini saklayan bir yer tutucudur. 1'e 1 ilişkisi vardır, yani 1 değer için 1 değişken.
Şimdi aynı türde birden fazla değeri sakladığınızı düşünün. Birden fazla değişken oluşturmak yerine, tek bir değişken oluşturabilir ve aynı türdeki tüm değerleri saklayabilirsiniz. Bu değişkene ARRAY adı verilir.
Bu eğitimde, VBA dizisinin ne olduğunu, tek boyutlu ve iki boyutlu dizilerin yanı sıra Sabit ve Dinamik gibi farklı dizi türlerini öğreneceksiniz. Ayrıca VBA'da kullanılan çeşitli dizi yöntemlerini de anlayacağız.
VBA Dizisi
Diziler, aynı veri türünden birden fazla değeri saklayabilen özel bir değişken türüdür.
Örneğin, Elinizde 100 çalışanın adı varsa, string veri türünde 100 değişken oluşturmak yerine, string türünde bir dizi değişken oluşturabilir ve aynı dizi değişkene 100 değer atayabilirsiniz.
Tek Boyutlu Dizi
Tüm elemanları tek bir satırda veya tek bir sütunda bulunan dizilere Tek Boyutlu Dizi denir. Sınıftaki tüm öğrencilerin isimlerinin tek bir sütunda listelenmesi tek boyutlu diziye örnektir. Aşağıda gösterildiği gibi bildirilir.
Dim arrayname(lowerbound To UpperBound) As DataType
Bir diziyi bildirmenin birden fazla yolu vardır. Aşağıda birkaç örnek verilmiştir.
Örnek:
#1) Dim MyArrayExample(0 ila 3) As Integer
Tamsayı değerlerini kabul edecek 0,1,2,3 konumlu bir dizi oluşturur.
#2) Dim MyArray2(3) As String
Varsayılan değer 0 ile 3 arasındadır ve konumu 0,1,2,3 olan ve String değerlerini kabul edecek bir dizi oluşturur.
#3) Dim MyArray2(13 ila 15) As Double
13'ten başlayan bir dizi oluşturur, yani 13, 14 ve 15 ve Double değerleri kabul eder. Alt sınırı 13 olarak belirttik, bu nedenle dizi 0 yerine 13 konumundan değer ayırmaya başlayacaktır.
Basit bir kod oluşturalım ve dizi bildiriminin 3 yolunu da anlayalım.
Not: VB Kodu yazmak için Microsoft Excel'i açın (desteklenen sürümler Excel 2007, 2010, 2013, 2016, 2019'dur). Geliştirici Sekmesi -> Visual Basic (Alternatif olarak Alt+F11 kısayolunu kullanın). VB editöründe Insert -> Modül ve aşağıdaki kodu yapıştırın.
Farklı beyan türlerini gösteren aşağıdaki prosedürü göz önünde bulundurun.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String '0,1,2 indisli dizi oluşturur firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "Takvimdeki İlk Çeyrek " & " " & firstQuarter(0) & " " & firstQuarter(1) & " " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String '0,1,2 indisli dizi oluşturursecondQuarter(0) = "Nisan" secondQuarter(1) = "Mayıs" secondQuarter(2) = "Haziran" MsgBox "Takvimde İkinci Çeyrek " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String '13,14,15 indisli dizi oluşturur thirdQuarter(13) = "Temmuz" thirdQuarter(14) = "Ağustos" thirdQuarter(15) = "Eylül"MsgBox "Takvimde Üçüncü Çeyrek " & " " & thirdQuarter(13) & " " & thirdQuarter(14) & " " & thirdQuarter(15) End Sub
Kodu çalıştırmak için F5 tuşuna basın veya araç çubuğundaki çalıştır düğmesine basın.
Normal Değişken Vs Dizi Değişken
Artık tek boyutlu bir dizinin nasıl çalıştığını biliyoruz. Şimdi bir an için dizilerin programlama dillerinde neden bu kadar önemli olduğunu anlayalım.
Diyelim ki 5 çalışanın maaşını girmeniz gerekiyor. Bunu normal bir değişken kullanarak elde etmek için 5 değişken oluşturmanız gerekir.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Her öğrenci için değişken bildir Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Öğrenci notlarını hücreden oku Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" &5).Value Emp5 = shet.Range("A" & 6).Value ' Öğrenci işaretlerini yazdır Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Şimdi aynı kodu bir Array değişkeni kullanarak oluşturalım.
Option Explicit Public Sub ArrayVarible() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") Dim Employee(1 To 6) As String Dim i As Integer For i = 1 To 6 Employee(i) = shet.Range("A" & i).Value Debug.Print Employee(i) Next i End Sub
Burada, tüm çalışan adlarını saklayacak tek bir dizi değişkeni kullandık. 100 çalışan adı daha eklemeniz gerektiğini varsayalım, o zaman sadece dizi boyutunu değiştirmeniz ve yeni bir değişken oluşturmanız gerekmez.
Bu, koddaki satır sayısını azaltacak ve böylece kodu kolayca anlaşılabilir ve okunabilir hale getirecektir.
İki Boyutlu Dizi
2 boyutlu bir dizi 2 indekse sahiptir - ilk indeks satırları ve 2. indeks sütunu temsil eder. Birden fazla satır ve sütuna sahiptir ve genellikle tablo biçiminde gösterilir.
2 boyutlu bir dizinin bildirimi aşağıdaki gibidir:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Örneğin 2 öğrencinin 3 dersten aldığı notları saklayalım. 2 satır ve 3 sütun alan 2 boyutlu bir dizi oluşturacağız.
Diziyi satır 1'den satır 2'ye ve sütun 1'den sütun 3'e başlatacağız.
Sub Twodim() Dim totalMarks(1 To 2, 1 To 3) As Integer totalMarks(1, 1) = 23 totalMarks(2, 1) = 34 totalMarks(1, 2) = 33 totalMarks(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox "Satır 2 ve sütun 2'deki Toplam İşaretler " &totalMarks(2,2) Msgbox "Satır 1 ve sütun 3'teki Toplam İşaretler " &totalMarks(1,3) End Sub
Kodu çalıştırmak için F5 tuşuna basın veya araç çubuğundaki çalıştır düğmesine basın.
Satır 2 ve Sütun 2
Satır 1 ve Sütun 3
Sabit Diziler
Statik Diziler olarak da adlandırılan Sabit Dizilerin sabit bir alt sınırı ve üst sınırı vardır ve bu boyut çalışma zamanında değiştirilemez. Dizinin boyutu bildirim sırasında parantez içinde belirtilir. Yukarıdaki tüm örnekler, bildirim sırasında boyutunu belirttiğimiz için Sabit dizilerdir.
Sabit diziler genellikle dizinin boyutundan emin olduğunuzda kullanılır. Örneğin, Bir haftadaki gün sayısı için, alt sınırı 0 ve üst sınırı 6 olan bir dizi oluşturabilir ve boyutunu asla değiştirmeyeceğinizden emin olabilirsiniz.
Dinamik Diziler
Dinamik Diziler, çalışma sırasında diziyi yeniden boyutlandırmamıza olanak tanır. Bunlar, dizinin boyutundan emin olmadığınız durumlarda kullanışlıdır. Diyelim ki üniversiteye girişte, gerçekte kaç öğrencinin kabul edileceğinden emin olmayabilirsiniz, bu nedenle tasarım veya bildirim zamanında boyutu belirleyemezsiniz.
Bir Dinamik dizinin bildirimi, boş parantezli bir Statik diziye benzer.
Dim Employee() As String
REDIM
Boyutu değiştirmek istediğimizde kullanmamız gereken REDIM alt sınırın değiştirilemeyeceğini, yalnızca dizinin üst sınırını değiştirebileceğimizi not etmemiz gerekir.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ' Redim, çalışma zamanı sırasında dizi boyutunu değiştirmeye yardımcı olacaktır dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Şimdi, çalışma zamanı sırasında dizinin boyutunu değiştirebileceğimizi biliyoruz, bu nedenle bir dizinin ubound'unu artırmamız gerektiğinde ReDim deyimini kullanabiliriz. Dizi boyutunu bir kez daha artırmayı ve yeni bir öğrenci adı eklemeyi deneyelim.
Sub RedimExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim dynArray(3) ' Redim diziyi yeniden başlatacak ve eski değerleri yok edecektirdynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Sonucun daha önce eklenen öğrencilerin adlarını göstermediğini, null değer verdiğini gözlemlemişsinizdir. Bunun nedeni Redim deyiminin yeni boyutta yeni bir dizi oluşturması ve eski değerleri yok etmesidir.
ReDim Koruma Alanı
Represerve deyimi, eski değerleri koruyarak ve böylece dizinin boyutunu artırarak ReDim'in sınırlamasının üstesinden gelmemize yardımcı olur.
Yukarıdaki kodu ReDim Preserve kullanarak yeniden yazalım.
Sub preserveExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim preserve dynArray(3) ' Redim preserve eski değerleri koruyacaktırdynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Preserve anahtar kelimesini kullandığımız için, daha önce girilen değerler kaybolmaz ve yeni değer başarıyla eklenir.
Varyant Dizisi
Şimdiye kadar aynı tip değerleri kabul eden bir dizi gördük. Şimdi diziyi bir varyant olarak bildirelim ve String, Date, Long, Integer gibi çeşitli veri tiplerini tek bir dizide saklayalım.
Örnek:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Kişinin detayları " & arrayData(0) & " is " & " Telefon No " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
VBA Dizi Yöntemleri
VBA dizilerinde, aşağıda belirtildiği gibi farklı işlevleri gerçekleştirmemize yardımcı olacak birkaç yöntem vardır.
Sl. No | İsim | Sözdizimi | Açıklama |
---|---|---|---|
1 | Dizi | Array(arglist) | Normal bir değişkeni dönüştürür değişkenini bir Array'e dönüştürür. |
2 | Silme | Diziadını sil | Sabit boyutlu diziyi yeniden başlatmak için kullanılır ve Dinamik dizi için belleği serbest bırakır. |
3 | IsArray | IsArray (değişkenadı) | Bir değişkenin dizi olup olmadığını belirler. |
4 | Lbound | LBound( ArrayName, [Dimension] ) | En düşük alt simgeyi döndürür bir dizinin. |
5 | Ubound | UBound( ArrayName, [Dimension] ) | En yüksek alt simgeyi döndürür bir dizinin. |
6 | Bölünmüş | Split(expression, [ delimiter, [ limit, [ compare ]]) | Bir dizeyi birden çok alt dizeye böler ve sıfır tabanlı bir dizi döndürür. |
7 | Katılın | Join(sourcearray, [ delimiter ]) | Bir dizideki birden çok alt dizeyi birleştirir ve bir dize değeri döndürür. |
8 | Filtre | Filtre(sourcearray, match, [ include, [ compare ]]) | Filtre bir arama yapmamıza izin verecek bir diziden belirtilen eşleşme. |
Her birini bir örnekle ayrıntılı olarak tartışalım.
#1) Dizi
Normal bir değişken bildirelim ve bunu bir dizi olarak kullanalım. Normal bir değişkeni bir diziye dönüştürmek istediğinizde, bir ARRAY fonksiyonunu aşağıdaki örnekte gösterildiği gibi kullanabilirsiniz.
Dizi işlevleri virgülle ayrılmış değerler içeren bir bağımsız değişken kabul eder. Bu değerler dizinin bir öğesi olarak atanır.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Details of person " & varData(0) & " is " & " Phone No " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Bir dizi değişkenini bir indeks kullanarak tanımlamanız gerekir, bu nedenle yukarıdaki örnekte değerler varData(0) varData(2) varData(3) olarak alınır.
#2) Silme
Bu fonksiyon, sabit boyutlu bir dizi için girilen tüm değerleri siler ve dinamik bir dizi için bellek alanını boşaltır.
Sözdizimi: Diziadını sil
Silme, aşağıda verildiği gibi farklı veri türleri için farklı davranışlara sahiptir.
- Sabit bir sayısal değer için: Tüm değerler sıfıra sıfırlanır.
- Sabit bir dize veri türü için: Tüm değerler sıfır uzunluğa sıfırlanır.
- Dinamik bir dizi için: Dizi tarafından kullanılan belleği boşaltır.
Örnek:
Sub eraseExample() Dim NumArray(3) As Integer Dim decArray(2) As Double Dim strArray(2) As String NumArray(0) = 12345 decArray(1) = 34.5 strArray(1) = "Erase Function" Dim DynaArray() ReDim DynaArray(3) MsgBox " Silme işleminden önceki değerler " & (NumArray(0)) & "," & (decArray(1)) & " , " & (strArray(1)) NumArray'i Sil decArray'i Sil strArray'i Sil DynaArray'i Sil ' Belleği boşalt ' TümüMsgBox " Silme İşleminden Sonraki Değerler " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Silme işlevini kullanmadan önce sonuç
Silme işlemini kullandıktan sonraki sonuç
#3) IsArray
Bu fonksiyon verilen girdi değişkeninin bir dizi olup olmadığını belirlemek için kullanılır. Girilen değişken doğru ise true, yanlış ise false döndürür.
Sözdizimi : IsArray (variablename)
Örnek:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Is arr1 an Array : " & IsArray(arr1)) MsgBox ("Is arr2 an Array : " & IsArray(arr2)) End
İlk Msgbox'tan gelen sonuç
İkinci msgbox'tan gelen sonuç
#4) Lbound
Lbound işlevi için argüman olarak belirtilen dizinin en düşük alt simgesini döndürür.
Söz Dizimi: LBound( ArrayName, [Dimension] )
ArrayName dizinin adıdır.
Dimension isteğe bağlı bir tamsayı değeridir, dizinin birden fazla boyutu varsa, Lbound'u hangi boyuta göre belirlemek istediğinizi belirtebilirsiniz.
Örnek:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Dizi değişkenlerini deklare edin. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' 1 döndürür. Result2 = LBound(ArrayValue, 3) ' 10 döndürür. Result3 = LBound(Arraywithoutlbound) MsgBox "İlk dizideki en düşük alt simge " & Result1 & " 3. dizideki en düşük alt simge " & Result2 & " En düşüksubscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Ubound işlevinde bağımsız değişken olarak belirtilen dizinin üst alt simgesini döndürür.
Söz Dizimi: UBound( ArrayName, [Dimension] )
ArrayName dizinin adıdır.
Dimension isteğe bağlı tamsayı değeridir, dizinin birden fazla boyutu varsa, Ubound'u hangi boyuta göre belirlemek istediğinizi belirtebilirsiniz.
Örnek:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Dizi değişkenlerini deklare edin. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "İlk dizideki en düşük alt simge " & Result1 & " 3. dizideki en düşük alt simge " & Result2 & "Arraywithoutlbound " & Result3 End Sub
#6) Bölünme
Verilen tüm dizeden türetilen alt dizelerin sayısını içeren bir dizi döndürür.
Söz Dizimi: Split(expression, [ delimiter, [ limit, [ compare ]])
- İfade: Bu, alt dizeleri üretmek için kullanılacak dizenin tamamıdır.
- Sınırlayıcı: Belirtilen sınırlayıcı kullanılarak alt dizeler oluşturulur. Bu belirtilmezse, boşluk sınırlayıcı olarak kabul edilir.
- Limit: Döndürülecek alt dizelerin sayısı.
- Karşılaştırın: Alt dize üretildikten sonra, sonucu test etmek için farklı karşılaştırma seçenekleri kullanabilirsiniz.
Örnek: Aşağıdaki örnekte, sınırlayıcıyı - ve sınırı 3 olarak kullanıyoruz.
Bu nedenle, split işlevi tüm dizeyi sınırlayıcıya göre alt dizelere ayıracaktır. Ancak sınırı 3 olarak da belirttik, bu nedenle sınır 3'ten sonra alt dizeler oluşturulmayacaktır. Böylece son sınırlayıcı - atlanacaktır.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "Bu VBA-Split-Fonksiyonu için bir örnektir" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Katıl
Bu sadece bölmenin tersidir, Join birkaç alt dizeyi birleştirerek bir dize oluşturur.
Sözdizimi: Join(sourcearray, [ delimiter ])
Sourcearray: Birleştirmek istediğiniz dizelerin tek boyutlu dizisi.
Sınırlayıcı: Belirtilen sınırlayıcı, birleştirme sırasında her dizeden sonra eklenecektir.
Örnek:
Sub joinExample() Dim Result As String Dim dirarray(0 To 2) As String dirarray(0) = "D:" dirarray(1) = "SoftwareTestingHelp" dirarray(2) = "Arrays" Result = Join(dirarray, "\") MsgBox "Date after joining " & Result End Sub
Tüm 3 değer birleştirilir ve \ sınırlayıcı olarak bahsettiğimiz gibi her kelimenin arasına \ yerleştirilir.
#8) Filtre
Filtre, bir diziden belirtilen bir eşleşmeyi aramamıza izin verecektir. Filtre kriterlerine bağlı olarak, bir dize dizisinin alt kümesi döndürülecektir.
Sözdizimi: Filtre(sourcearray, match, [ include, [ compare ]])
Örnek:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Yazılım Testi", "Test yardımı", "Yazılım yardımı") filterString = Filter(Mystring, "yardım") MsgBox "Bulundu " & UBound(Mystring) - LBound(Mystring) + 1 & " kriterlere uyan kelimeler " End Sub
Bu örnek, filtre işlevini kullanarak tüm dizi dizelerinde "help" kelimesini arayacaktır.
Sıkça Sorulan Sorular
S #1) VBA'da bir dizinin uzunluğu nasıl elde edilir?
Cevap ver: Bir dizinin uzunluğunu elde etmek için Ubound fonksiyonunu kullanırız. Bu fonksiyon bize belirtilen bir dizinin üst alt simgesini verecektir.
S #2) VBA'da bir dizi nasıl bildirilir?
Cevap: Tek boyutlu dizi aşağıda gösterildiği gibi bildirilir.
Dim arrayname(lowerbound To UpperBound) As DataType
Örnek: Dim Myarray(0 ila 2) As Integer
İki boyutlu bir dizi aşağıda gösterildiği gibi bildirilir.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Örnek: Dim marks(1 ila 3, 0 ila 2) As Integer
S #3) Range'i Array'e nasıl dönüştürebilirim?
Cevap ver: Aralığı bir diziye dönüştürmek için Transpose işlevini kullanabiliriz. Bu kod Mys[10] oluşturacaktır
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
S #4) VBA'da dizi değişkeni nedir?
Cevap ver: Bir değişken dizi, dizini için her türlü veri türünü kabul eder, yani tek bir dizide farklı türde değerler saklayabilirsiniz.
Örnek:
Dim arrayData(3) As Variant
arrayData(0) = "Vikas Vipal"
arrayData(1) = 411234567890#
Çalışma zamanı sırasında diziyi yeniden boyutlandırmanın ve redim preserve kullanarak değerleri korumanın yolları örneklerle tartışıldı. Son olarak, çeşitli işlemleri gerçekleştirmemize yardımcı olacak Array yöntemlerini öğrendik.