powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Есть ли число в списке чисел (то же что IN(...), только в коде)
33 сообщений из 33, показаны все 2 страниц
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547786
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

В конструкторе Access есть удобная инструкция IN
Мне нужно то же самое, только в коде VBA
Например: есть число 7
Как узнать, есть ли это число в списке чисел "3,18,15,389,45"
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547789
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,

какой ваш вариант?
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547791
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей, в данном примере числа нет в указанном списке

Я пишу в коде следующим образом (но это неудобно).
Код: vbnet
1.
2.
3.
4.
5.
6.
Select Case число

    Case Is = "2,4,5,788,28"
    Case Else
    
End Select


Хотелось бы в одной строчке типа
Код: xml
1.
число = [2,4,5,788,28]
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547803
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевКак узнать, есть ли это число в списке чисел "3,18,15,389,45"
Код: vbnet
1.
",3,18,15,389,45," like "*," & число & ",*"


Проверка в Immediate
Код: vbnet
1.
2.
3.
4.
число=389: ?",3,18,15,389,45," like "*," & число & ",*"
True
число=499: ?",3,18,15,389,45," like "*," & число & ",*"
False
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547808
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев
Код: vbnet
1.
    Case Is = "2,4,5,788,28"



это все равно, что:
Код: vbnet
1.
    If myText = "2,4,5,788,28"


не пойму как вы "число" сравниваете со строкой "2,4,5,788,28". Вы должны получать Type mismatch ошибку выполнения

Может вы пытаетесь сделать что-то подобное?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function IsItemInAddedToList(strList As String, strItem) As Boolean
Dim strArr
Dim i As Long
    strArr = Split(strList, ",")
    For i = 0 To UBound(strArr)
        If strArr(i) = strItem Then
            IsItemInAddedToList = True
            Exit Function
        End If
    Next i
End Function


Вызов:
Код: plaintext
?IsItemInAddedToList("1,2,22,11,7,77,8", "111")

я не понял ваших сложностей.
вы зашили список значений в код "2,4,5,788,28"
т.е. он не меняется. Тогда, что значит ваше "это неудобно", если он неизменный и вы его уже перечислили.

Если массивы не нравятся, попробуйте коллекции:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub test()
Dim idsList As New Collection
    idsList.Add 1, "1"
    idsList.Add 11, "11"
    idsList.Add 111, "111"
    If idsList("11") = 111 Then
        Debug.Print "число 11 есть в списке"
    Else
        Debug.Print "числа 11 нет в списке"
    End If
End Sub
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547810
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с текстом сообщения "числа 11 нет в списке" я намутил, но суть понятна: обращаясь по интересуемому значению к коллекции можно понять есть ли такой элемент в коллекции или нет
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547815
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей, я случайно написал в кавычках список значений, испльзуя Select
Вариант с использованием Like отлично подходит. Как я сам не дагадался? :)

да, список чисел у меня статичный, меняется только число
Всем спасибо за помощь...
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547840
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, решил проверить, что быстрее сравнение like-ом
Код: vbnet
1.
",3,18,15,389,45," like "*," & число & ",*"

или при использование коллекции

Коллекция быстрее. Но все, конечно, определяется контекстом.

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TestComp()
Dim idsList As New Collection
Dim startTime, diffTime As Long
Dim i As Long
Dim result As String
Dim strList As String
Dim blnComp As Boolean
Dim counter As Long

counter = 9999

For i = 0 To counter
idsList.Add i, CStr(i)
Next i

startTime = GetTickCount
For i = 0 To counter
blnComp = idsList(CStr(i)) = i
Next i
diffTime = GetTickCount - startTime
Debug.Print "Использование коллекции. Считываний: " & counter + 1 & " раз. Время: " & diffTime

'=====================================
strList = ","
For i = 0 To counter
strList = strList & i & ","
Next i

startTime = GetTickCount
For i = 0 To counter
blnComp = strList Like "*," & CStr(i) & ",*"
Next i
diffTime = GetTickCount - startTime
Debug.Print "Использование Like. Считываний: " & counter + 1 & " раз. Время: " & diffTime

End Sub

Код: vbnet
1.
2.
Использование коллекции. Считываний: 10000 раз. Время: 31
Использование Like.      Считываний: 10000 раз. Время: 2808
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547844
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаевда, список чисел у меня статичный, меняется только числоНастаевХотелось бы в одной строчке типа
Код: vbnet
1.
число = [2,4,5,788,28]




Вы так, наверно, хотели?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub ttt()
Dim n As Long
    n = 788
    Select Case n
        Case 2, 4, 5, 788, 28
            MsgBox "да"
        Case Else
            MsgBox "нет"
    End Select
End Sub
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547851
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейНастаевда, список чисел у меня статичный, меняется только числоНастаевХотелось бы в одной строчке типа
Код: vbnet
1.
число = [2,4,5,788,28]




Вы так, наверно, хотели?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub ttt()
Dim n As Long
    n = 788
    Select Case n
        Case 2, 4, 5, 788, 28
            MsgBox "да"
        Case Else
            MsgBox "нет"
    End Select
End Sub



да, именно так я и сделал
Но я тут прочитал про коллецкию и понял, что мне нужна скорость ))) Хорошо, что есть форум
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547854
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергейкстати, решил проверить, что быстрее сравнение like-ом
Код: vbnet
1.
",3,18,15,389,45," like "*," & число & ",*"

или при использование коллекции

Коллекция быстрее. Но все, конечно, определяется контекстом.

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TestComp()
Dim idsList As New Collection
Dim startTime, diffTime As Long
Dim i As Long
Dim result As String
Dim strList As String
Dim blnComp As Boolean
Dim counter As Long

counter = 9999

For i = 0 To counter
idsList.Add i, CStr(i)
Next i

startTime = GetTickCount
For i = 0 To counter
blnComp = idsList(CStr(i)) = i
Next i
diffTime = GetTickCount - startTime
Debug.Print "Использование коллекции. Считываний: " & counter + 1 & " раз. Время: " & diffTime

'=====================================
strList = ","
For i = 0 To counter
strList = strList & i & ","
Next i

startTime = GetTickCount
For i = 0 To counter
blnComp = strList Like "*," & CStr(i) & ",*"
Next i
diffTime = GetTickCount - startTime
Debug.Print "Использование Like. Считываний: " & counter + 1 & " раз. Время: " & diffTime

End Sub

Код: vbnet
1.
2.
Использование коллекции. Считываний: 10000 раз. Время: 31
Использование Like.      Считываний: 10000 раз. Время: 2808



Спасибо за этот пример. Мне он как раз к стати. Я добавил в избранное. Сейчас буду применять
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547856
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевХорошо, что есть форум
хорошо, что есть интернет.

но вот я не пойму, как вы выделив в коде "case" и нажав F1, не увидели ответ на свой вопрос
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547859
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариация с отвязанным рекордсетом осталась нераскрыта.
:)
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547950
Filter,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
самый простой способ, через функцию Filter

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub test1()
    Dim V
    V = Array(1, 2, 3, 4, 5)

    Debug.Print UBound(Filter(V, 1))
    Debug.Print UBound(Filter(V, 6))
End Sub


Код: plaintext
1.
2.
test1
 0 
-1 

Только нужно учитывать, что она работает со строками, и ищет по подобию.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub test1()
    Dim V
    V = Array(11, 2, 3, 4, 5)

    Debug.Print UBound(Filter(V, 1))
    Debug.Print UBound(Filter(V, 6))
End Sub


Код: plaintext
1.
2.
test1
 0 
-1 
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547994
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ужо тредстартеру так втемяшилось, то, проще, функцию написать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Function InArr(x As Integer, xx As Variant) As Boolean
  
 Dim i As Variant
 
 For Each i In xx
   If i = x Then
     InArr = True
     Exit Function
   End If
 Next
 
 InArr = False

End Function


Sub test()

 Debug.Print InArr(3, Array(1, 2, 3, 4))
 Debug.Print InArr(33, Array(1, 2, 3, 4))

End Sub
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39547998
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Filter,самый простой способ, через функцию Filter...
Только нужно учитывать, что она работает со строками, и ищет по подобию.учесть это можно, например, так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function ArrayContainsElement(searchedArray As Variant, soughtElement As String, Optional delimiter As String = ",", Optional marker As String = "!") As Boolean
    Dim filteredArray As Variant
    Dim joinedElements As String
    'pre-filter the array for elements containing 1
    filteredArray = Filter(searchedArray, soughtElement, True)
    If UBound(filteredArray) > -1 Then
        'mark the beginning and end of each found element
        'marker and delimiter must be characters that
        'don't occur in any element of the array!
        joinedElements = marker & Join(filteredArray, marker & delimiter & marker) & marker
        If InStr(joinedElements, marker & soughtElement & marker) > 0 Then
            ArrayContainsElement = True
            Exit Function
        End If
    End If
End Function



сейчас заодно и посмотрим, что будет быстрее коллекции или использование Filter. Сейчас....
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548013
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю, чего я вцепился в это сравнение. Но скорость работы с коллекциями действительно удивила.
Тестовый стенд:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
Option Compare Database
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TestComp()
Dim idsList As New Collection
Dim startTime, diffTime As Long
Dim i As Long
Dim result As String
Dim strList As String
Dim blnComp As Boolean
Dim counter As Long
Dim testArr

    counter = 9999
    
    For i = 0 To counter
        idsList.Add i, CStr(i)
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = idsList(CStr(i)) = i
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование коллекции.                       Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
    '=====================================
    strList = ","
    For i = 0 To counter
        strList = strList & i & ","
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = strList Like "*," & CStr(i) & ",*"
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование Like.                            Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
    '=====================================
    
    ReDim testArr(counter + 1)
    For i = 0 To counter
        testArr(i) = i
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = ArrayContainsElement_v1(testArr, CStr(i))
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование функции ArrayContainsElement_v1. Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
    '=====================================
    
    ReDim testArr(counter + 1)
    For i = 0 To counter
        testArr(i) = i
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = ArrayContainsElement_v2(testArr, CStr(i))
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование функции ArrayContainsElement_v2. Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
    '=====================================
    
    ReDim testArr(counter + 1)
    For i = 0 To counter
        testArr(i) = i
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = InArr(i, testArr)
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование функции InArr.                   Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
End Sub


Function ArrayContainsElement_v1(searchedArray As Variant, soughtElement As String, Optional delimiter As String = ",", Optional marker As String = "!") As Boolean
    Dim filteredArray As Variant
    Dim joinedElements As String
    'pre-filter the array for elements containing 1
    filteredArray = Filter(searchedArray, soughtElement, True)
    If UBound(filteredArray) > -1 Then
        'mark the beginning and end of each found element
        'marker and delimiter must be characters that
        'don't occur in any element of the array!
        joinedElements = marker & Join(filteredArray, marker & delimiter & marker) & marker
        If InStr(joinedElements, marker & soughtElement & marker) > 0 Then
            ArrayContainsElement_v1 = True
            Exit Function
        End If
    End If
End Function

Function ArrayContainsElement_v2(searchedArray As Variant, soughtElement As String, Optional delimiter As String = ",", Optional marker As String = "!") As Boolean
    Dim filteredArray As Variant
    Dim filteredArray2 As Variant
    Dim joinedElements As String
    'pre-filter the array for elements containing 1
    filteredArray = Filter(searchedArray, soughtElement, True)
    If UBound(filteredArray) > -1 Then
        'mark the beginning and end of each found element
        'marker and delimiter must be characters that
        'don't occur in any element of the array!
        filteredArray2 = Split(marker & Join(filteredArray, marker & delimiter & marker) & marker, delimiter)
        If (UBound(Filter(filteredArray2, marker & soughtElement & marker, True)) <> -1) Then
            ArrayContainsElement_v2 = True
            Exit Function
        End If
    End If
End Function

Function InArr(x As Long, xx As Variant) As Boolean
  
 Dim i As Variant
 
 For Each i In xx
   If i = x Then
     InArr = True
     Exit Function
   End If
 Next
 
 InArr = False

End Function



Код: vbnet
1.
2.
3.
4.
5.
Использование коллекции.                       Считываний: 10000 раз. Время: 31
Использование Like.                            Считываний: 10000 раз. Время: 4399
Использование функции ArrayContainsElement_v1. Считываний: 10000 раз. Время: 92384
Использование функции ArrayContainsElement_v2. Считываний: 10000 раз. Время: 92976
Использование функции InArr.                   Считываний: 10000 раз. Время: 2637
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548015
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей немного слукавил, вынеся этап заполнения коллекции из замеров времени и не обрабатывая вариант отсутствия искомого.

Для чистоты эксперимента, было бы правильнее привести все варианты к "общему знаменателю".
Например, взять три исходных строки:
короткую vbnullstring (нет значений),
среднюю (десяток значений)
и длинную (сотню значений).

Описать все варианты функцией "под ключ" с аргументами - строкой и искомым.

И сравнить на разных исходных строках, с нахождением искомого в начале, середине, конце исходной строки и отсутствии в исходной строке искомого.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548024
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,
я в самом начале сделал оговорку:
Вакшуль СергейКоллекция быстрее. Но все, конечно, определяется контекстом.
насчет вот этого замечания:
PredeclaredСергей немного слукавил, вынеся этап заполнения коллекции из замеров времени
это не лукавство, а аспект того самого "контекста". Конечно, если на вход пришла строка, то о какой коллекции можно говорить. Тут уже придется работать со строкой.

Меня больше интересовала именно скорость обращения к элементу. Скорость считывания. Скорость считывания в цикле.
Вообще интерес скорее более академический, чем прикладной.
Собственно, о чем я думал. Понятно, что в основе наверно любого метода лежит перебор(если нет прямой ссылки на области памяти). Так или иначе, но перебор. Просто перебор, производимый функцией InArr от aleks222 был бы самым быстрым(т.к. перебор прекращается сразу, как только Enumerator доходит до нужного элемента, в то время как Filter лопатит массив полностью), если бы он производился не в медленном интерпретаторе VBA.
Вот собственно это и было сравнение возможностей внешних ресурсов применительно к заинтересовавшему меня аспекту.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548029
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вакшуль Сергей... Конечно, если на вход пришла строка, то о какой коллекции можно говорить. Тут уже придется работать со строкой...
А почему бы и нет? Раскидать части строки по элементам коллекции тоже вариант.
Я сейчас аккурат "развлекаюсь" над вариантами. :)
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548032
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PredeclaredРаскидать части строки по элементам коллекции используя для этого цикл в интерпретаторе? Это должно быть долго
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548037
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И потому ты вынес "тяжелую" часть за рамки замера скорости. :)

Я надеялся на выигрыш в скорости (перед массивом) в варианте,
когда искомое находится в конце исходной строки,
но "заливка" коллекции съела весь выигрыш в скорости поиска.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548039
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared, ну да, вынес. Ну, я же говорю, интересовало считывание :)
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548040
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclaredно "заливка" коллекции съела весь выигрыш в скорости поиска.
это смотря сколько раз считывать
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548043
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я рассматривал (в данном контексте вопроса) варианты функции "All in One", без внешних (от тела функции) описаний.

Для описания реализации других вариантов пока нет информации о необходимой частоте пользования данной функцией,
количестве исходных строк и т.д.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548144
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
Здравствуйте, Сергей! Что-то я тоже засомневался, насколько ваш тестовый стенд корректен. Добавил свою идею (по аналогии), и вот что получилось :)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Option Compare Database

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TestComp()
Dim idsList As New Collection
Dim startTime, diffTime As Long
Dim i As Long
Dim result As String
Dim blnComp As Boolean
Dim counter As Long
Dim testArr

    counter = 9999
    
    For i = 0 To counter
        idsList.Add i, CStr(i)
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = idsList(CStr(i)) = i
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование коллекции.                       Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
 '=====================================
    
    ReDim testArr(counter + 1)
    For i = 0 To counter
        testArr(i) = i
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = testArr(i) - i = 0
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование проверки разности на равенство нулю.                   Считываний: " & counter + 1 & " раз. Время: " & diffTime    '=====================================
 End Sub

TestComp
Использование коллекции.                       Считываний: 10000 раз. Время: 31
Использование проверки разности на равенство нулю.                   Считываний: 10000 раз. Время: 0
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548220
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport,
Добрый вечер :)

Код: vbnet
1.
2.
3.
4.
5.
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = testArr(i) - i = 0
    Next i
    diffTime = GetTickCount - startTime


не, это же просто считывание n-ого элемента массива. А поиск где? :)

вот здесь вот:
Код: vbnet
1.
2.
3.
4.
5.
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = InArr(i, testArr)
    Next i
    diffTime = GetTickCount - startTime


было 10000 операций поиска. 10000 раз выполнялась функция InArr. А внутри каждого вызова функции, в зависимости от положения элемента в массиве выполнялось от 1 до 10000 переборов.
Т.е. у вас на порядки меньше циклов. И самое главное, где поиск? Ведь как бы предполагается, что на вход идет нечто(строка, массив, коллекция) и нужно узнать, содержит ли это "нечно" нужный элемент.

Если вы смотрите вот сюда:
Код: vbnet
1.
2.
3.
    For i = 0 To counter
        blnComp = idsList(CStr(i)) = i
    Next i


и думаете, что это я так же как и вы просто обращаюсь к элементу коллекции по номеру, то это не так. Я тут обращаюсь не по номеру, а по ключу. Если бы я обращался по номеру, то это бы выглядело так: idsList(i). А у меня вот так: idsList(CStr(i))

Выше в обсуждении я писал:Вакшуль СергейЕсли массивы не нравятся, попробуйте коллекции:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub test()
Dim idsList As New Collection
    idsList.Add 1, "1"
    idsList.Add 11, "11"
    idsList.Add 111, "111"
    If idsList("11") = 111 Then
        Debug.Print "число 11 есть в списке"  'На текст сообщения не смотрите, это некорректное сообщение 
    Else
        Debug.Print "числа 11 нет в списке"   'На текст сообщения не смотрите, это некорректное сообщение 
    End If
End Sub



Обратите внимание, что ключ строковый. Имя ключа равно значению. Т.е. когда надо узнать, а есть ли в коллекции элемент, значение которого равно 11, то нужно просто обратится по имени ключа "11". С массивом так сделать нельзя. В этом весь фокус.
Тут смысл в том, что обращаясь таким образом к коллекции, вам не нужно лопатить в цикле по всем ее элементам, как в случае с функцией InArr. За вас это сделает Access. Он тоже будет лопатить (просто это от нас скрыто). Но он это делает быстрее, чем аналогичный код пользователя в стандартном модуле.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548223
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз повторюсь:Вакшуль СергейКоллекция быстрее. Но все, конечно, определяется контекстом.Например, если значения в списке значений на входе могут повторятся, то примененный подход с коллекциями, где значение элемента соответствует названию ключа, уже не применишь, т.к. имя ключа должно быть уникальным.
Да и наполнение коллекций, как совершенно справедливо заметил Андрей, требует времени. Если наполнение коллекции одно, а считываний много, то выигрыш есть. А если одно наполнение и одно считывание, то выигрыша не будет.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548279
Еще вариант для Акса с непосредственным использованием IN:
If EVal(Число & " IN (" & СписокЗначений & ")") Then

Для вашего примера EVal(7 & " IN (3,18,15,389,45)") вернет 0 (False), а для 18 вернет -1 (True)

На скорость не проверял...
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548286
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
Да, Сергей, конечно же , вы правы.
А по поводу своего сообщения лишь могу привести анекдот :)

Мужик просыпается каждый раз утром с чувством, что во сне он сделал какое-то архиважное открытие. Но не помнит всякий раз какое. И он решает как-нибудь зафиксировать мысль, приходящую во сне. Заводит будильник на три часа ночи и кладет рядом на тумбочку лист бумаги с ручкой, просит жену растолкать его, когда зазвонит будильник. Ночью его, как просил, будит жена, он быстренько записывает что-то на листке бумаги и отрубается снова до утра. Утром просыпается, вспоминает, что ночью записал важную мысль. Радостный берет листок бумаги с тумбочки и читает - "Яичницу надо солить!!!"
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548970
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,

Хоть в VBA нет IN, зато есть "SELECT CASE" (как Вы и показали), а ещё EVAL (но это не функция VBA, а именно функция VBA для Access).

Что-то вроде этого
Код: vbnet
1.
? EVal("7 IN (3,18,15,389,45)")



Чем не вариант?
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548981
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ),

Сорри, не увидел. Лень было до конца дочитать. :)
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39549079
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studierenНастаев,

Хоть в VBA нет IN, зато есть "SELECT CASE" (как Вы и показали), а ещё EVAL (но это не функция VBA, а именно функция VBA для Access).

Что-то вроде этого
Код: vbnet
1.
? EVal("7 IN (3,18,15,389,45)")



Чем не вариант?

Вариант что надо. Удобнее, чем Select case
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Есть ли число в списке чисел (то же что IN(...), только в коде)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]