Този урок ще покаже как да търсите (Намерете) стойност в масив във 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Крайна функция |