Леш, для этого у регэксп есть метод тест. Чуть поправил твою ЮДФ: [vba]
Code
Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray Диапазон()) Dim rArea, rCell, sStr$, i& For Each rArea In Диапазон For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value) sStr = sStr & " " & rCell Next rCell Next rArea With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\b\d+\b" ' чтоб адреса ячеек не считала:-) If Not .test(sStr) Then Exit Function With .Execute(sStr) ReDim Arr(1 To .Count) For i = 0 To .Count - 1: Arr(i + 1) = CLng(.Item(i).Value): Next i ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr End With: End With 'Зачем возвращать ошибку? Вернем 0 ' ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue) ' вернуть ошибку #ЗНАЧЕНИЕ если была ошибка End Function
[/vba]
Леш, для этого у регэксп есть метод тест. Чуть поправил твою ЮДФ: [vba]
Code
Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray Диапазон()) Dim rArea, rCell, sStr$, i& For Each rArea In Диапазон For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value) sStr = sStr & " " & rCell Next rCell Next rArea With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\b\d+\b" ' чтоб адреса ячеек не считала:-) If Not .test(sStr) Then Exit Function With .Execute(sStr) ReDim Arr(1 To .Count) For i = 0 To .Count - 1: Arr(i + 1) = CLng(.Item(i).Value): Next i ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr End With: End With 'Зачем возвращать ошибку? Вернем 0 ' ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue) ' вернуть ошибку #ЗНАЧЕНИЕ если была ошибка End Function
Серёга, Вообще-то эта функция обсуждалась и дорабатывалась в топике Функция (UDF) "ИЗВЛЕЧЬЦЕЛЫЕ". А здесь я её просто применил.
И к тому же я не вижу преимуществ твоего кода перед моим. Да и возвращать ошибку #ЗНАЧЕНИЕ если целых в стринге нет, ИМХО, логически вернее, чем возвращать 0. Ведь 0 - это тоже целое число и имеет полное право присутствовать в тексте
Серёга, Вообще-то эта функция обсуждалась и дорабатывалась в топике Функция (UDF) "ИЗВЛЕЧЬЦЕЛЫЕ". А здесь я её просто применил.
И к тому же я не вижу преимуществ твоего кода перед моим. Да и возвращать ошибку #ЗНАЧЕНИЕ если целых в стринге нет, ИМХО, логически вернее, чем возвращать 0. Ведь 0 - это тоже целое число и имеет полное право присутствовать в текстеAlex_ST
Хорошо, поясню. Вместо встроенного метода test ты встраиваешь туда обработчик ошибок. Это само по себе одевание трусов через голову. Примени test и ошибок не будет. Мало того, ты еще и возвращаешь значение ошибки, которое в свою очередь придется обрабатывать, будь то на листе, или в коде. Зачем это в простой функции? Примени формулу СУММ к тексту. Она вернет 0. Не, ну это только мое мнение. Ты уж как посчитаешь нужным:-)
Хорошо, поясню. Вместо встроенного метода test ты встраиваешь туда обработчик ошибок. Это само по себе одевание трусов через голову. Примени test и ошибок не будет. Мало того, ты еще и возвращаешь значение ошибки, которое в свою очередь придется обрабатывать, будь то на листе, или в коде. Зачем это в простой функции? Примени формулу СУММ к тексту. Она вернет 0. Не, ну это только мое мнение. Ты уж как посчитаешь нужным:-)KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Я, честно говоря, не понимаю, чем тебе так обработчик ошибок не нравится? А по поводу того, что встроенная СУММ, применённая к тексту, возвращает 0, так это, ИМХО, не фича , а баг. Именно поэтому, когда я лепил эту ЮДФ-ку, я решил возвращать ошибку, когда чисел нет.
Я, честно говоря, не понимаю, чем тебе так обработчик ошибок не нравится? А по поводу того, что встроенная СУММ, применённая к тексту, возвращает 0, так это, ИМХО, не фича , а баг. Именно поэтому, когда я лепил эту ЮДФ-ку, я решил возвращать ошибку, когда чисел нет.Alex_ST
Я тоже не понимаю, чем тебе не нравится встроенный метод регексп. Это все равно, что в словарь добавлять новый ключ, предварительно проверяя его отсутствие в массиве, а не пользуясь методом exists:-) По поводу ошибок - на форумах через день возникает вопрос, как вместо значения ошибки выводить 0 или пустую строку. И пошла жара: =если(еош(... А оно надо? Я еще понимаю сложные функции типа ВПР, индекс. Но в простых достаточно вернуть 0, или пустую строку. Как я уже писал, это только мое мнение.
Я тоже не понимаю, чем тебе не нравится встроенный метод регексп. Это все равно, что в словарь добавлять новый ключ, предварительно проверяя его отсутствие в массиве, а не пользуясь методом exists:-) По поводу ошибок - на форумах через день возникает вопрос, как вместо значения ошибки выводить 0 или пустую строку. И пошла жара: =если(еош(... А оно надо? Я еще понимаю сложные функции типа ВПР, индекс. Но в простых достаточно вернуть 0, или пустую строку. Как я уже писал, это только мое мнение.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Сообщение отредактировал KuklP - Суббота, 22.09.2012, 22:34
как известно, СУММ, примененная к диапазону ячеек, среди которых есть текстовые, эти текстовые ячейки пропускает. если среди ячеек диапазона - все текстовые, то вернёт 0, а не ощибку. имхо, и это правильно. какая тут может быть ошибка? мы пытались посчитать сумму того, чего нет - получили 0. по аналогии - послали нас считать баранов в стадо КРС, где только быки и коровы. какой результат? 0 баранов. так и здесь - послали мы функцию в диапазон считать сумму чисел, а чисел не нашлось. результат=0.
другое дело, если некоторым пользователям в некоторых случаях необходимо различать, что это за 0. ибо (отойдя от аналогии с баранами) числа в диапазоне могут быть, но их сумма даст тоже 0. ну так для этого есть другие способы, не правда ли?
Code
=СЧЁТ()
поэтому, моё имхо на стороне Сергея. хотя спорить можно до хрипоты.
а вот если среди диапазона ячеек будут ячейки с ошибками (по сути - неопределенность), то сказать, что "баранов" именно 0, мы не сможем. кто его знает, что было в закрытом загоне? кто его знает, что там за #ЗНАЧ! в ячейке? и СУММ(), примененная к такому диапазону, вернет ошибку. и это тоже правильно.
безусловно, при разработке UDF автор волен руководствоваться своими представлениями, отличными от вышеприведенной логики. имхо, это его полное право и, если поведение функции будет нормально описано - то проблем вызвать не должно. чисто теоретически. но практически все мы знаем, что процент людей, хотя бы читающих справку, исчезающе мал. а уж вникающих во все нюансы - тем более. сколько раз вам встречались на форумах вопли юзеров "ПРОСМОТР не работает!!!" и лишь после третьего тыка носом в предложение "данные должны быть упорядочены" вопли стихают (но, я подозреваю, обида остается на всю жизнь)
так стоит ли реализовывать свои UDF с "более правильной" логикой, отличной от привычной?
как известно, СУММ, примененная к диапазону ячеек, среди которых есть текстовые, эти текстовые ячейки пропускает. если среди ячеек диапазона - все текстовые, то вернёт 0, а не ощибку. имхо, и это правильно. какая тут может быть ошибка? мы пытались посчитать сумму того, чего нет - получили 0. по аналогии - послали нас считать баранов в стадо КРС, где только быки и коровы. какой результат? 0 баранов. так и здесь - послали мы функцию в диапазон считать сумму чисел, а чисел не нашлось. результат=0.
другое дело, если некоторым пользователям в некоторых случаях необходимо различать, что это за 0. ибо (отойдя от аналогии с баранами) числа в диапазоне могут быть, но их сумма даст тоже 0. ну так для этого есть другие способы, не правда ли?
Code
=СЧЁТ()
поэтому, моё имхо на стороне Сергея. хотя спорить можно до хрипоты.
а вот если среди диапазона ячеек будут ячейки с ошибками (по сути - неопределенность), то сказать, что "баранов" именно 0, мы не сможем. кто его знает, что было в закрытом загоне? кто его знает, что там за #ЗНАЧ! в ячейке? и СУММ(), примененная к такому диапазону, вернет ошибку. и это тоже правильно.
безусловно, при разработке UDF автор волен руководствоваться своими представлениями, отличными от вышеприведенной логики. имхо, это его полное право и, если поведение функции будет нормально описано - то проблем вызвать не должно. чисто теоретически. но практически все мы знаем, что процент людей, хотя бы читающих справку, исчезающе мал. а уж вникающих во все нюансы - тем более. сколько раз вам встречались на форумах вопли юзеров "ПРОСМОТР не работает!!!" и лишь после третьего тыка носом в предложение "данные должны быть упорядочены" вопли стихают (но, я подозреваю, обида остается на всю жизнь)
так стоит ли реализовывать свои UDF с "более правильной" логикой, отличной от привычной?ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Ну, ладно. Пусть каждый останется при своих баранах. Но всё равно, обсуждать ЮДФ-ку здесь не место, раз для неё есть специальный топик. Ведь здесь решение, предложенное Сергеем, утонет послезавтра, а в "Готовых решениях" всё-таки не так "глубоко" и интересующиеся смогут найти хотя бы по названию топика (не то, что здесь )
Ну, ладно. Пусть каждый останется при своих баранах. Но всё равно, обсуждать ЮДФ-ку здесь не место, раз для неё есть специальный топик. Ведь здесь решение, предложенное Сергеем, утонет послезавтра, а в "Готовых решениях" всё-таки не так "глубоко" и интересующиеся смогут найти хотя бы по названию топика (не то, что здесь )Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Суббота, 22.09.2012, 23:10