Dizide VBA Arama (Bul) Değeri

Bu öğretici, VBA'da bir Dizide Değer Aramanın (Bulmanın) nasıl yapıldığını gösterecektir.

Dizinin tek boyutlu mu yoksa çok boyutlu mu olduğuna bağlı olarak bir dizide dizi aramanın birkaç yolu vardır.

Tek Boyutlu Dizide Arama

Tek boyutlu bir dizide bir değer aramak için Filtre İşlevini kullanabilirsiniz.

123 Dim z Varyant Olarak'orijinal diziyi filtrelez = Filtre(Dizi, Dize, Doğru, vbCompareBinary)

Filtre seçeneğinin Sözdizimi aşağıdaki gibidir

Filtre(Kaynak Dizi, Dize Olarak Eşleştir, [Boolean Olarak Dahil Et], [VbCompareMethod olarak Karşılaştır])

NS Kaynak Dizisi ve Dize olarak eşleştir sırasında gereklidir Boole olarak dahil et ve vbCompareMethod olarak karşılaştırın isteğe bağlıdır. Bunlar dahil değilse, NS ve vbCompareBinary sırasıyla.

Filtreyle eşleşen değerleri bulun

1234567891011121314 Alt FindBob()'Dizi OluşturDim strName() Varyant OlarakstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'filtre verilerini depolamak için bir değişken bildirinVaryant Olarak Dim strSubNames'orijinal diziyi filtrelestrSubNames = Filtre(strName, "Bob")'LBound değeriniz -1'den büyükse, değer bulunduEğer LBound(strSubNames ) > -1 ise MsgBox ("Bob'u buldum")Alt Bitiş

İkinci dizi, filtre tarafından bulunan değerleri tutacaktır. LBound ve UBound değerleriniz -1 değilse, dizi aradığınız değeri bulmayı başarmıştır.

Metnin orijinal dizide kaç kez göründüğünü de görebilirsiniz.

1234567891011121314 Alt Sayı Adları()'Dizi oluşturDim strName() Varyant OlarakstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'filtre verilerini depolamak için bir dizi bildirinVaryant Olarak Dim strSubNames'orijinal diziyi filtrelestrSubNames = Filtre(strName, "Bob")'UBound değerlerinden LBound'u çıkarırsanız ve 1 eklerseniz, metnin görüntülenme sayısını alırızMsgbox UBound(strSubNames) - LBound(strSubNames) + 1 & " ad bulundu."Alt Bitiş

Filtreyle eşleşmeyen değerleri bulun

NS [Boole olarak dahil et] seçeneği, dizinizde hangi değerlerin kaç tane olduğunu bulmanızı sağlar. YAPAMAZ filtrenizle eşleştirin

1234567891011121314 Sub CountExtraNames()'dizi oluşturDim strName() Varyant OlarakstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'filtre verilerini depolamak için bir dizi bildirinVaryant Olarak Dim strSubNames'orijinal diziyi filtrelestrSubNames = Filtre(strName, "Bob", False)'UBound değerlerinden LBound'u çıkarırsanız ve 1 eklerseniz, metnin görüntülenme sayısını alırızMsgbox UBound(strSubNames ) - LBound(strSubNames ) + 1 & " ad bulundu."Alt Bitiş

bu nedenle bu satırı değiştirdik:

1 strSubNames = Filtre(strName, "Bob")

bu satırla:

1 strSubNames = Filtre(strName, "Bob", False)

Kodda bu satırı kullanmak, “Bob” ile eşleşmeyen tüm isimleri döndürür.

Büyük/küçük harfe duyarlı filtreler

Filtrenin varsayılan olarak büyük/küçük harfe duyarlı olduğunu göreceksiniz. Bu, tüm VBA işlevleri için geçerlidir. Büyük/küçük harfe duyarlı olmayan bir metin aramak istiyorsanız, kodunuzu biraz değiştirmeniz gerekir.

1 z = Filtre(strName, "bob", vbTextCompare)

Ekleme vbTextCompare filtre hattınıza eklemek kodunuzun “bob” veya “Bob” bulmasını sağlayacaktır. Bu atlanırsa, varsayılan olarak VBA vbBinaryCompare bu sadece bir olan verileri arayacak BİRE BİR AYNI kibrit. Yukarıdaki örnekte dikkat edin, [Boole olarak dahil et] argüman bu yüzden True varsayılır.

Seçenek Metni Karşılaştır

Alternatif olarak, metni ekleyebilirsiniz Seçenek Metni Karşılaştır modülünüzün en üstüne - bu, söz konusu modülde yazdığınız tüm işlevleri duyarsız hale getirecektir.

Bir dizide Arama yapmak için Döngü Kullanma

Bir döngü kullanmak, Filtre işlevini kullanmaktan biraz daha karmaşıktır. Dizideki tüm değerler arasında döngü yapacak bir fonksiyon oluşturabiliriz.

1234567891011121314151617 Alt LoopThroughArray()'dizi oluşturDim strName() Varyant OlarakstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dize olarak strFind'i karartstrFind = "Bob"Dim kadar uzun'dizi boyunca döngüi = LBound(strName, 1) için UBound(strName, 1) içinInStr(strName(i), strFind) > 0 iseMsgBox "Bob bulundu!"Çıkış İçinBitirsonraki benAlt Bitiş

“Bob Smith” veya “Bob Williams” yerine “Bob” gibi metin dizisinin bir kısmını bulmak için If İfadesinde Instr Fonksiyonunu kullanmamız gerekiyordu. Bu, diziden döngü tarafından döndürülen diziye bakarak “Bob”un dizide olup olmadığını kontrol eder ve dizide olduğu gibi bir mesaj kutusu döndürür ve ardından Döngüden Çıkılır.

Çok Boyutlu Dizide Arama

Döngüyü ayrıca çok boyutlu bir dizide arama yapmak için kullanırız. Bir kez daha, dizideki tüm değerler arasında döngü yapmamızı sağlayan bir fonksiyon oluşturmamız gerekiyor, ancak bu sefer ayrıca dizinin her boyutunda döngü yapmamız gerekiyor.

123456789101112131415161718192021222324252627 İşlev DöngüsüThroughArray()Dim varArray() Varyant OlarakDim strFind As StringstrFind = "Doktor"'dizinin boyutunu bildirReDim varArray(1, 2)'diziyi başlatvarArray(0, 0) = "Mel Smith"varArray(0, 1) = "Fred Toka"varArray(0, 2) = "Jane Eyre"varArray(1, 0) = "Muhasebeci"varArray(1, 1) = "Sekreter"varArray(1, 2) = "Doktor"'döngü için değişkenler bildirDim i Kadar Uzun, j Kadar Uzun'ilk boyut için döngüi = LBound(varArray, 1) için UBound(varArray, 1) için'ikinci boyut için döngüj = LBound(varArray, 2) için UBound(varArray, 2) için'değeri bulursak, değere sahip olduğumuzu söylemek için msgbox'tan çıkın ve işlevden çıkıneğer varArray(i, j) = strFind O zamanMsgBox "Doktor bulundu!"Çıkış FonksiyonuBitirsonraki jsonraki benBitiş İşlevi
wave wave wave wave wave