Excel VBA Koleksiyonları

Koleksiyon, bir dizi benzer öğeyi içeren bir nesnedir. Koleksiyonda çok sayıda öğe olsa bile bunlara kolayca erişilebilir ve manipüle edilebilir.

Excel VBA ile zaten yerleşik koleksiyonlar var. Bir örnek, E-Tablolar koleksiyonudur. Çalışma kitabındaki her çalışma sayfası için Sheets koleksiyonunda bir öğe vardır.

Yerleşik koleksiyonlarda size sunulan çok daha fazla özellik ve yöntem vardır, ancak bunlar oluşturduğunuz kendi koleksiyonlarınızda mevcut değildir.

Örneğin, belirli bir çalışma sayfası hakkında bilgi almak için koleksiyonu kullanabilirsiniz. Örneğin, çalışma sayfasının adını ve görünür olup olmadığını görebilirsiniz. For Every döngüsü kullanarak, koleksiyondaki her çalışma sayfasında yineleme yapabilirsiniz.

1234567 Alt Test Çalışma Sayfaları()Dim Sh As Çalışma SayfasıSayfalardaki Her Sh İçinMsgBox Sh.NameMsgBox Sh.GörünürSonraki ShAlt Bitiş

Dizin değerini veya çalışma sayfasının gerçek adını kullanarak koleksiyondaki belirli bir çalışma sayfasını da adresleyebilirsiniz:

12 MsgBox Sayfaları(1).AdMsgBox Sayfaları("Sayfa1").Ad

Çalışma sayfaları eklendikçe veya silindikçe, E-Tablolar koleksiyonunun boyutu büyür veya küçülür.

VBA koleksiyonlarında dizin numarasının 0 ile değil 1 ile başladığını unutmayın.

Koleksiyonlara Karşı Diziler

Diziler ve koleksiyonlar, her ikisi de büyük miktarda verinin depolanmasına izin veren ve daha sonra kod kullanılarak kolayca başvurulabilen metodolojiler olmaları bakımından işlevlerinde benzerdir. Bununla birlikte, çalışma şekillerinde bir takım farklılıkları vardır:

  1. Diziler çok boyutluyken koleksiyonlar yalnızca tek boyutludur. Bir diziyi birkaç boyutla boyutlandırabilirsiniz;
1 Dim MyArray(10, 2) As String

Bu, neredeyse bir çalışma sayfası gibi, 2 sütunlu 10 satırlık bir dizi oluşturur. Bir koleksiyon etkili bir şekilde tek bir sütundur. Dizi, birbiriyle ilişkili bir dizi veri öğesini saklamanız gerekirse, örneğin; isim ve adres. Ad, dizinin ilk boyutunda, adres ise ikinci boyutta olacaktır.

  1. Dizinizi doldurduğunuzda, dizinin her bir öğesine bir değer koymak için ayrı bir kod satırına ihtiyacınız vardır. İki boyutlu bir diziniz olsaydı, aslında 2 satır koda ihtiyacınız olurdu - bir satır ilk sütunu adreslemek için ve bir satır ikinci sütunu adreslemek için. Collection nesnesiyle, yeni öğenin koleksiyona eklenmesi ve dizin değerinin otomatik olarak uygun şekilde ayarlanması için Add yöntemini kullanmanız yeterlidir.
  2. Bir veri öğesini silmeniz gerekiyorsa, dizide bu daha karmaşıktır. Bir öğenin değerlerini boş bir değere ayarlayabilirsiniz, ancak öğenin kendisi hala dizide bulunur. Diziyi yinelemek için bir Sonraki Döngüsü kullanıyorsanız, döngü boş bir değer döndürür ve bu boş değerin yok sayıldığından emin olmak için kodlamaya ihtiyaç duyar. Bir koleksiyonda Ekle veya Kaldır yöntemlerini kullanırsınız ve tüm indeksleme ve yeniden boyutlandırma işlemleri otomatik olarak halledilir. Kaldırılan öğe tamamen kaybolur. Diziler, sabit bir veri boyutu için kullanışlıdır, ancak koleksiyonlar, veri miktarının değişebileceği durumlar için daha iyidir.
  3. Koleksiyonlar Salt Okunur, dizi değerleri VBA kullanılarak değiştirilebilir. Bir koleksiyonla, önce değiştirilecek değeri kaldırmanız ve ardından yeni değiştirilen değeri eklemeniz gerekir.
  4. Bir dizide, diziyi boyutlandırdığınızda ayarlanan öğeler için yalnızca tek bir veri türü kullanabilirsiniz. Ancak dizide kendi tasarladığınız özel veri türlerini kullanabilirsiniz. Altında birkaç özel veri türü bulunan özel bir veri türü kullanarak çok karmaşık bir dizi yapısına sahip olabilirsiniz. Bir koleksiyonda, her öğe için kullanım verisi türleri ekleyebilirsiniz. Sayısal bir değere, bir tarihe veya bir dizeye sahip olabilirsiniz - toplama nesnesi herhangi bir veri türünü alacaktır. Sayısal olarak boyutlandırılmış bir diziye bir dize değeri koymaya çalışırsanız, bir hata mesajı verir.
  5. Koleksiyonların kullanımı genellikle dizilerden daha kolaydır. Kodlama terimleriyle, bir koleksiyon nesnesi oluşturduğunuzda, yalnızca iki yöntemi (Ekle ve Kaldır) ve iki özelliği (Sayma ve Öğe) vardır, bu nedenle nesnenin programlanması hiçbir şekilde karmaşık değildir.
  6. Koleksiyonlar, verileri bulmak için anahtarları kullanabilir. Diziler bu işleve sahip değildir ve belirli değerleri bulmak için diziyi yinelemek için döngü kodu gerektirir.
  7. Bir dizinin boyutu, ilk oluşturulduğunda tanımlanmalıdır. Ne kadar veri depolayacağına dair bir fikriniz olması gerekir. Dizinin boyutunu artırmanız gerekiyorsa, yeniden boyutlandırmak için 'ReDim'i kullanabilirsiniz, ancak dizide tutulan verileri kaybetmek istemiyorsanız 'Koru' anahtar sözcüğünü kullanmanız gerekir. Bir koleksiyon boyutunun tanımlanması gerekmez. Öğeler eklendikçe veya çıkarıldığında otomatik olarak büyür ve küçülür.

Bir Koleksiyon Nesnesinin Kapsamı

Kapsam açısından, koleksiyon nesnesi yalnızca çalışma kitabı açıkken kullanılabilir. Çalışma kitabı kaydedildiğinde kaydedilmez. Çalışma kitabı yeniden açılırsa, koleksiyonun VBA kodu kullanılarak yeniden oluşturulması gerekir.

Koleksiyonunuzun kod modülünüzdeki tüm kodlar tarafından kullanılabilir olmasını istiyorsanız, modül penceresinin üst kısmındaki Bildir bölümünde koleksiyon nesnesini bildirmeniz gerekir.

Bu, o modül içindeki tüm kodunuzun koleksiyona erişebilmesini sağlayacaktır. Çalışma kitabınızdaki herhangi bir modülün koleksiyona erişmesini istiyorsanız, onu global bir nesne olarak tanımlayın.

1 Yeni Koleksiyon Olarak Global MyCollection

Koleksiyon Oluşturma, Öğe Ekleme ve Öğelere Erişme

Aşağıdaki kod kullanılarak VBA'da basit bir koleksiyon nesnesi oluşturulabilir:

123456 Alt CreateCollection()Dim MyCollection Yeni Koleksiyon OlarakMyCollection."Öğe1" ekleMyCollection."Item2" ekleyinMyCollection."Item3" ekleyinAlt Bitiş

Kod, 'MyCollection' adlı yeni bir nesneyi boyutlandırır ve ardından aşağıdaki kod satırları 3 yeni değer eklemek için Add yöntemini kullanır.

Ardından, değerlere erişmek için koleksiyonunuzda yinelemek için kodu kullanabilirsiniz.

123 MyCollection'daki Her Öğe İçinMesaj Kutusu ÖğesiSıradaki eşya

For Next Loop kullanarak koleksiyonunuzu da yineleyebilirsiniz:

123 n = 1 için MyCollection.Count'aMsgBox MyCollection(n)sonraki n

Kod, Count özelliğini kullanarak koleksiyonun boyutunu alır ve ardından her öğeyi indekslemek için 1 değerinden başlayarak bunu kullanır.

For Her Döngü, Sonraki Döngüden daha hızlıdır, ancak yalnızca bir yönde çalışır (düşük indeksten yükseğe). For Next Döngüsü, farklı bir yön (yüksek indeksten düşüğe) kullanabilme avantajına sahiptir ve artışı değiştirmek için Step yöntemini de kullanabilirsiniz. Bu, birkaç öğeyi silmek istediğinizde kullanışlıdır, çünkü silme işlemi gerçekleştikçe dizin değişeceğinden, silme işlemini koleksiyonun sonundan başlangıca kadar çalıştırmanız gerekecektir.

Bir koleksiyondaki Add yönteminin 3 isteğe bağlı parametresi vardır - Anahtar, Önce ve Sonra

Yeni öğenizin halihazırda koleksiyonda bulunan diğer öğelere göre konumunu tanımlamak için "Önce" ve "Sonra" parametrelerini kullanabilirsiniz.

Bu, yeni öğenizin göreli olmasını istediğiniz dizin numarasını belirterek yapılır.

123456 Alt CreateCollection()Dim MyCollection Yeni Koleksiyon OlarakMyCollection."Öğe1" ekleMyCollection."Öğe2" ekle, , 1MyCollection."Item3" ekleyinAlt Bitiş

Bu örnekte, 'Öğe2', koleksiyondaki ilk dizine eklenmiş öğeden ('Öğe1' olan) önce eklenecek şekilde belirtilmiştir. Bu koleksiyonu tekrarladığınızda, her şeyden önce 'Öğe2', ardından 'Öğe1' ve 'Öğe3' görünecektir.

Bir "Önce" veya "Sonra" parametresi belirlediğinizde, dizin değeri koleksiyon içinde otomatik olarak ayarlanır, böylece "Öğe2" dizin değeri 1 olur ve "Öğe1", 2 dizin değerine taşınır

Koleksiyon öğesini tanımlamak için kullanabileceğiniz bir referans değeri eklemek için "Anahtar" parametresini de kullanabilirsiniz. Anahtar değerinin bir dize olması ve koleksiyon içinde benzersiz olması gerektiğini unutmayın.

1234567 Alt CreateCollection()Dim MyCollection Yeni Koleksiyon OlarakMyCollection."Öğe1" ekleMyCollection."Item2", "MyKey" ekleyinMyCollection."Item3" ekleyinMsgBox MyCollection("MyKey")Alt Bitiş

'Item2'ye, 'MyKey' 'Anahtar' değeri verilmiştir, böylece o öğeye dizin numarası (2) yerine 'MyKey' değerini kullanarak başvurabilirsiniz.

'Anahtar' değerinin bir dize değeri olması gerektiğini unutmayın. Başka bir veri türü olamaz. Koleksiyonun Salt Okunur olduğunu ve ayarlandıktan sonra anahtar değerini güncelleyemeyeceğinizi unutmayın. Ayrıca, koleksiyondaki belirli bir öğe için bir anahtar değerin olup olmadığını kontrol edemezsiniz veya biraz dezavantajlı olan anahtar değerini görüntüleyemezsiniz.

'Anahtar' parametresinin ek avantajı, kodunuzu daha okunabilir hale getirme avantajıdır, özellikle de desteklenecek bir iş arkadaşınıza teslim ediliyorsa ve bu değeri bulmak için tüm koleksiyonu yinelemeniz gerekmez. 10.000 öğelik bir koleksiyonunuz olsaydı, belirli bir öğeye atıfta bulunmanın ne kadar zor olacağını hayal edin!

Koleksiyondan Bir Öğeyi Kaldırma

Koleksiyonunuzdan öğeleri silmek için "Kaldır" yöntemini kullanabilirsiniz.

1 Koleksiyonum.Kaldır (2)

Ne yazık ki, koleksiyonda çok sayıda öğe varsa, silmek istediğiniz öğenin dizinini bulmak kolay değildir. Koleksiyon oluşturulurken 'Anahtar' parametresinin kullanışlı olduğu yer burasıdır.

1 MyCollection.Remove (“MyKey”)

Koleksiyondan bir öğe kaldırıldığında, dizin değerleri koleksiyon boyunca otomatik olarak sıfırlanır. Bu, aynı anda birkaç öğeyi silerken 'Anahtar' parametresinin çok yararlı olduğu yerdir. Örneğin, madde indeksi 105'i silebilirsiniz ve anında madde indeksi 106, indeks 105 olur ve bu maddenin üzerindeki her şeyin indeks değeri aşağı taşınır. Anahtar parametresini kullanırsanız, hangi dizin değerinin kaldırılması gerektiği konusunda endişelenmenize gerek yoktur.

Tüm koleksiyon öğelerini silmek ve yeni bir koleksiyon oluşturmak için yine boş bir koleksiyon oluşturan Dim ifadesini kullanırsınız.

1 Dim MyCollection Yeni Koleksiyon Olarak

Gerçek koleksiyon nesnesini tamamen kaldırmak için nesneyi hiçbir şeye ayarlayabilirsiniz.

1 MyCollection'ı Ayarla = Hiçbir Şey

Bu, koleksiyona artık kodunuz tarafından ihtiyaç duyulmuyorsa kullanışlıdır. Koleksiyon nesnesini hiçbir şeye ayarlamak, ona yapılan tüm referansları kaldırır ve kullandığı belleği serbest bırakır. Bellekte artık gerekmeyen büyük bir nesne oturuyorsa, bunun kodunuzun yürütme hızı üzerinde önemli etkileri olabilir.

Koleksiyondaki Öğe Sayısını Sayma

'Count' özelliğini kullanarak koleksiyonunuzdaki parça sayısını kolayca öğrenebilirsiniz.

1 MsgBox MyCollection.Count

Koleksiyonda yineleme yapmak için bir Sonraki Döngü İçin kullanıyorsanız, bu özelliği kullanırsınız çünkü bu size dizin numarası için üst sınır sağlar.

Belirli Bir Değer için Test Toplama

For Her Döngü kullanarak bir öğe için belirli bir değer aramak için bir koleksiyonda yineleme yapabilirsiniz.

123456789101112 Alt Arama Koleksiyonu()Yeni Koleksiyon Olarak Dim MyCollectionMyCollection."Öğe1" ekleMyCollection."Item2" ekleyinMyCollection."Item3" ekleyinMyCollection'daki Her Öğe İçinÖğe = "Öğe2" iseMsgBox Öğesi & " Bulundu"BitirSonrakiAlt Bitiş

Kod küçük bir koleksiyon oluşturur ve ardından 'item2' adlı bir öğeyi arayarak yinelenir. Bulunursa, belirli öğeyi bulduğuna dair bir mesaj kutusu görüntüler.

Bu metodolojinin dezavantajlarından biri, indeks değerine veya anahtar değere erişememenizdir.

Bunun yerine For Next Döngüsü kullanırsanız, yine de 'Anahtar' değerini alamasanız da, dizin değerini almak için Sonraki İçin sayacını kullanabilirsiniz.

123456789101112 Alt Arama Koleksiyonu()Dim MyCollection Yeni Koleksiyon OlarakMyCollection."Öğe1" ekleMyCollection."Item2" ekleyinMyCollection."Item3" ekleyinn = 1 için MyCollection.Count'aMyCollection.Item(n) = "Item2" iseMsgBox MyCollection.Item(n) & " dizin konumunda bulundu " & nBitirsonraki nAlt Bitiş

For Next sayacı (n) indeks pozisyonunu sağlayacaktır.

Koleksiyon Sıralama

Bir koleksiyonu sıralamak için yerleşik bir işlevsellik yoktur, ancak bazı 'kutunun dışında' düşünmeyi kullanarak, Excel'in çalışma sayfası sıralama işlevini kullanarak bir sıralama yapmak için kod yazılabilir. Bu kod, gerçek sıralamayı yapmak için "SortSheet" adlı boş bir çalışma sayfası kullanır.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 Alt Sıralama Koleksiyonu()Dim MyCollection Yeni Koleksiyon OlarakDim Sayacı Kadar Uzun'Rastgele sipariş öğeleriyle koleksiyon oluşturunMyCollection."Item5" ekleyinMyCollection."Item2" ekleyinMyCollection."Item4" ekleyinMyCollection."Öğe1" ekleMyCollection."Item3" ekleyin'Gelecekte kullanmak üzere koleksiyondaki öğelerin sayısını yakalayınSayaç = MyCollection.Count'SortSheet' (sütun A) üzerindeki her öğeyi ardışık bir hücreye kopyalayarak koleksiyon boyunca yineleyinn = 1 için MyCollection.Count'aSheets("SortSheet").Cells(n, 1) = MyCollection(n)sonraki n'Sıralama sayfasını etkinleştirin ve verileri artan düzende sıralamak için Excel sıralama yordamını kullanınSayfalar ("Sıralama Sayfası"). EtkinleştirRange("A1:A" & MyCollection.Count).SeçActiveWorkbook.Worksheets("SortSheet").Sort.SortFields.ClearActiveWorkbook.Worksheets("Sıralama Sayfası"). Sort.SortFields.Add2 Anahtarı:=Aralık( _"A1:A5"), SortOn:=xlSortOnValues, Order:=xlArtan, DataOption:= _xlSıralamaNormalActiveWorkbook.Worksheets("SortSheet") ile.Sırala.SetRange Aralığı("A1:A5").Başlık = xlGuess.MatchCase = Yanlış.Oryantasyon = xlTopToBottom.SortMethod = xlPinYin.Uygulamakİle bitmek'Koleksiyondaki tüm öğeleri silin - bu For Next Loop'un ters sırada çalıştığını unutmayınn için = MyCollection.Count To 1 Adım -1MyCollection.Remove (n)sonraki n'Döngü için depolanan değeri (Sayaç) kullanarak hücre değerlerini boş toplama nesnesine geri kopyalayın.n = 1 Sayaç içinMyCollection.Add Sheets("SortSheet").Cells(n, 1).Valuesonraki n'Öğelerin şu anda içinde bulunduğu sırayı kanıtlamak için koleksiyon boyunca yineleyinMyCollection'daki Her Öğe İçinMesaj Kutusu ÖğesiSıradaki eşya'Çalışma sayfasını (sıralama sayfası) temizleyin - gerekirse onu da silinSheets("SortSheet").Range(Cells(1, 1), Cells(Counter, 1)).ClearAlt Bitiş

Bu kod, önce rastgele bir sırayla eklenen öğelerle bir koleksiyon oluşturur. Daha sonra bunları bir çalışma sayfasındaki (SortSheet) ilk sütuna kopyalar.

Kod daha sonra sütundaki verileri artan düzende sıralamak için Excel sıralama işlevini kullanır. Kod, azalan düzende sıralamak için de değiştirilebilir.

Daha sonra, bir Sonraki Döngü İçin kullanılarak koleksiyondaki veriler boşaltılır. Adım seçeneğinin, koleksiyonun sonundan başlangıca kadar temizlenecek şekilde kullanıldığını unutmayın. Bunun nedeni, temizledikçe indeks değerlerinin sıfırlanmasıdır, baştan silinirse doğru şekilde temizlenmez (indeks 2, indeks 1 olur).

Son olarak, başka bir For Next Döngüsü kullanılarak, öğe değerleri boş koleksiyona geri aktarılır.

Her Bir Döngü İçin Daha Fazlası, koleksiyonun artık artan düzende olduğunu kanıtlıyor.

Ne yazık ki, bu, Anahtar değerleri okunamadığından, orijinal olarak girilmiş olabilecek herhangi bir Anahtar değeri ile ilgilenmez.

Bir Koleksiyonu Bir Alt / İşleve Geçirmek

Bir koleksiyon, bir alt öğeye veya bir işleve, diğer herhangi bir parametreyle aynı şekilde geçirilebilir.

1 İşlev MyFunction(ByRef MyCollection as Collection)

Koleksiyonu 'ByRef' kullanarak geçmek önemlidir. Bu, orijinal koleksiyonun kullanıldığı anlamına gelir. Koleksiyon "ByVal" kullanılarak geçirilirse, bu, koleksiyonun talihsiz yansımaları olabilecek bir kopyasını oluşturur.

'ByVal' kullanılarak bir kopya oluşturulursa, işlev içindeki koleksiyonu değiştiren herhangi bir şey orijinalde değil, yalnızca kopyada gerçekleşir. Örneğin, işlev içinde koleksiyona yeni bir öğe eklenirse, bu orijinal koleksiyonda görünmeyecek ve kodunuzda bir hata oluşturacaktır.

Bir Fonksiyondan Koleksiyon Döndürmek

Herhangi bir nesneyi döndürür gibi, bir işlevden bir koleksiyon döndürebilirsiniz. Set anahtar sözcüğünü kullanmalısınız

12345 Alt ReturnFromFunction()Dim MyCollection As CollectionMyCollection = PopulateCollection olarak ayarlayınMsgBox MyCollection.CountAlt Bitiş

Bu kod, 'MyCollection' adlı bir nesne oluşturan ve ardından bu koleksiyonu doldurmak için işlevi etkin bir şekilde çağırmak için 'Set' anahtar sözcüğünü kullanan bir alt rutin oluşturur. Bu yapıldıktan sonra 2 öğenin sayısını göstermek için bir mesaj kutusu görüntüler.

1234567 İşlev PopulateCollection() Koleksiyon OlarakDim MyCollection Yeni Koleksiyon OlarakMyCollection."Öğe1" ekleMyCollection."Item2" ekleyinPopulateCollection = MyCollection olarak ayarlayınBitiş İşlevi

PopulateCollection işlevi, yeni bir koleksiyon nesnesi oluşturur ve onu 2 öğeyle doldurur. Daha sonra bu nesneyi orijinal alt rutinde oluşturulan toplama nesnesine geri iletir.

Koleksiyonu Diziye Dönüştürme

Koleksiyonunuzu bir diziye dönüştürmek isteyebilirsiniz. Verileri değiştirilebileceği ve manipüle edilebileceği bir yerde saklamak isteyebilirsiniz. Bu kod küçük bir koleksiyon oluşturur ve ardından onu bir diziye aktarır.

Koleksiyon dizininin 1'de, dizi dizininin ise 0'da başladığına dikkat edin. Koleksiyonun 3 öğesi olmasına karşın, 0 öğesi olduğundan dizinin yalnızca 2 olarak boyutlandırılması gerekir.

1234567891011121314151617 Alt ConvertCollectionToArray()Dim MyCollection Yeni Koleksiyon OlarakDim MyArray(2) As StringMyCollection."Öğe1" ekleMyCollection."Item2" ekleyinMyCollection."Item3" ekleyinn = 1 için MyCollection.Count'aMyArray(n - 1) = MyCollection(n)sonraki nn = 0 ila 2 içinMsgBox MyArray(n)sonraki nAlt Bitiş

Diziyi Koleksiyona Dönüştürmek

Bir diziyi koleksiyona dönüştürmek isteyebilirsiniz. Örneğin, bir dizi elemanı elde etmek için kod kullanarak verilere daha hızlı ve daha zarif bir şekilde erişmek isteyebilirsiniz.

Koleksiyonun yalnızca bir boyutu olduğundan, bunun yalnızca dizinin tek bir boyutu için işe yarayacağını unutmayın.

123456789101112131415 Alt ConvertArrayIntoCollection()Dim MyCollection Yeni Koleksiyon OlarakDim MyArray(2) As StringMyArray(0) = "item1"MyArray(1) = "Öğe2"MyArray(2) = "Öğe3"n = 0 ila 2 içinMyCollection.MyArray(n) Eklesonraki nMyCollection'daki Her Öğe İçinMesaj Kutusu ÖğesiSıradaki eşyaAlt Bitiş

Çok boyutlu bir dizi kullanmak istediyseniz, dizi boyutları arasında bir sınırlayıcı karakter kullanarak dizi içindeki her satır için dizi değerlerini bir araya getirebilirsiniz, böylece koleksiyon değerini okurken sınırlayıcı karakteri programlı olarak kullanabilirsiniz. değerleri birbirinden ayırın.

Verileri, ilk boyut değerinin eklenmesi (dizin 1) ve ardından sonraki boyut değerinin eklenmesi (dizin 2) vb. temelinde de koleksiyona taşıyabilirsiniz.

Dizinin 4 boyutu olsaydı, koleksiyondaki her dört değerden biri yeni bir değer kümesi olurdu.

Ayrıca, belirli verileri bulmanın kolay bir yolunu ekleyecek olan (benzersiz olmaları koşuluyla) anahtar olarak kullanmak üzere dizi değerleri de ekleyebilirsiniz.

Arkadaşlarınızla sayfasını paylaşan sitenin gelişimine yardımcı olacak

wave wave wave wave wave