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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 27.01.2009, 15:06   #1
cent
Пользователь
 
Аватар для cent
 
Регистрация: 26.12.2008
Сообщений: 73
По умолчанию Сравнение массива чисел с числом

Подскажите, можно ли сравнить все элементы массива с определенным значением посредством одной операции?
Пробую так:
Код:
Sub test()
Dim r&(), c&
    c = 5
    r = Array(1, 2, 3, 4, 5)
    If r = c Then MsgBox ("Есть совпадение!")
End Sub
Выдает ошибку "Type mismatch"
Как решить такую задачу не перебирая в сравнении все элементы массива?
Четко сформулированная задача - половина решения!
<= Спасибо оставляем в отзывах
cent вне форума
Старый 27.01.2009, 15:28   #2
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

массив надо циклом перебирать
Код:
dim i as integer, endI as integer
.....
endI=Ubound(r,1) 'Ubound(r,1) возвращает индекс последнего элемента
for i =LBound(r,1) to endI 'LBound(r,1) возвращает индекс первого элемента
if r(i) = c then msgbox("Есть совпадение")
next i
....
тебе надо сравнивать не массив а его элемент с нужным значением, таким образом когда i будет равен индексу элемента, значение которого такое же как и искомое значение, то ты увидишь сообщение.

Последний раз редактировалось tolikman; 27.01.2009 в 15:31.
tolikman вне форума
Старый 27.01.2009, 15:34   #3
cent
Пользователь
 
Аватар для cent
 
Регистрация: 26.12.2008
Сообщений: 73
По умолчанию

Спасибо, уважаемый tolikman. Перебирать в цикле я могу, вопрос собственно заключается в
Цитата:
сравнить все элементы массива с определенным значением посредством одной операции
...
не перебирая в сравнении все элементы массива
Четко сформулированная задача - половина решения!
<= Спасибо оставляем в отзывах
cent вне форума
Старый 27.01.2009, 15:39   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А что, нужно обязательно макросом?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума
Старый 27.01.2009, 15:49   #5
cent
Пользователь
 
Аватар для cent
 
Регистрация: 26.12.2008
Сообщений: 73
По умолчанию

Цитата:
А что, нужно обязательно макросом?
Да, это лишь часть кода.
А вопрос возник при оптимизации кода.
Просто массив большой и сравнений много.
Четко сформулированная задача - половина решения!
<= Спасибо оставляем в отзывах
cent вне форума
Старый 27.01.2009, 16:00   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub ОбнаружениеЭлементаВМассиве()
    a = Array(11, 12, 13, 14, 15) ' массив для поиска
    s = 11 ' элемент, который требуется найти
    
    If "~" & Join(a, "~") & "~" Like "*~" & s & "~*" Then
        MsgBox "Есть такой элемент в массиве", vbInformation, s
    Else
        MsgBox "Такой элемент в массиве не обнаружен", vbInformation, s
    End If
End Sub
EducatedFool вне форума
Старый 27.01.2009, 16:37   #7
cent
Пользователь
 
Аватар для cent
 
Регистрация: 26.12.2008
Сообщений: 73
По умолчанию

Спасибо, Игорь.
Вопрос по коду:
в выражении
Код:
"~" & Join(a, "~") & "~" Like "*~" & s & "~*"
я так понимаю, что "*" - это маска?

Кстати, как я понял оператор Join работает только с одномерными массивами.


P.S. жаль только, что для оптимизации кода этот вариант мне видимо не подходит
в тестовом поиске в массиве с 50'000 элементов цикл справился с задачей 0,31 сек, а модель
Код:
"~" & Join(a, "~") & "~" Like "*~" & s & "~*"
дала результат за 0,36сек

Все равно спасибо.
Четко сформулированная задача - половина решения!
<= Спасибо оставляем в отзывах
cent вне форума
Старый 27.01.2009, 16:49   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
я так понимаю, что "*" - это маска?
она самая.

Цитата:
в тестовом поиске в массиве с 50'000 элементов цикл справился с задачей 0,31 сек, а модель "~" & Join(a, "~") & "~" Like "*~" & s & "~*"
дала результат за 0,36сек
Так никто ведь не ставил задачу оптимизировать код...
Была задача затолкать поиск элемента в одну строку кода

Я думал, мой код покажет куда более худшее время...

Кстати, если у Вас 64-битная система, можно попробовать объявлять переменные с типом Single вместо Long...

Приведите весь код цикла поиска значения в массиве.
Может, найдём какой-нибудь способ увелечить быстродействие...

Последний раз редактировалось EducatedFool; 27.01.2009 в 16:56.
EducatedFool вне форума
Старый 27.01.2009, 16:52   #9
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от cent Посмотреть сообщение
…в тестовом поиске в массиве с 50'000 элементов цикл справился с задачей 0,31 сек, а модель
Код:
"~" & Join(a, "~") & "~" Like "*~" & s & "~*"
дала результат за 0,36сек

Все равно спасибо.
Скорее всего потому, что сам поиск в строке тоже происходит через цикл. А строка с 100,000 символов, это уже роман «Война и мир»
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума
Старый 27.01.2009, 17:01   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Скорее всего потому, что сам поиск в строке тоже происходит через цикл.
А как иначе-то?
По другому никак не обнаружить соответствие строки одному из элементов массива...

Так что неважно, самому организовывать цикл, или использовать функцию (свою или встроенную) - основой поиска всё равно будет цикл по всем элементам массива.

Другое дело, что при наличии встроенной функции можно было бы добиться незначительного уменьшения времени, но... в данном случае Microsoft о нас не позаботился...

Цитата:
как я понял оператор Join работает только с одномерными массивами
А у Вас какая размерность массива?
Сколько всего сравнений происходит?
EducatedFool вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выборка и сравнение из массива Dennikid Общие вопросы Delphi 15 03.10.2008 09:25
добавление массива чисел в базу kate158 БД в Delphi 3 24.09.2008 11:00
Перемещение из массива целых чисел... Си Sota Помощь студентам 1 01.06.2008 19:51
Сравнение чисел с плавающей точкой ? Ulex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 12.04.2008 21:14
Сортировка массива чисел Roberto Помощь студентам 1 02.04.2008 23:19