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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2010, 11:48   #1
edikamn
Пользователь
 
Регистрация: 31.08.2010
Сообщений: 19
По умолчанию Поиск значения в массиве

Здравствуйте.
Вроде элементарный вопрос, но я его решить не могу. Поиск не дал мне результата.

Есть массив
nn(111,222,333,444)
есть искомое значение
ss=333
Что написать чтобы проводилась проверка значения ss в массиве nn, и ели находил значение, то выполнял определенные действия, а если не находил, выполнял другое действие.
edikamn вне форума Ответить с цитированием
Старый 20.10.2010, 12:13   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Мы же в теме Экселя?

Код:
Sub tt()
nn = Array(111, 222, 333, 444)
ss = 333
x = WorksheetFunction.Match(ss, nn, 0)
MsgBox x
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 20.10.2010, 13:04   #3
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Hugo121, ты не поверишь, но так быстрее:
Код:
Sub tt()
  nn = Array(111, 222, 333, 444)
  ss = 333
  For i = 1 To 4
     If d(i) = ss Then x = i: Exit For
  Next i
  MsgBox x
End Sub
Сравни:
Код:
Option Explicit             'Âñå ïåðåìåííûå äîëæíû áûòü îáúÿâëåíû
Sub aa()
    Dim a As Double, c As Double  'Ïåðåìåííûå äëÿ ðàáîòû ñ âðåìåíåì
    Dim d(64500) As String, i As Long, x, ss As String
    For i = 1 To 64000
        d(i) = Str(i)
    Next i
    ss = Str(63999)
    a = Timer   'Çàïîìèíàåì êâàíò âðåìåíè
    
    x = WorksheetFunction.Match(ss, d, 0)

    c = Timer - a
    MsgBox ("Âûïîëíåíî " & "çà " & Str(c) & "ñåêóíä")
End Sub

Sub aad()
    Dim a As Double, c As Double  'Ïåðåìåííûå äëÿ ðàáîòû ñ âðåìåíåì
    Dim d(64500) As String, i As Long, x, ss As String
    For i = 1 To 64000
        d(i) = Str(i)
    Next i
    ss = Str(63999)
    a = Timer   'Çàïîìèíàåì êâàíò âðåìåíè
    
    For i = 1 To 64000
        If d(i) = ss Then x = i: Exit For
    Next i

    c = Timer - a
    MsgBox ("Âûïîëíåíî " & "çà " & Str(c) & "ñåêóíä")
End Sub
А массивы больше 65535 ячеек WorksheetFunction.Match вообще не принимает
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 20.10.2010, 13:46   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Поверю и не удивлюсь.
К тому же у меня на XL2000 первый код вообще спотыкается на
x = WorksheetFunction.Match(ss, d, 0)

---------------------------
Microsoft Visual Basic
---------------------------
Run-time error '13':

Type mismatch
---------------------------
OK Help
---------------------------

4000 ещё тянет, 40000 уже нет...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 20.10.2010 в 13:50.
Hugo121 вне форума Ответить с цитированием
Старый 20.10.2010, 13:58   #5
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Получается, свой родной перебор быстрее WorksheetFunction.
Хотя, наверное, не всегда - зависит от задачи.
vikttur вне форума Ответить с цитированием
Старый 20.10.2010, 14:14   #6
edikamn
Пользователь
 
Регистрация: 31.08.2010
Сообщений: 19
По умолчанию

Всем большое человеческое спасибо!!!!!!!!!!!!!!!!!!!
edikamn вне форума Ответить с цитированием
Старый 20.10.2010, 15:37   #7
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Цитата:
Сообщение от vikttur Посмотреть сообщение
Получается, свой родной перебор быстрее WorksheetFunction.
Хотя, наверное, не всегда - зависит от задачи.
WorksheetFunction - универсальны, плата за универсальность - снижение скорости. Я пробовал WorksheetFunction.Match на Integer и String, вариант с циклом выиграл в обоих случаях.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 20.10.2010, 15:52   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вообще-то конечно надо сказать спасибо Skif-F за замечание. Я редко использовал поиск с помощью Match, даже сейчас и не вспомню, но на будущее надо запомнить. А то вдруг глюканёт, и не найдёшь сразу, в чём дело. Тем более, что версия офиса тоже имеет значание - скорее всего на 2003/2007 и 40000 обработает, а у кого-то вдруг на 2000-ом не пойдёт...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск текста в массиве с подстановкой значения из 2-го массива MaxxVer Microsoft Office Excel 5 05.07.2010 08:01
Поиск максимального значения элемента в массиве массивов целых на С++. jojola Общие вопросы C/C++ 2 24.03.2010 16:04
Количество повторов значения ячейки в массиве A2B Microsoft Office Excel 8 23.02.2010 13:25
Поиск заданого значения в массиве rembodogoliver Microsoft Office Excel 5 05.02.2010 23:07
Как отсортировать ключи и значения в многомерном массиве? akokin PHP 8 10.01.2010 12:32