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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2014, 02:15   #1
punchik
 
Регистрация: 23.09.2014
Сообщений: 6
Вопрос Как выписать из диапазона первое и второе попавшиеся числа?

Здравствуйте! Я абсолютный новичок в этом деле и до многого еще додуматься не могу. Вчера целый день провел за изучением формул и написанием макросов и udf-функций. Но ответа на свой вопрос пока что так и не познал.
У нас есть горизонтальный диапазон ячеек (B2:L2), которые содержат как пустые значения, так целочисленные и буквенные. Как, пройдясь по этому диапазону ячеек, в (С5) записать первое попавшееся в диапазоне число x, а в (C6) второе x, где 0<x<=100?
Я пробовал кружиться-вертеться вокруг СУММЕСЛИ() и СЧЁТЕСЛИ(), но ничего не получилось.
Вложения
Тип файла: rar example.rar (4.1 Кб, 7 просмотров)
punchik вне форума Ответить с цитированием
Старый 23.09.2014, 02:31   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

см. вложение (одна формула для поиска всех чисел использовал ИНДЕКС и НАИМЕНЬШИЙ и тоже времени убил не слабо)
Вложения
Тип файла: rar example.rar (3.8 Кб, 27 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 23.09.2014, 09:16   #3
punchik
 
Регистрация: 23.09.2014
Сообщений: 6
Хорошо

Огромное вам и большущее спасибо! Сам бы я точно до такого не додумался. Хотя эта формула сложная (мне только предстоит в ней разобраться, с ходу я не осилил ее понять), но она важна для меня, поскольку в будущем мне придется ею часто пользоваться в своих отчетах.
punchik вне форума Ответить с цитированием
Старый 23.09.2014, 10:01   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я бы писал массивную UDF, которая возвращает сразу массив из двух значений (раз уж UDF тоже рассматривались). Простой цикл по ячейкам, ищем два первых числа, заполняем массив.
Но раз уже Игорь убил времени неслабо - убивать его немного ещё нет необходимости
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 24.09.2014, 09:17   #5
punchik
 
Регистрация: 23.09.2014
Сообщений: 6
Радость

UDF с циклом мне не составило бы труда написать, но я где-то прочитал, что функции не умеют менять значения в ячейках. Это меня смутило и остановило. К тому же, функция возвращает только значение, поэтому по всем законам программирования, я думаю, что даже если на выход функции подать массив, то он будет выведен в одну ячейку, а ее еще потом нужно распарсить - получается, тоже много мороки.
А с макросами даже не возился, так как для моей задачи их было бы неудобно использовать.
punchik вне форума Ответить с цитированием
Старый 24.09.2014, 09:55   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

punchik, зря Вы так. Посмотрите пример во вложении.
Вложения
Тип файла: rar example_func.rar (8.3 Кб, 16 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 25.09.2014, 00:21   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Функции в общем (есть кривое исключение) не меняют значения в других ячейках. А в тех, куда введены - меняют, т.е. туда они возвращают результат работы.

Дополнил файл своей массивной.
Вложения
Тип файла: rar example_func_Arr.rar (9.2 Кб, 14 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 29.09.2014, 10:23   #8
punchik
 
Регистрация: 23.09.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
punchik, зря Вы так. Посмотрите пример во вложении.
Большое спасибо! Отличное решение! Я как-то даже не подумал о том, что можно вызывать одну и ту же функцию с каждой ячейки вместо того, чтобы выполнять один раз функцию и ее результатом заполнять несколько ячеек.
Посмотрел вашу udf и понял, что для меня на тот момент было бы проблематично передать диапазон ячеек в параметр функции. Я тогда еще не знал про объект Range. Так же я не догадывался о существовании цикла For Each в VBA, не знал о методе IsNumber в Application. Всё это затрудняло написание своей функции.
После детального рассмотрения вашей udf удивило, что в VBA можно обойтись без инициализации переменной (ей при объявлении автоматически приписывается значение 0), что после Next можно не писать ключевое слово (For или др.), что в результат функции вы записываете объект x типа Range, а не x.Value.
Есть и такое, с чем я не разобрался. Меня интересует, что такое двоеточие в теле вашей udf? Я правильно понимаю, что оно нужно вместо того, чтобы не переходить на следующую строку?
В целом, очень понравилось ваше решение проблемы. Коротко, ясно и практично. Единственное, что вы упустили, это проверку значения на принадлежность диапазону чисел (0;100]. Это условие я дописал. Вдруг кому-то понадобится, см. вложение к этому сообщению.
Вложения
Тип файла: rar example_func.rar (8.5 Кб, 10 просмотров)
punchik вне форума Ответить с цитированием
Старый 29.09.2014, 10:37   #9
punchik
 
Регистрация: 23.09.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Функции в общем (есть кривое исключение) не меняют значения в других ячейках. А в тех, куда введены - меняют, т.е. туда они возвращают результат работы.
Дополнил файл своей массивной.
Спасибо за решение! Сначала показалось сложным, т.к. используются какие-то фигурные скобки, которые при редактировании пропадают. Потом разобрался с тем, что они обозначают, и вообще, как оперировать массивными функциями. В результате решение не плохое (хотя также, как и SAS888, упустили условие (0;100]), но заточено только под конкретное число выборки. Если вдруг понадобится найти 3 элемента с диапазона ячеек, тогда придется лезть изменять функцию.
Кстати, 1) удивился, что функция работает, когда вы не использовали в конце своего условного оператора ключевые слова END IF; 2) отдельное спасибо за ваш первый для меня пример работы с массивом в функции
punchik вне форума Ответить с цитированием
Старый 29.09.2014, 10:51   #10
punchik
 
Регистрация: 23.09.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
см. вложение (одна формула для поиска всех чисел использовал ИНДЕКС и НАИМЕНЬШИЙ и тоже времени убил не слабо)
Наконец-то нашел время детально исследовать вашу формулу и изучить каждую стандартную функцию по отдельности. Очень сбивали с толку фигурные скобки, пока не попал на уроки о массивах. До того постоянно ставил их вручную и они не работали Также понравился вывод "Чисел больше нет", когда заканчивались удовлетворяющие условию выражения.
В общем, формула оказалось достаточно сложной и объемной. Также натолкнулся на непереносимость ее в другие ячейки, но потом разобрался, что это связано с частью формулы СТРОКА()-4. Еще раз благодарю за интересное решение.
punchik вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить, являются ли данные два слова обращенными друг к другу, то есть первое читается слева направо так же, как второе справа FYNZIK Паскаль, Turbo Pascal, PascalABC.NET 4 10.03.2014 18:23
Первое, как поменять местами, второе, несколько условий? mishasevgok Microsoft Office Excel 1 25.11.2012 18:28
Как из диапазона вывести число, которое первое удовлетворит одному из условий fury1986 Microsoft Office Excel 1 12.08.2012 10:11
Даны три различных целых числа, определить, какое из них (первое, второе или третье); Genius94 Паскаль, Turbo Pascal, PascalABC.NET 3 15.06.2012 07:24
Даны два слова. Получить третье слово из неповторяющихся символов, входящих как в первое, так и во второе слова. dlinkz Паскаль, Turbo Pascal, PascalABC.NET 8 01.02.2012 11:09