Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2009, 17:21   #1
istoe
Пользователь
 
Регистрация: 12.07.2009
Сообщений: 17
По умолчанию Проверка на наличие в массиве

Уважаемы знатоки, какой самый быстрый способ проверить наличие элемента(например строки) в массиве данных (одномерном)

Заранее благодарен
istoe вне форума Ответить с цитированием
Старый 25.08.2009, 17:54   #2
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

Попробуйте что-нибудь в этом духе

Код:
Sub Макрос1()
Dim Arr() As String
    ReDim Arr(2)
    Arr(0) = "мама"
    Arr(1) = "мыла"
    Arr(2) = "раму"
    On Error Resume Next
    If Application.Match("мыла", Arr, 0) = 0 Then
        MsgBox "Слово 'мыла' НЕТ в массиве!", 48, ""
    Else
        MsgBox "Слово 'мыла' есть в массиве!", 64, ""
    End If
    Err.Clear
End Sub
Pavel55 вне форума Ответить с цитированием
Старый 25.08.2009, 17:55   #3
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте istoe.
возможно есть способ и быстрее, попробуйте оценить
Код:
Function inArray(sFind$) As Boolean
Dim s$
    s = Join(sArray(), "|")
    inArray = InStr(s, sFind, 2)
End Function
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 25.08.2009, 18:02   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Один из наиболее быстрых способов: (взято отсюда)
Код:
Sub test()
    массив = Array("строка 1", "строка 2", "строка 3", "строка 4", "строка 5", "строка 6")
    ИскомаяПодстрока = "строка 3"
    
    If IsNumeric(Application.Match(ИскомаяПодстрока, массив, 0)) Then
        MsgBox "Есть такая строка в массиве"
    Else
        MsgBox "Подстрока в массиве не найдена"
    End If
End Sub
Ну или так:
Код:
Sub test2()
    массив = Array("строка 1", "строка 2", "строка 3", "строка 4", "строка 5", "строка 6")
    ИскомаяПодстрока = "строка 3"
    
    If "%" & Join(массив, "%") & "%" Like "*%" & ИскомаяПодстрока & "%*" Then
        MsgBox "Есть такая строка в массиве"
    Else
        MsgBox "Подстрока в массиве не найдена"
    End If
End Sub
(добавлено)
Опоздал с ответами
EducatedFool вне форума Ответить с цитированием
Старый 25.08.2009, 18:18   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Teslenko_EA, на Вашу функцию VBA Excel ругается
К примеру, я не нашёл первого параметра в функции InStr
Странно, если этот код у Вас работает...

Вот в таком виде - работает:
Код:
Sub test()
    sArray = Array("строка 1", "строка 2", "строка 3", "строка 4", "строка 5", "строка 6")
    sFind = "строка 3"
    s = Join(sArray, "|")

    If InStr(1, s, sFind, vbTextCompare) Then
        MsgBox "Есть такая строка в массиве"
    Else
        MsgBox "Подстрока в массиве не найдена"
    End If
End Sub
Судя по цифре 2 в строке InStr(s, sFind, 2), этот код взят из Access-а...
А у Excel, судя по всему, немного другой синтаксис функций.

Последний раз редактировалось EducatedFool; 25.08.2009 в 18:20.
EducatedFool вне форума Ответить с цитированием
Старый 25.08.2009, 18:51   #6
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте EducatedFool.
да Вы правы только в MS Access допускается использование значения 2 для выполнения сравнения на основании сведений, содержащихся в базе данных и "...Указание аргумента start является обязательным, если указан аргумент compare..." тоже моя ошибка.
Teslenko_EA вне форума Ответить с цитированием
Старый 25.08.2009, 21:33   #7
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Ну или так (для полноты картины )
Код:
Option Base 0
Public Sub tst()
    Dim sArray()
    Dim sFind As String
    sArray = Array("строка 1", "строка 2", "строка 3", "строка 4", "строка 5", "строка 6")
    sFind = "строка 33"
    If UBound(Filter(sArray, sFind)) > -1 Then
        Debug.Print "строка присутствует"
    Else
        Debug.Print "строка отсутствует"
    End If
End Sub
Aent вне форума Ответить с цитированием
Старый 26.08.2009, 05:24   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Уважаемый Aent.
Предложенный Вами способ, конечно, рабочий. Но применять его нужно с большой осторожностью. Так, например, если имеется массив значений и строка для поиска в виде
Код:
sArray = Array("строка 1", "строка 2", "строка 33", "строка 4", "строка 5", "строка 6")
sFind = "строка 3"
То результат будет ошибочным. К сожалению, в функции Filter нет опции выбора частичного или однозначного совпадения.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 26.08.2009, 11:55   #9
istoe
Пользователь
 
Регистрация: 12.07.2009
Сообщений: 17
По умолчанию

Спасибо всем!

Кстати на моём тесте комбинация join-like работает быстрее match в 2 раза.
Но тут конечно надо быть уверенным, что в массиве нет символа разделителя join("%" примере EducatedFool).
istoe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на наличие файла Demetrius Помощь студентам 12 28.07.2009 00:27
Проверка матрицы на наличие одинаковых строк Victory1 Помощь студентам 1 20.06.2009 00:11
Проверка на наличие нескольких максимальныхэлементов xxSINxx Помощь студентам 3 11.03.2009 20:40
Проверка на наличие таблицы в БД Ramires БД в Delphi 3 18.12.2008 08:59
Определить наличие коммента softrix Microsoft Office Excel 2 28.04.2008 23:01