Страницы: 1
RSS
Каким способом проще определить попадает ли число в диапазон вида 1,4-6,9-15,25,26 на VBA
 
есть заданный диапазон 1,4-6,9-15,25,26 (диапазон задается вручную и всегда разный) я прохожусь по ячейкам и нужно определить попадает ли значение ячейки в указанный диапазон.
Хотел через регулярные выражения. регулярка я так понимаю должна выглядеть так "1[4-6][9-15]25,26", или я ошибаюсь?, не могу придумать простой способ (знаний не хватает) как привести к такому виду.
Изменено: V - 12.08.2016 09:16:24
 
V, я бы делал словарь. Сплитом разбил по зпт, если есть дефис, то сплитом по дефису, цикл от и до и заносим в словарь. Ну, а проверить есть ли значение в словаре не вопрос.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan спс за ответ пока как раз так пытаюсь делать только пока без словаря. :) ща подумаю над словарем.
 
А можно ведь и в массив загнать, а потом проверять наличие в массиве - это для тех кто не дружит со словарями (как я)  :D
А можно и так:
Код
Sub qqq()
Dim i As Long
    For i = 2 To 10
        Select Case Cells(i, 1)
            Case 1.4 To 6.9, 9 To 15, 25, 26: MsgBox "Ячейка А" & i & " в диапазоне"
        End Select
    Next
End Sub
 
Юрий М, думаю, что стоит подружиться со словарями. :)
Код
Function jjj_num_in(ByVal sWhere As String, ByVal lWhat As Long) As Boolean
    Dim arr1
    Dim i1 As Long
    Dim arr2
    Dim i2 As Long
    Dim dict As Object
    
    Set dict = CreateObject("scripting.dictionary")
    
    arr1 = Split(sWhere & ",", ",")
    For i1 = LBound(arr1, 1) To UBound(arr1, 1) - 1
        If InStr(1, arr1(i1), "-") > 0 Then
            arr2 = Split(arr1(i1), "-")
            For i2 = --arr2(LBound(arr2, 1)) To --arr2(UBound(arr2, 1))
                dict(i2) = i2
            Next i2
        Else
            i2 = --arr1(i1)
            dict(i2) = i2
        End If
    Next i1
    jjj_num_in = dict.exists(lWhat)
End Function
Изменено: JayBhagavan - 12.08.2016 11:23:06

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Уже 152 раза собирался ))
А с проверкой в массиве, думаю, код будет не больше )
 
Ещё пара вариантов с извращениями: массив сбросить на лист (именованный динамический диапазон), а затем или Find по диапазону или Application.WorhkseetFunction.CountIf (Диапазон)
 
Юрий М предложенный вами код не подойдет т.к., писал уже ранее, числа вписываются вручную и каждый раз разные.
Сделал на словаре, получилось так.
Код
'--- создаем словарь ---------
Set det = CreateObject("Scripting.Dictionary")
dt = Split(dt, ",")
For i = 0 To UBound(dt)
    det1 = Split(dt(i), "-")
    If UBound(det1) > 0 Then
       For ii = det1(0) To det1(UBound(det1))
         det.Item(ii) = ""
       Next
     Else
     det.Item(--det1(0)) = ""
     End If
Next
'------конец создания словаря-------------
'-------- удаляем строки и суммируем вес из этих строк ------
For i = ActiveCell.Offset(, -1).MergeArea.Count / 2 - 2 To 1 Step -1
  If det.Exists(ActiveCell.Offset(i).Value) Then
    mas = mas + ActiveCell.Offset(i, 9).Value
    Rows(ActiveCell.Offset(i).Row).Delete
  End If
Next
'---------конец удаления строк------------

Всем спасибо за подсказки.
Изменено: V - 12.08.2016 13:09:26
 
Цитата
V написал:
Юрий М предложенный вами код не подойдет
Тогда сейчас закачаю его обратно ))
 
М-да, посмотрел ещё раз на УДФку и понял, что словарь там ни к чему - сравнивать можно в самом цикле. При нахождении вернуть истина и Exit Sub.
ОФФ

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Наверх