|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.09.2014, 02:15 | #1 |
Регистрация: 23.09.2014
Сообщений: 6
|
Как выписать из диапазона первое и второе попавшиеся числа?
Здравствуйте! Я абсолютный новичок в этом деле и до многого еще додуматься не могу. Вчера целый день провел за изучением формул и написанием макросов и udf-функций. Но ответа на свой вопрос пока что так и не познал.
У нас есть горизонтальный диапазон ячеек (B2:L2), которые содержат как пустые значения, так целочисленные и буквенные. Как, пройдясь по этому диапазону ячеек, в (С5) записать первое попавшееся в диапазоне число x, а в (C6) второе x, где 0<x<=100? Я пробовал кружиться-вертеться вокруг СУММЕСЛИ() и СЧЁТЕСЛИ(), но ничего не получилось. |
23.09.2014, 02:31 | #2 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
см. вложение (одна формула для поиска всех чисел использовал ИНДЕКС и НАИМЕНЬШИЙ и тоже времени убил не слабо)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
23.09.2014, 09:16 | #3 |
Регистрация: 23.09.2014
Сообщений: 6
|
Огромное вам и большущее спасибо! Сам бы я точно до такого не додумался. Хотя эта формула сложная (мне только предстоит в ней разобраться, с ходу я не осилил ее понять), но она важна для меня, поскольку в будущем мне придется ею часто пользоваться в своих отчетах.
|
23.09.2014, 10:01 | #4 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Я бы писал массивную UDF, которая возвращает сразу массив из двух значений (раз уж UDF тоже рассматривались). Простой цикл по ячейкам, ищем два первых числа, заполняем массив.
Но раз уже Игорь убил времени неслабо - убивать его немного ещё нет необходимости
webmoney: E265281470651 Z422237915069 R418926282008
|
24.09.2014, 09:17 | #5 |
Регистрация: 23.09.2014
Сообщений: 6
|
UDF с циклом мне не составило бы труда написать, но я где-то прочитал, что функции не умеют менять значения в ячейках. Это меня смутило и остановило. К тому же, функция возвращает только значение, поэтому по всем законам программирования, я думаю, что даже если на выход функции подать массив, то он будет выведен в одну ячейку, а ее еще потом нужно распарсить - получается, тоже много мороки.
А с макросами даже не возился, так как для моей задачи их было бы неудобно использовать. |
24.09.2014, 09:55 | #6 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
punchik, зря Вы так. Посмотрите пример во вложении.
Чем шире угол зрения, тем он тупее.
|
25.09.2014, 00:21 | #7 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Функции в общем (есть кривое исключение) не меняют значения в других ячейках. А в тех, куда введены - меняют, т.е. туда они возвращают результат работы.
Дополнил файл своей массивной.
webmoney: E265281470651 Z422237915069 R418926282008
|
29.09.2014, 10:23 | #8 |
Регистрация: 23.09.2014
Сообщений: 6
|
Большое спасибо! Отличное решение! Я как-то даже не подумал о том, что можно вызывать одну и ту же функцию с каждой ячейки вместо того, чтобы выполнять один раз функцию и ее результатом заполнять несколько ячеек.
Посмотрел вашу udf и понял, что для меня на тот момент было бы проблематично передать диапазон ячеек в параметр функции. Я тогда еще не знал про объект Range. Так же я не догадывался о существовании цикла For Each в VBA, не знал о методе IsNumber в Application. Всё это затрудняло написание своей функции. После детального рассмотрения вашей udf удивило, что в VBA можно обойтись без инициализации переменной (ей при объявлении автоматически приписывается значение 0), что после Next можно не писать ключевое слово (For или др.), что в результат функции вы записываете объект x типа Range, а не x.Value. Есть и такое, с чем я не разобрался. Меня интересует, что такое двоеточие в теле вашей udf? Я правильно понимаю, что оно нужно вместо того, чтобы не переходить на следующую строку? В целом, очень понравилось ваше решение проблемы. Коротко, ясно и практично. Единственное, что вы упустили, это проверку значения на принадлежность диапазону чисел (0;100]. Это условие я дописал. Вдруг кому-то понадобится, см. вложение к этому сообщению. |
29.09.2014, 10:37 | #9 | |
Регистрация: 23.09.2014
Сообщений: 6
|
Цитата:
Кстати, 1) удивился, что функция работает, когда вы не использовали в конце своего условного оператора ключевые слова END IF; 2) отдельное спасибо за ваш первый для меня пример работы с массивом в функции |
|
29.09.2014, 10:51 | #10 | |
Регистрация: 23.09.2014
Сообщений: 6
|
Цитата:
В общем, формула оказалось достаточно сложной и объемной. Также натолкнулся на непереносимость ее в другие ячейки, но потом разобрался, что это связано с частью формулы СТРОКА()-4. Еще раз благодарю за интересное решение. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проверить, являются ли данные два слова обращенными друг к другу, то есть первое читается слева направо так же, как второе справа | 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 |