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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2012, 17:13   #11
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

для тех же целей:
функция:
Код:
Function SumDgt(ByVal s As String) As Long
  If s = "" Then SumDgt = 0 Else SumDgt = Val(Left(s, 1)) + SumDgt(Right(s, Len(s) - 1))
End Function
и формула (массива)
Код:
=-СУММ(ЕСЛИ(ЕОШ(-ПСТР(A1;СТРОКА($1:$99);1));;-ПСТР(A1;СТРОКА($1:$99);1)))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 19.05.2012, 18:02   #12
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Игорь,
вот это красота! Никогда бы не подумал, что тут можно рекурсию использовать
Можно еще сократить:
Код:
Function SumDgt(ByVal s As String) As Long
  If Len(s) Then SumDgt = Val(Left(s, 1)) + SumDgt(Mid(s, 2))
End Function
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 19.05.2012, 20:08   #13
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

забавы ради

Код:
Function SumNumbers(ByVal text As String) As Long
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern = "\D+"
        text = .Replace(text, "")
        .Pattern = "(?=\B\d)"
        text = .Replace(text, "+")
        SumNumbers = Evaluate(text)
    End With
End Function
Тишина – самый громкий звук

Последний раз редактировалось nerv; 19.05.2012 в 20:15.
nerv вне форума Ответить с цитированием
Старый 19.05.2012, 20:35   #14
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

как вариант
Код:
Function sn(r As Range) As Byte
  Dim a() As Byte, i%
  a = r.Text
  For i = 0 To UBound(a) Step 2
    If a(i) > 48 And a(i) < 58 Then sn = sn + a(i) - 48
  Next
End Function
ikki_pf вне форума Ответить с цитированием
Старый 19.05.2012, 20:46   #15
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

ikki_pf,
надо еще проверять, что a(i+1)=0
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 19.05.2012, 20:58   #16
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

в общем случае - да,
но здесь, наверное, проще сначала проверить IsNumeric(r.Value) ?

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

тогда уж так:
Код:
Function sn(r As Range) As Byte
  Dim a() As Byte, i%
  If Not IsNumeric(r.Value) Then Exit Function
  a = CStr(r.Value)
  For i = 0 To UBound(a) Step 2
    If a(i) > 48 And a(i) < 58 Then sn = sn + a(i) - 48
  Next
End Function

Последний раз редактировалось ikki_pf; 19.05.2012 в 21:24. Причина: истина дороже :)
ikki_pf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена символа в ОДНОЙ ячейке Excel.... Al_Sha Общие вопросы Delphi 2 11.06.2010 21:13
Как перебрать все числа из заданных цифр, чтобы цифры в числах не повторялись? TwiX Общие вопросы Delphi 7 17.08.2009 16:56
Чтобы все действия происходили в одной ячейке? abdumanon Microsoft Office Excel 8 07.04.2009 11:52
a=42339, как все цифры этого числа разделить пробелами??? MjRed Помощь студентам 6 19.12.2008 11:09
два числа в одной ячейке zetrix Microsoft Office Excel 1 23.12.2007 23:24