28.12.2017 tarihinde,VBA konularına Dosya Okuma/Yazma sayfası eklenmiştir.

20.12.2017 tarihinde,sitem mobil uyumlu hale gelmiştir.

02.12.2017 tarihinde,Excel Fonksiyon konularına "Dizi Formülleri ve SUMPRODUCT" sayfası eklenmiştir.

31.10.2017 tarihinde,VBA Dictionary sayfasına Dictionary, Collection ve Collection dizisinden oluşan ilginç bir örnek eklenmiştir.

26.10.2017 tarihinde,Excel Fonksiyon konularına "İsatistiki ve Matematiksel fonksiyonlar" sayfası eklenmiştir.

FasulyeNe Nerede Nasıl1

Diziler

Heralde kodlama yaptığım sürede u diziler(ve dizimsiler) kadar kafamı karıştıran birşey olmamıştır. Şimdi bunlara bi bakalım,. Örneklerde basitlik olması adına tek boyutlu dizilerden bahsedilecektir.

Ön bilgi:VBA/VB.Net küçük/büyük harf ayrımı gözetmez, o yüzden property ve metod isimlerinde harfin büyüklüğü önemli değildir. c# ve javascript ise case-sensitive'dir. C#'ta property ve metodlar büyük harfle başlarken, javascriptte küçük harfle başlar. Aşağıda da bu gösterime sadık kalınmıştır. Ör:C#'ta boyut özellilği Length ile elde edilirken javascriptte length ile elde edilir.

Genel Bilgiler

Syntax'a baktıgımızda aşağıdaki dillerden VB kökenli dillerde dizi parantezi normal parantez yani () iken, diğer dillerde köşeli parantez yani [] şeklinde ifade edilir. Ve yine VB kökenli dillerde bu parentez dizi değişkeninin yanına yazılırken, diğerlerinde veri tipinin yanına yazılır.

Base(taban)

VBA:Varsayılan değer 0'dır, ancak Option Base 1 yapılarak baz 1'den başlatılabilir. (ParamArray'ler hariç). Benim tavsiyem, varsayılan değeri bozmayın ve 0'dan başlatın ve bunu alışkanlık haline getirin, yoksa diğer dillerle çalışmaya başladığınızda karmaşa yaşayabilirsiniz. Baz index değeri VBA'de Lbound fonksiyonu ile bulunabilir ve bu metod çoğu durumda 0 döndürecektir.

VBA'de cells, worksheets gibi bazı collection üyelerinin indexi 1'den başlar ve bu değiştirilemez.

VB.Net:VBA 'de yazılı olanlar burda da geçerlidir. Ancak baz index değeri VBA'de Lbound fonksiyonu ile bulunurken VB:Net'te GetLowerBound bulunabilir.

C#:Varsayılan değer 0'dır. Optiona Base gibi bir seçenek yoktur, ancak wrapper class yazarak istenilen indexten başlatılabilir(bence gereksizdir)

Javascript:Varsayılan değer 0'dır.

Bu arada, tüm dillerde, baz değer istenirse 0'dan küçüğe de ayarlanabilir, bunun çok kullanım yeri olduğunu düşünmüyorum ancak teorik olarak imkan bulunmaktadır.

Boyut/Uzunluk/Eleman Sayısı ve Üst Değer(Son eleman indexi)

VBA:Dizi boyutu, dizi tanımlanırken parantez içinde verilen değer+1'dir, yani parantez içine yazılan değer boyut değil son indextir ve son index Ubound(dizi) ile boyut ise Ubound(dizi)+1 fonksiyonu ile elde edilir.  Dolu eleman sayısı ise loop'a sokularak bulunur.

VB.Net:Dizi boyutu, dizi tanımlanırken parantez içinde verilen değer+1'dir, yani parantez içine yazılan değer boyut değil son indextir ve son index GetUpperBound ile boyut ise Length özelliği veya GetLength(d) metodu ile elde edilir. GetLength ile belirli bir boyuttaki elemans sayısı alınırken Length ile tüm boyutlardaki eleman toplamı gelir. Dolu eleman sayısı ise loop'a sokularak bulunur.

Dizilerin bir boyutu olması gerektiğini biliyoruz, ancak VBA ve VB.Net'te ilk tanımlarken boyut vermek zorunda değiliz, boyutsuz tanımlayıp, daha sonra ReDim ifadesi ile de boyut verebiliriz. Aşağıdaki konu başlığında bunun detaylarını görebilirsiniz.

VBA/VB.Net(List(sadece VB.Net)/Collection/Dictionary):Dizimsi yapıların baştan belirlenmiş bir boyutu yoktur, belli bir andaki boyutu Count property'si ile bulunur. Boyutsuz tanımlandıkları için dolu eleman sayısı diye bir kavram yoktur. Son eleman indexi, Count-1 şeklinde bulunur.

C#:C#'ta dizi boyutu parantez içindeki rakamdır, dolayısıyla son index numarası da bundan 1 eksik olan rakamdır. Kullanılan özellik ve metodlar VB.Net ile aynıdır.

C#(List/Dictionary/Collection):VB.Net'teki gibi C#'ta da dizimsi elemanların eleman sayısı Count propertysi ile tespit edilir.

Javascript(Array):Boyut length ile alınır.

Initialization(Diziye ilk değer atama)

The default values of numeric array elements are set to zero, and reference elements are set to null.

VBA:VB'de dizi tanımlaması aşağıdaki şekillerde yapılabilir

Dim dizi1() as String	'eleman sayısı sonraya bırakılabilir. VBA'da veritipi belirtilmezse Variant olur, VB.Nette veritipi belirtilmelidir
Dim dizi2(5) as String 'son indexi 5 olan 6 elemanlı dizi
Dim dizi3(1 to 5) as String 'son indexi 5 olan 5 elemanlı dizi
Dim dizi4 = Array("Elma","Armut","Karpuz") 'Elemanlar baştan belirtilerek. Veri tipi belritilemdiği için Varianttır.

VB.Net:VB.Net'te de VBA ile aynı ifadeler geçerli iken ayrıca aşağıdaki gibi de initialization yapılabilir.

Dim nums() As Integer = {1, 2, 3}

C#:Dizi üyeleri, eğer deklarasyon anında belirtilmedilerse default değerleri atanır. Ayrıca boyut veya elemanlardan biri mutlaka belirtilmelidir

Aşağıda, MSDN sitesinden alınan örnek başlatım şekilleri bulunuyor.

// Tek boyutlu nümerik diziler
int[] n0 = new int[4];//sadece boyut belirtilip, değer olarak default değerler atanır, bu örnekte 0 atanır. gerektiğinde bunların dğeerleri program akışı içinde atanır
int[] n1 = new int[4] {2, 4, 6, 8};//boyut ve elemanlar birlikte belirtilebilir
int[] n2 = new int[] {2, 4, 6, 8};//sadece elemanlar new ifadesi ile belirtilebilir
int[] n3 = new[] {2,4,6,8}//Sistem kendisi anlar ne tipte olduğunu
int[] n4 = {2, 4, 6, 8};//sadece elemanlar new ifadesi olmadan belirtilebilir

// Tek boyultu string diziler
string[] s0 = new string[3];//defualt değer olarak null atanır, çünkü string bir referans tiptir
string[] s1 = new string[3] {"John", "Paul", "Mary"};
string[] s2 = new string[] {"John", "Paul", "Mary"};
string[] s3 = new[] {"John", "Paul", "Mary"};
string[] s4 = {"John", "Paul", "Mary"};

//boş ve null diziler
int[] bosArray = new int[0]; // Boş dizi
int[] nullArray; // Tüm dizilerin default değeri Null'dır, çünkü diziler referans tipli nesnelerdir. İçeriği belirtilmediği için bu dizinin de şuanki değeri null'dır.
//int[] nullArray; ifadesinin default değerinin null olması ile, int[] dizi=new int[4]; ifadesinin elemanları int olup elemanlar belirtilemdiği için bunları default değeri 0dır. yani ilkinde dizniin kendisi default değernine, ikncisinde ise elemanlar default değerlerine atanır. 

Bunlardan ilk 4ü aynı zamanda var ifadesi ile de yapılabilrdi, çünkü eşitliğin sağındaki bilgi diziyi başlatmak için yeterlidir, ancak 5. satır mutlaka belirtildiği gibi yazılmalıdır. Ör:

var s1 = new string[3] {"John", "Paul", "Mary"};

Javascript:Initialization kavramı yoktur. Var ifadesi ile diziyi yaratmak yeterlidir. Ayrıca javascript elemanları objedir, bu nedenle belirli bir veritipi belirtilmez, yani aynı dizi içinde hem string hem nümerik elemanlar bulunabilir.

var cars = ["Saab", "Volvo", "BMW"];
var cars = new Array("Saab", "Volvo", "BMW"); //ancak bunun kullanılması önerilmiyor, bi üstteki hem verimlilik açısından hemn okunurluk açısından daha iyidir

Veri ekleme

VBA:Normal dizilerde eleman ekleme, ilgili indeksteki elemana değer atama şeklinde gerçekleşir. Dizinin sonuna eleman ekleme, veya iki eleman arsına eleman yerleştirme diye birşey yoktur. Collectionlarda, listenin sonuna Add metodu ile ekleme yapılır. Dictionary'lerde de gerek Add metodu ile veya dizilerdeki gibi doğruda atama yöntemiyle eleman eklenebilir. Ne Colletionda ne Dictionary'de araya eleman ekleme diye birşey bulunmamaktadır.

VB.Net ve C#:VBA için söylenenler geçerli olup dizimsi yapıların her biri için farklı bir eleman eklem yöntemi vardır. Mesela List için Add, Queue için Enqueue, Stack için Push gibi.

Javascript:Push metodu ile yeni eleman eklenebileceği gibi index numarası verilerek de ilgili indexe eleman eklenebilir.

fruits.push("Lemon"); 
fruits[fruits.length] = "Lemon"; //bir üstteki ile aynı sonucu döndürür

Veri silme/çıkarma

Nihai Karşılaştırma

Dil Syntax Baz Boyut/Uzunluk Initialization
VBA/VB.Net Dim dizi(SonIndex) as String 0.
İstenirse 1 to n
İstenirse Option Base 1
Lbound ile bulunur
. .
C# String[Boyut] dizi 0 . .

YORUMLAR