функция на VBA для Excel

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
DASh
Сообщения: 11
Зарегистрирован: 20 дек 2007, 21:30

Доброго времени суток. Есть код функции для Excel. Вроде бы работает как надо, но когда в чисто числовой ячейке есть число с 2 знаками после запятой, код суммирует как целое. Форматы в ячейках менял, показывает ,00. Помогите разобраться в чем проблема: в коде или ковыряться в форматах. Заранее благодарен

Код: Выделить всё

Function СУММ_ТЕСТ(cell_ref As Object)
    Application.Volatile
    Dim temp As Currency
    temp = 0
    For Each cell In cell_ref
        If IsNumeric(cell.Value) Then
            temp = temp + Val(cell)
        Else
            temp = temp + Val(Left(cell, 1)) + Val(Right(cell, 1))
        End If
    Next cell
    СУММ_ТЕСТ= temp
End Function
Dim_ok
Сообщения: 51
Зарегистрирован: 03 июл 2007, 09:17

temp = temp + Val(cell)
мне кажется,что вот этот Val всё портит, убрать его надобно
функция Val возвращает число из строки - тобишь ту часть, которая идёт до запятой (или буквы и т.п.)
и тут:
temp = temp + Val(Left(cell, 1)) + Val(Right(cell, 1))
Val тоже уже роли играть не будет, поскольку Вы уже взяли левое значение и правое из ячейки (кстати я так понимаю, что в ячейках значения типа: "1 цифра, что либо, 1 цифра"? иначе формула не всё сосчитает.)
Fatty
Сообщения: 34
Зарегистрирован: 20 ноя 2006, 11:23
Откуда: Славен град Петров

Я попробовал задать разные форматы и записывал
значения через запятую и через точку
Вроде суммирует правильно, проверь:

Код: Выделить всё

Option Explicit

Function СУММ_ТЕСТ(cell_ref As Range) As Currency
    Application.Volatile
    Dim temp As Currency
    temp = 0
    For Each cell In cell_ref
            temp = temp + CCur(cell)
    Next cell
    СУММ_ТЕСТ = temp
End Function

Sub Calcs()
Dim r As Range
Application.ScreenUpdating = False
Set r = ActiveSheet.Range("C1:C10000")
Dim n As Currency
n = СУММ_ТЕСТ(r)
ActiveSheet.Cells(1, 12).Activate
ActiveCell = n
Application.ScreenUpdating = True
End Sub
~'J'~
Diment
Сообщения: 138
Зарегистрирован: 04 сен 2006, 11:39
Откуда: Кисловодск

а если не замарачиваться на пользовательских ф-ях, обойтись стандартными средствами?
вот пара вариантов, которые меняю точку на запятую в числе:
=ЗНАЧЕН(ПОДСТАВИТЬ(A1;".";",";1))
или
=ЗНАЧЕН(СЦЕПИТЬ(ЛЕВСИМВ(A1;ПОИСК(".";A1;1)-1);",";ПСТР(A1;ПОИСК(".";A1;1)+1;3)))
если же без VBA не обойтись или его применение принципиально, то я рекомендую в ф-ях Left() и Right() для поиска количества символов применять ф-и InStr() или InStrRev()
DASh
Сообщения: 11
Зарегистрирован: 20 дек 2007, 21:30

Fatty,
&quot писал(а):temp = temp + CCur(cell)
благодарю вроде помогло, полно пока еще не протестировал

Dim_ok,
&quot писал(а):temp = temp + Val(Left(cell, 1)) + Val(Right(cell, 1))
Val тоже уже роли играть не будет, поскольку Вы уже взяли левое значение и правое из ячейки (кстати я так понимаю, что в ячейках значения типа: "1 цифра, что либо, 1 цифра"? иначе формула не всё сосчитает.)
да нет, в ячейках может быть информация таких форматов: {12; 8\4; 6\ДУ; 10,35; ДП\4; В} а Val если не цифра возращает 0.

Кстати ради ликбеза может кто-нибудь предложет другой код для суммирования данных форматов(при условиях: что сотые только в чисто числовых ячейках, и числа через флеш целые и однозначные), можно и без VBA. Заранее благодарен.
DASh
Сообщения: 11
Зарегистрирован: 20 дек 2007, 21:30

пардон
&quot писал(а):{12; 8\4; 6\ДУ; 10,35; ДП\4,В}
{12; 8\4; 6\ДУ; 10,35; ДП\4;В}
Dim_ok
Сообщения: 51
Зарегистрирован: 03 июл 2007, 09:17

ну а при таких форматах Ваш вариант будет рабочий, только
temp = temp + Val(cell)
меняйте на
temp = temp + cell
Dim_ok
Сообщения: 51
Зарегистрирован: 03 июл 2007, 09:17

ну а при таких форматах Ваш вариант будет рабочий, только
temp = temp + Val(cell)
меняйте на
temp = temp + cell
Ответить