powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Есть ли число в списке чисел (то же что IN(...), только в коде)
25 сообщений из 33, страница 1 из 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
25 сообщений из 33, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Есть ли число в списке чисел (то же что IN(...), только в коде)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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