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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2013, 18:04   #1
sjkz
Новичок
Джуниор
 
Регистрация: 20.08.2013
Сообщений: 6
По умолчанию Вывод нужного значения при сравнении данных двух ячеек

Доброго времени суток! Интересует, есть ли возможность макросом или надстройкой выдавать необходимое значение по сравнению данных двух ячеек?

Грубо говоря, в двух столбцах записаны числовые значения "от" и "до". Допустим, 15 и 18, 15 и 20, 21 и 25, 22 и 27 и т.п. В зависимости от диапазона нужно вывести данные, например, от 0 (1-е число) до 17 (2-е число) - проставляется категория (тип) - нулевой, от 0 до 17 (1 число) и от 18 до 20 (2 число) - нулевой/первый.

Грубо говоря, есть табличка, по которой вручную сейчас люди заполняют каждый файл (а таких много):

13-17 - нулевой
18-20 - первый
21-25 - второй
26-30 - третий
31-35 - четвертый
36 и более - пятый

Соответственно, если первое число 13, а второе число 21, то необходимо проставить категорию "нулевой/первый/второй", т.к. диапазон пересекается...

Привожу в пример файл, который обычно получается при ручной обработке задачи.

Заранее большое спасибо за помощь!
Вложения
Тип файла: zip type.zip (6.6 Кб, 16 просмотров)
sjkz вне форума Ответить с цитированием
Старый 21.08.2013, 09:09   #2
Basarga
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 11
По умолчанию

Нет ничего невозможного.

уточните, пожалуйста,
1. Возможно значение <13
2. Левое число всегда меньше правого?
3. Вам всё-таки макрос нужен или будете формулу множить?
Basarga вне форума Ответить с цитированием
Старый 21.08.2013, 09:26   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Ещё дополню вопросы -
куда отнести например 17,5? (там ведь есть 37,5...)
Ну и все аналогичные дроби на стыках групп.

Я бы не ставил вообще две границы - достаточно одной.

P.S. У Вас в примере ошибки - кое-где вручную прописано неправильно.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.08.2013 в 09:42.
Hugo121 вне форума Ответить с цитированием
Старый 21.08.2013, 09:48   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Навскидку такая UDF:

Код:
Function sjkz(r As Range, krit As Range) As String
Dim a(), i&, x&, y&
    a = krit.Value
    For i = 2 To UBound(a)
        If r(1) < a(i, 1) Then x = i - 1: Exit For
    Next
    For i = 2 To UBound(a)
        If r(2) < a(i, 1) Then y = i - 1: Exit For
    Next
    For i = x To y
        sjkz = sjkz & "/" & a(i, 2)
    Next
    sjkz = Mid(sjkz, 2)
End Function
На листе пишем-тянем
Код:
=sjkz(A2:B2,$F$1:$G$7)
В $F$1:$G$7 список такого вида:
Код:
13	нулевой
18	первый
21	второй
26	третий
31	четвертый
36	пятый
100000000
Но можно ещё подумать...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.08.2013 в 09:54.
Hugo121 вне форума Ответить с цитированием
Старый 21.08.2013, 11:05   #5
sjkz
Новичок
Джуниор
 
Регистрация: 20.08.2013
Сообщений: 6
По умолчанию

Большое спасибо за ответы!

Цитата:
уточните, пожалуйста,
1. Возможно значение <13
2. Левое число всегда меньше правого?
3. Вам всё-таки макрос нужен или будете формулу множить?
1. Возможно, но не менее 10 точно.. и им всем тоже проставляется "нулевой"
2. Да, всегда.. это диапазон но, в принципе, может затереться как ошибка и такая вещь... Все же человек в этом плане не очень надежен
3. Можно и формулой, а лучше функцией, как указал уважаемый Hugo121

Hugo121, почему-то не заработала функция.. результат сбрасываю в файле... может, что-то не так сделал? Но, кстати, идея с созданием списка в самом файле очень хорошая, спасибо!

Цитата:
Ещё дополню вопросы -
куда отнести например 17,5? (там ведь есть 37,5...)
Ну и все аналогичные дроби на стыках групп.
Новая группа начинается только с целого.. Но обычно только 37,5 число бывает дробным, больше не бывает.. 17,5 - это все еще нулевой, первый начинается только с целого, т.е. с 18-ти и так каждая группа

Цитата:
Я бы не ставил вообще две границы - достаточно одной.
т.е. только первый/второй? А не первый/второй/третий? Я правильно понял? Вообще желательно, чтобы он, если и был бы диапазон 13-40, то проставил бы все группы "нулевой/первый/второй/третий/четвертый/пятый"... Такие случаи иногда бывают

Цитата:
P.S. У Вас в примере ошибки - кое-где вручную прописано неправильно.
верно.. человеческий фактор, именно поэтому и нужна такого типа функция..
Вложения
Тип файла: zip type.zip (15.7 Кб, 6 просмотров)
sjkz вне форума Ответить с цитированием
Старый 21.08.2013, 11:17   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Почти правильно - только код нужно перенести в стандартный модуль (сперва его создать).
Ну и стомиллионов добавить

Про одну границу - это как в моём-Вашем примере: пишем только одно значение, максимальную границу.

А на
13 40 так и пишет уже: нулевой/первый/второй/третий/четвертый/пятый

Да, в критериях цифру 13 можно удалить, она не анализируется.
Т.е. делаем такой список:

пусто нулевой
18 первый
21 второй
26 третий
31 четвертый
36 пятый
10000000 пусто

И этот список может быть на другом листе, чтоб не мешал. Даже на скрытом.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.08.2013 в 11:27.
Hugo121 вне форума Ответить с цитированием
Старый 21.08.2013, 11:50   #7
Basarga
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 11
По умолчанию

я любитель, строго не судите))
type2.zip
Код:
Sub NulPyat()
Dim massiv As Variant
s = 1

Do While Cells(s, 1).Value > 0
Select Case Cells(s, 1).Value
     Case Is < 18
         s1 = 0
     Case Is < 21
         s1 = 1
     Case Is < 26
         s1 = 2
     Case Is < 31
         s1 = 3
     Case Is < 36
         s1 = 4
     Case Else
         s1 = 5
End Select

Select Case Cells(s, 2).Value
     Case Is < 18
         s2 = 0
     Case Is < 21
         s2 = 1
     Case Is < 26
         s2 = 2
     Case Is < 31
         s2 = 3
     Case Is < 36
         s2 = 4
     Case Else
         s2 = 5
End Select

massiv = Array("рукожопы!", "нулевой", "первый", "второй", "третий", "четвёртый", "пятый")

strk = ""

For i = 0 To s2 - s1
strk = strk + massiv(s1 + 1 + i) + "/"
Next i

If s2 - s1 < 0 Then strk = massiv(0)
Cells(s, 3).Value = Left(strk, Len(strk) - 1)
s = s + 1
Loop

End Sub
Basarga вне форума Ответить с цитированием
Старый 21.08.2013, 11:58   #8
sjkz
Новичок
Джуниор
 
Регистрация: 20.08.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Почти правильно - только код нужно перенести в стандартный модуль (сперва его создать).
Ну и стомиллионов добавить

Про одну границу - это как в моём-Вашем примере: пишем только одно значение, максимальную границу.

А на
13 40 так и пишет уже: нулевой/первый/второй/третий/четвертый/пятый

Да, в критериях цифру 13 можно удалить, она не анализируется.
Т.е. делаем такой список:

пусто нулевой
18 первый
21 второй
26 третий
31 четвертый
36 пятый
10000000 пусто

И этот список может быть на другом листе, чтоб не мешал. Даже на скрытом.
Супер! Теперь все работает, спасибо ) сильно облегчит жизнь))
sjkz вне форума Ответить с цитированием
Старый 21.08.2013, 12:03   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

В общем алгоритм как и у меня
Первая мысль тоже была через select case делать - но потом решил критерии брать с листа.
Массив massiv следует задавать вне цикла - зачем излишне загружать процессор?

Ну а что использовать - выбирать заказчику
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 21.08.2013, 12:17   #10
Basarga
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
В общем алгоритм как и у меня
Массив massiv следует задавать вне цикла - зачем излишне загружать процессор?

Ну а что использовать - выбирать заказчику
про массив затупил, каюсь
Basarga вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление нужного значения для массива данных RedStorm Microsoft Office Excel 1 20.02.2013 11:52
Проблема при сравнении двух таблиц Sergepro Microsoft Office Excel 4 11.09.2012 11:04
вывод данных при выборе определенного значения из раскрывающегося списка Андрей79 PHP 4 04.03.2012 21:58
Вывод не нужного при поиске файлов coNsept Общие вопросы C/C++ 5 28.04.2010 19:11
Поиск лишнего/иного символа при сравнении двух строк Bezdar Microsoft Office Excel 5 13.11.2008 13:07