VBA Търсене на (Намери) стойност в масив

Този урок ще покаже как да търсите (Намерете) стойност в масив във VBA

Има няколко начина, по които можете да търсите низ в масив - в зависимост от това дали масивът е едноизмерен или многоизмерен.

Търсене в едноизмерен масив

За да търсите стойност в едноизмерен масив, можете да използвате функцията за филтър.

123 Dim z като вариант'филтрирайте оригиналния масивz = Филтър (масив, низ, вярно, vbCompareBinary)

Синтаксисът на опцията Филтър е следният

Филтър (Изходен масив, Съвпадение като низ, [Включване като логическо], [Сравняване като vbCompareMethod])

The Източник Масив и Съпоставете като низ са необходими, докато Включете като булев и Сравнете като vbCompareMethod са по избор. Ако те не са включени, те са настроени на Вярно и vbCompareBinary съответно.

Намерете стойности, които съответстват на филтъра

1234567891011121314 Sub FindBob ()„Създаване на масивDim strName () Като вариантstrName () = Array ("Боб Смит", "Джон Дейвис", "Фред Джоунс", "Стив Дженкинс", "Боб Уилямс")'декларирайте вариант, в който да се съхраняват данните за филтъраЗатъмнете strSubNames като вариант'филтрирайте оригиналния масивstrSubNames = Филтър (strName, "Боб")'ако стойността на LBound е по -голяма от -1, тогава стойността е намеренаАко LBound (strSubNames)> -1 Тогава MsgBox ("Намерих Боб")End Sub

Вторият масив ще съдържа стойностите, открити от филтъра. Ако вашите LBound и UBound стойности не са -1, тогава масивът е успял да намери стойността, която търсите.

Можете също да видите колко пъти текстът се появява в оригиналния масив.

1234567891011121314 Sub CountNames ()'Създаване на масивDim strName () Като вариантstrName () = Array ("Боб Смит", "Джон Дейвис", "Фред Джоунс", "Стив Дженкинс", "Боб Уилямс")'декларирайте масив, в който да се съхраняват данните за филтъраЗатъмнете strSubNames като вариант'филтрирайте оригиналния масивstrSubNames = Филтър (strName, "Боб")„ако минус LBound от стойностите на UBound и добавите 1, ще получим колко пъти се появява текстътMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "намерени имена."End Sub

Намерете стойности, които НЕ съвпадат с филтъра

The [Включване като булев] опцията ви позволява да намерите колко стойности във вашия масив, които НЕДЕЙ съответства на вашия филтър

1234567891011121314 Sub CountExtraNames ()'създаване на масивDim strName () Като вариантstrName () = Array ("Боб Смит", "Джон Дейвис", "Фред Джоунс", "Стив Дженкинс", "Боб Уилямс")'декларирайте масив, в който да се съхраняват данните за филтъраЗатъмнете strSubNames като вариант'филтрирайте оригиналния масивstrSubNames = Филтър (strName, "Bob", False)„ако минус LBound от стойностите на UBound и добавите 1, ще получим колко пъти се появява текстътMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "намерени имена."End Sub

затова променихме този ред:

1 strSubNames = Филтър (strName, "Боб")

с този ред:

1 strSubNames = Филтър (strName, "Bob", False)

Използването на този ред в кода ще върне всички имена, които НЕ съвпадат с „Боб“.

Чувствителни към регистъра филтри

Ще откриете, че филтърът е чувствителен към регистър по подразбиране. Това важи за всички VBA функции. Ако искате да търсите текст, който не е чувствителен към главни букви, трябва леко да промените кода си.

1 z = Филтър (strName, "bob" ,, vbTextCompare)

Добавяне vbTextCompare към вашия филтър ред ще позволи на вашия код да намери „bob“ или „Bob“. Ако това е пропуснато, VBA по подразбиране използва vbBinaryCompare който ще търси само данни, които са ТОЧНО съвпада. Забележете в горния пример, ние сме пропуснали [Включване като булев] аргумент, така че се приема True.

Опция Сравняване на текст

Като алтернатива можете да добавите текст Опция Сравняване на текст до горната част на вашия модул - това ще направи всички функции, които пишете в този конкретен модулен регистър, нечувствителни.

Използване на цикъл за търсене през масив

Използването на цикъл е малко по -сложно от използването на функцията Filter. Можем да създадем функция, която ще премине през всички стойности в масива.

1234567891011121314151617 Sub LoopThroughArray ()'създаване на масивDim strName () Като вариантstrName () = Array ("Боб Смит", "Джон Дейвис", "Фред Джоунс", "Стив Дженкинс", "Боб Уилямс")Dim str Намерете като низstrFind = "Боб"Dim i As Long'цикъл през масиваЗа i = LBound (strName, 1) Към UBound (strName, 1)Ако InStr (strName (i), strFind)> 0 ТогаваMsgBox "Боб е намерен!"Излезте заКрай АкоСледва iEnd Sub

За да намерим част от текстовия низ, т.е. „Bob“ вместо „Bob Smith“ или „Bob Williams“, трябваше да използваме функцията Instr в оператора If. Това погледна в низа, върнат от цикъла от масива, за да види дали „Bob“ е в низа и както е в низа, той ще върне поле за съобщение и след това излез от цикъла.

Търсене в многоизмерен масив

Ние също използваме цикъла за търсене в многоизмерен масив. За пореден път трябва да създадем функция, която ни позволява да преминем през всички стойности в масива, но този път също трябва да преминем през всяко измерение на масива.

123456789101112131415161718192021222324252627 Функция LoopThroughArray ()Dim varArray () Като вариантDim strНамерете низаstrFind = "Доктор"'декларирайте размера на масиваReDim varArray (1, 2)'инициализирайте масиваvarArray (0, 0) = "Мел Смит"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Счетоводител"varArray (1, 1) = "Секретар"varArray (1, 2) = "Доктор"'деклариране на променливи за цикълаDim i As Long, j As Long'цикъл за първото измерениеЗа i = LBound (varArray, 1) Към UBound (varArray, 1)'цикъл за второто измерениеЗа j = LBound (varArray, 2) Към UBound (varArray, 2)'ако намерим стойността, тогава msgbox да каже, че имаме стойността и да излезем от функциятаАко varArray (i, j) = str Намерете тогаваMsgBox "Докторът е намерен!"Излезте от функциятаКрай АкоСледващ jСледва iКрайна функция
wave wave wave wave wave