Страницы: 1 2 След.
RSS
Определить номер диапазона, минимальное и максимальное значение диапазона, к которому относится число, диапазоны вида: "0-0,4; 0-4-1,2;  1,2-5" (без кавычек)
 
Друзья, товарищи, коллеги и все, все, все!
Есть такая, как мне кажется нетривиальная задача.
Имеется текстовая строка в ячейке, например вида: "0-0,4; 0-4-1,2;  1,2-5" (без кавычек). Число интервалов может быть любое, пробелы могут стоять хаотично. Запятая - разрядность, тире (дефис) - разделитель минимума и максимума диапазона, точка с запятой - разделитель нескольких диапазонов.
Собственно, пользователь в одной ячейке пишет такой "набор, а в другой число, которое его интересует.
Что хочется научиться выводить:
- номер диапазоне, в котором находится число;
- минимальное/максимальное значения диапазона;
- сам диапазон (понятно, что это минимум-максимум, но может не надо каждый раз писать обе формулы через сцепить и тире.
Очень хочется обойтись без макросов, макрофункции возможны, но не очень также желательны.
Собственно, спасибо за помощь заранее.
 
Так?

только 0-0,4; 0-4-1,2;  1,2-5 наверно 0-0,4; 0,4-1,2;  1,2-5
и группа первое значение включая, второе -исключая
Изменено: БМВ - 06.06.2018 17:27:13
По вопросам из тем форума, личку не читаю.
 
и сразу же: становится очевидно, что задача не имеет однозначного решения для значения 1,2. оно в каком диапазоне? в 0,4-1,2 или 1,2-5???

и совет на будущее - придумываете всякие экзотические варианты разбиения интервала на диапазоны - придумывайте сразу и способ, каким Вы будете от туда черпать данные.
т.е. "будьте проще и к Вам потянутся люди, возможно женщины"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Kirill Gureev написал: Очень хочется обойтись без макросов...
... и файлов... Kirill Gureev, Вы сколько лет форум посещаете? Вместо Вас и примеры рисовать?!
 
Off
Цитата
Ігор Гончаренко написал:
"будьте проще и к Вам потянутся люди, возможно женщины"
Игорь, озадачил, сижу думаю, пол менять или пост удалять :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Так?
Практически так, но по какой-то причине, если прописать строку так "0-0,       4 ; 0,4-1,2;  1, 2-5;5-7,2" (много пробелов), то срывается отображение. Полагаю, что это по той причине, что СЖПРОБЕЛЫ оставляет 1 пробел после запятой, происходит ошибка чтения (наверное). Но со вторым числом так не происходит. попробуйте, пожалуйста.

И я в упор не могу понять что делает в формуле этот кусок и зачем он ?!
"СТРОКА(A1:A99)*99"? Что это?

Если ещё уточнить, то я не понял такого перехода:
от этого "ПОДСТАВИТЬ(";"& ПОДСТАВИТЬ(СЖПРОБЕЛЫ(A1);СИМВОЛ(160);"");";";ПОВТОР(" ";99))"
к этому "ПСТР(ПОДСТАВИТЬ(";"&ПОДСТАВИТЬ(СЖПРОБЕЛЫ(A1);СИМВОЛ(160);"");";";ПОВТОР(" ";99));СТРОКА(A1:A99)*99;99)".
Как определяется количество знаков? Как и почему это "СТРОКА(A1:A99)*99;99" определяет количество знаков.
Изменено: Kirill Gureev - 06.06.2018 21:07:02
 
да лучше все пробелы удалить на первом этапе, как обычный, так и неразрывный.

Так как все разделители заменены на 99 пробелов, то СТРОКА(A1:A99)*99 а перед поставлен разделитель, то это произведение выводит не на самое начало группы , но близкое к нему, так как набегает погрешность. Каждая группа разделена 99ю пробелами, значит взяв 99 знаков почти наверняка возьмем эту групп среди этих 99 знаков. Остальное дело техники по урезанию лишних пробелов. Можно чуть изменить  (СТРОКА(A1:A99)-1)*99+1;198

Можно усложнить формулу и сделать её универсальной, тогда вместо 99 нужно брать длинну строки и удвоенную длинну строки, но например Victur ставит например 500 и 999 и не парится. Типа что мне пробелов жалко.

Да и не учтено, что может не попадать ни в одну из групп. Типа если очень большое, то последняя группа.
Изменено: БМВ - 06.06.2018 22:10:22
По вопросам из тем форума, личку не читаю.
 
Вы меня извините, я всё равно ничего не понял! А понять очень хочется! Нельзя ли разжевать прямо для идиота! Или может где-то подробно описан этот приём? Спасибо.
 
выше заменил файл, добавил лист, может так понятнее будет
По вопросам из тем форума, личку не читаю.
 
Цитата
Очень хочется обойтись без макросов
Может с макросом понятнее будет. Макрос в модуль листа.
Текстовая строка в ячейке столбца А, число вводится в ячейку столбца В
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Columns(2)) Is Nothing Then
    Application.EnableEvents = False
    Dim mo As Object
    Dim j As Integer
    Dim iMin As Double
    Dim iMax As Double
     With CreateObject("VBScript.RegExp")
         .Global = True
         .IgnoreCase = True
         .Pattern = "[^;]+"
         Set mo = .Execute(Target.Offset(, -1))
         For j = 0 To mo.Count - 1
           iMin = Application.Trim(Split(mo(j), "-")(0))
           iMax = Application.Trim(Split(mo(j), "-")(1))
           If Target > iMin And Target < iMax Then
             Target.Offset(, 1) = j + 1
             Target.Offset(, 2) = iMin
             Target.Offset(, 3) = iMax
             Target.Offset(, 4) = mo(j)
             Exit For
           End If
         Next
           If Target.Offset(, 2) = "" Then Target.Offset(, 1) = "  Число не попало ни в одну из групп"
     End With
  End If
    Application.EnableEvents = True
End Sub
Изменено: Kuzmich - 06.06.2018 23:09:01
 
Цитата
БМВ написал:
может так понятнее будет
БМВ, я попытаюсь сформулировать вопрос, так, чтобы можно было понять, что я не понимаю) Уверен, что проблема моего непонимания именно в этом.
Функция ПРОСМОТР в качестве второго аргумента принимает вектор или массив. Видимо, как я понял, эта часть и преобразует мою (Вашу, любую строку) в вектор или массив.
Код
=--СЖПРОБЕЛЫ(ЛЕВСИМВ(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(";"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;" ";"");СИМВОЛ(160);"");";";ПОВТОР(" ";99));СТРОКА(A1:A99)*99;99));"-";ПОВТОР(" ";99));99))
Попытка подставить отдельно этот кусок приводит к выводу первого значения. Вот я и не могу понять, как из строки получился вектор значений, как его посмотреть, что представляет собой этот вектор, как происходит поиск второго значения?
Я, честно, даже не знаю как спросить ещё, чтобы пояснить моё непонимание.

Цитата
Kuzmich написал:
Может с макросом понятнее будет.
Видимо у меня уровень немного не тот ))
Я даже суть созданного регулярного выражения пока не понял. Как его трактовать?
Код
.Pattern = "[^;]+"
Подскажете?
Спасибо.

P.S. Информацию про регулярные выражения читал здесь.
Изменено: Kirill Gureev - 07.06.2018 09:15:07
 
Цитата
Kirill Gureev написал:
как из строки получился вектор значений, как его посмотреть, что представляет собой этот вектор, как происходит поиск второго значения?
Все эти вопросы на втором листе раскрыты формулами в отдельных ячейках. Row(a1:a99) это массив от 1 до 99 , при работе формулы идет подстановка значений и формируется 99 элементов массива уже с результатом выполнения основной формулы. Посмотреть его можно выделив корректный  участок формулы и нажав F9. а далее вступает в работу lookup или иные функции работы с массивами.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Посмотреть его можно выделив корректный  участок формулы и нажав F9
Простите, а обратно теперь как формулу показать?
 
Цитата
Kirill Gureev написал:
Простите, а обратно теперь как формулу показать?
Все, теперь это константы :-) . ESC.
По вопросам из тем форума, личку не читаю.
 
Цитата
Я даже суть созданного регулярного выражения пока не понял. Как его трактовать? Подскажете?
У вас есть текстовая строка типа 0-0,       4 ; 0,4-1,2;  1, 2-5;5-7,2
Разделитель точка с запятой. Шаблон .Pattern = "[^;]+" как раз берет все, кроме ;
Получается 4 подстроки:
0-0,       4
0,4-1,2
 1, 2-5
5-7,2
дальше цикл по этим подстрокам, выделение мин и мах значения, проверка - попадает ли
введенное число в соответствующий диапазон и вывод результатов в ячейки.
Удачи!
 
UDF
Код
Function GUREEV(rngs$, num#, Optional prop = 1)
'rngs - Строка или ссылка на ячейку с диапазонами. Должно быть не менее двух диапазонов. Обязательный
'num - Проверяемое значение. Обязательные
'prop - Возвращаемое свойство. Не обязательный. По умолчанию - 1
    '1 - Номер диапазона
    '2 - Минимум
    '3 - Максимум
    '4 - Диапазон
Dim arrRngs, I&
    arrRngs = Split(Replace(rngs, " ", ""), ";")
    ReDim arrR(0 To UBound(arrRngs), 0 To 1)
    For I = 0 To UBound(arrRngs)
        arrR(I, 0) = CDbl(Split(arrRngs(I), "-")(0))
        arrR(I, 1) = CDbl(Split(arrRngs(I), "-")(1))
    Next
    For I = 0 To UBound(arrR)
        If num >= arrR(I, 0) And num < arrR(I, 1) Then
            Select Case prop
                Case 1
                    GUREEV = I + 1
                Case 2
                    GUREEV = arrR(I, 0)
                Case 3
                    GUREEV = arrR(I, 1)
                Case 4
                    GUREEV = arrR(I, 0) & "-" & arrR(I, 1)
            End Select
            Exit For
        End If
    Next
    If IsEmpty(GUREEV) Then GUREEV = CVErr(xlErrNA)
End Function
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Kuzmich написал:
"[^;]+
Мой вопрос, собственно, и был: "Как это переводится?". Может быть Вы не сочтёте за труд и интерпретируете сие текстом?

Цитата
БМВ написал:
формируется 99 элементов
Здесь то я и повисаю. Остальное понятно. Не понятно как вдруг текстовая функция ПСТР создаёт массив. Попробуем убрать лишнее и получим:
Код
=ПСТР(ПОДСТАВИТЬ(A1;";";ПОВТОР(" ";99));СТРОКА(A1:A99)*99;99)
В данном примере в A1 находится ";1;2;3;4" (без кавычек). Вот строка с куче пробелов: "ПОДСТАВИТЬ(A1;";";ПОВТОР(" ";99))". Это, по сути, числа от 1 до 99  "СТРОКА(A1:A99)*99", умножаемые на 99, ну и длина выдёргивания: 99. Ок. Я понимаю, как это вытащит первое значение. Но у меня в голове не укладывается, как оно может превратиться в массив. Ведь чтобы проделать операцию много раз, нужен бы цикл. Но в Excel в формула (ну в этой) нет циклов. Вот как это? И самое главное, я ниде не могу найти намёка на подобный приём.
 
Цитата
Может быть Вы не сочтёте за труд и интерпретируете сие текстом?
Я в сообщении #15 ответил. Или недостаточно?
 
Цитата
Kirill Gureev написал:
И самое главное, я ниде не могу найти намёка на подобный приём.
это принцип работы с массивами. Каждое значение перебирается и подставляется в формулу/функцию, вот и получается цикл от и до.
По вопросам из тем форума, личку не читаю.
 
Цитата
Kirill Gureev написал: интерпретируете сие текстом
Согласие есть продукт при полном непротивлении сторон
 
пишете в А1:А4
0
0.4
1.2
5
чтобы определить в каком диапазоне находиться любое Число, которое больше 0 пишете =ПОИСКПОЗ(Число;A1:A4). это все
Изменено: Ігор Гончаренко - 07.06.2018 14:01:45
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, при всем моём уважении, Вы пытаетесь обидеть меня? Ну уж это я напишу без проблем.
Цитата
БМВ написал: это принцип работы с массивами
Я так понял, что мне надо просто запомнить это как приём)) БМВ, спасибо, что вытерпели  меня)) Я вырос сегодня, благодаря Вам.
Kuzmich, Ваша версия - новый уровень для меня. Я не работал ранее с регулярными выражениями. Сейчас попробую хоть немного поднатореть на эту тему. Пообщался с одним товарищем, он посоветовал этот ресурс для подготовки регулярных выражений. Надеюсь он будет полезен, в том числе и Sanja.
Также для меня новым был способ определения переменных вида "GUREEV(rngs$, num#, Optional prop = 1)". Здесь, и здесь можно почитать на эту тему,  
Очень всем спасибо за решение  моей проблемы.

Цитата
vikttur написал: Вместо Вас и примеры рисовать?!
Ну какой пример, ради текстовой строки, указанной в кавычках))) Ну не смешите) (не в обиду).
 
Конечно, не перетрудятся... Помогающие создают файл, вписывают Вашу строку, пишут там решение и проверяют его. И это хорошо еще, если то, что написано в сообщении, и реальные данные совпадают (а бывает и обратное).
Вы до сих пор не усвоили это?
 
Цитата
vikttur написал:
Вы до сих пор не усвоили это?
Ну я пошутил))
 
Цитата
Kirill Gureev написал: Ну не смешите) (не в обиду).
Видна Ваша шутка...
 
Kirill Gureev,
Цитата
vikttur написал:
хорошо еще, если то, что написано в сообщении, и реальные данные совпадают (а бывает и обратное).
Цитата
БМВ написал:
только 0-0,4; 0-4-1,2;  1,2-5 наверно 0-0,4; 0,4-1,2;  1,2-5
Уж не знаю помог бы пример или нет, но
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Уж не знаю помог бы пример или нет, но
Ну надо согласиться, из уважения стоило сделать.
vikttur, буду меняться в лучшую сторону)
 
БМВ, Sanja, Kuzmich, а можно ли ещё подсказать, как Ваши штуки научить работать в отрицательных диапазонах. Как я понимаю проблема кроется в том, что я использую для интервалов "-". Видимо мне полагается сменить его на иной знак, например ";".
 
Цитата
не работал ранее с регулярными выражениями
Литература

Фридл, Дж. Регулярные выражения. — СПб.: «Питер», 2001. — 352 с. — (Библиотека программиста). — ISBN 5-318-00056-8

Смит, Билл. Методы и алгоритмы вычислений на строках (regexp) = Computing Patterns in Strings. — М.: «Вильямс», 2006. — 496 с. — ISBN 0-201-39839-7

Форта, Бен. Освой самостоятельно регулярные выражения. 10 минут на урок = Sams Teach Yourself Regular Expressions in 10 Minutes. — М.: «Вильямс», 2005. — 184 с. — ISBN 5-8459-0713-6

Бен Форта Освой самостоятельно регулярные выражения (regexp). PHP, Perl, JavaScript, Java, C#(си шарп), Visual Basic, ASP.NET,JSP, MySQL, Unix, Linux = Sams Teach Yourself Regular Expressions in 10 Minutes. — М.: «Вильямс», 2004. — С. 192. — ISBN 0-672-32566-7

Ян Гойвертс, Стивен Левитан Регулярные выражения. Сборник рецептов. — СПб.: «Символ-Плюс», 2010. — 608 с. — ISBN 978-5-93286-181-3

Ян Гойвертс, Стивен Левитан Регулярные выражения. Сборник рецептов — СПб.: Символ-Плюс, 2010.352 с. ISBN 978-5-93286-181-3, ISBN 978-0-596-52068-7 (англ.)

 
Цитата
Kuzmich написал:
Литература
Ну видимо придётся)) Википедия не покатит))
Страницы: 1 2 След.
Читают тему
Наверх