Страницы: 1
RSS
Как сложить числа в текстовой ячейке
 
Здравствуйте.  
Помогите пожалуйста, всю голову сломал, ничего не получается.  
 
Есть тексовые ячейки с цифрами и буквами, необходимо сложить все цифры в ячейке.
 
UDF:  
 
Function specsum(s$) As Double  
   Dim i&  
   For i = 1 To Len(s)  
       If Not IsNumeric(Mid(s, i, 1)) Then Mid(s, i, 1) = "+"  
   Next  
   specsum = Evaluate("=" & s & "+0")  
End Function
 
Эмм...    
"=" &  
лишнее...
 
Подскажите.  
А как этот макрос работает?
 
Зачем писать своё, если есть формула (формула массива) МСН:  
 
=СУММ(--ПСТР(0&A3;НАИБОЛЬШИЙ(ЕЧИСЛО(-ПСТР(" "&A3;СТРОКА($1:$99)+1;1))*ЕОШ(-ПСТР(" "&A3;СТРОКА($1:$99);1))*СТРОКА($1:$99);СТРОКА($1:$10))+1;НАИБОЛЬШИЙ(ЕЧИСЛО(-ПСТР(A3;СТРОКА($1:$99);1))*ЕОШ(-ПСТР(A3;СТРОКА($1:$99)+1;1))*СТРОКА($1:$99);СТРОКА($1:$10))-НАИБОЛЬШИЙ(ЕЧИСЛО(-ПСТР(" "&A3;СТРОКА($1:$99)+1;1))*ЕОШ(-ПСТР(" "&A3;СТРОКА($1:$99);1))*СТРОКА($1:$99);СТРОКА($1:$10))+1))
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Файл с работы не хочу посылать.  
Поэтому изучайте приёмы: http://www.planetaexcel.ru/tip.php?aid=62  
и делайте аналогично с этим кодом.  
На лист пишется просто: =specsum(A3)  
 
Ещё раз код без лишнего (и тип поменял, Double лишнее):  
 
Function specsum(s$) As Long  
   Dim i&  
   For i = 1 To Len(s)  
       If Not IsNumeric(Mid(s, i, 1)) Then Mid(s, i, 1) = "+"  
   Next  
   specsum = Evaluate(s & "+0")  
End Function  
 
 
Владимир - мне это никогда не разобрать... :)
 
Спасибо всем!  
Разобрался, всё работает (и формула и функция).
 
Цифры. Числа. Есть разница?
 
Скажите, а как модифицировать эту функцию, чтобы складывала дробные числа, а то "точки" воспринимает, как текст и разбивает число.  
 
Function specsum(s$) As Long  
Dim i&  
For i = 1 To Len(s)  
If Not IsNumeric(Mid(s, i, 1)) Then Mid(s, i, 1) = "+"  
Next  
specsum = Evaluate(s & "+0")  
End Function
 
в смысле "разбивает число"?
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
{quote}{login=vikttur}{date=04.04.2012 11:38}{thema=}{post}Цифры. Числа. Есть разница?{/post}{/quote}  
что за глупости? ) Круг и квадрат. Есть разница? Конечно нет! И то и другое геометрическая фигура )))
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
в смысле "разбивает число"?  
В смысле есть строка 98.5текст1.5  
Вместо сложения 98.5+1.5 и результа 100    
складывает 98+5+1+5 и результат 106
 
{quote}{login=nerv}{date=13.06.2012 11:14}{thema=}{post}что за глупости? ){/post}{/quote}  
Буквы и слова есть разница?
 
{quote}{login=}{date=13.06.2012 11:23}{thema=}{post}складывает 98+5+1+5 и результат 106{/post}{/quote}Excel так не умеет... 109 - можно, 106... то же можно, если знать, почему...
 
а разве в нижеуказанном варианте не складывает как Вам нужно?  
 
Function specsum(s$) As Long  
Dim i&  
For i = 1 To Len(s)  
If Not IsNumeric(Mid(s, i, 1)) Then Mid(s, i, 1) = "+"  
Next  
specsum = Evaluate(s & "+0")  
End Function
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Function specsum(ByVal s$) As Double  
Dim i&  
For i = 1 To Len(s)  
   If InStr("0123456789.", Mid$(s, i, 1)) = 0 Then Mid$(s, i, 1) = "+"  
Next i  
specsum = Evaluate(s & "+0")  
End Function
 
MCH - спасибо! Закрыто.
 
Погодите закрывать - нужно упомянуть, что это тоже не универсальный вариант, он не рассчитан на другой разделитель (мало ли где будут использовать), и на то, что в строке может быть точка просто так, не в числе.
 
Function specsum(ByVal s$, Optional del$ = ".") As Double  
Dim i&, x  
For i = 1 To Len(s)  
   If InStr("0123456789" & del, Mid$(s, i, 1)) = 0 Then Mid$(s, i, 1) = " "  
Next i  
For Each x In Split(Application.Trim(Replace(s, del, ".")))  
   specsum = specsum + Val(x)  
Next x  
End Function  
 
В данном случае можно задать разделитель целой  дробной части, по умолчанию, если не указать - точка  
Кроме того, не будет возникать ошибка, если в числе есть две точки, после второй точки цифры отбрасываются
Страницы: 1
Читают тему
Наверх