Страница 1 из 1

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

Добавлено: 26 дек 2007, 02:09
DASh
Доброго времени суток. Есть код функции для 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

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

Добавлено: 26 дек 2007, 06:07
Dim_ok
temp = temp + Val(cell)
мне кажется,что вот этот Val всё портит, убрать его надобно
функция Val возвращает число из строки - тобишь ту часть, которая идёт до запятой (или буквы и т.п.)
и тут:
temp = temp + Val(Left(cell, 1)) + Val(Right(cell, 1))
Val тоже уже роли играть не будет, поскольку Вы уже взяли левое значение и правое из ячейки (кстати я так понимаю, что в ячейках значения типа: "1 цифра, что либо, 1 цифра"? иначе формула не всё сосчитает.)

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

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

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

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'~

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

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

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

Добавлено: 26 дек 2007, 22:14
DASh
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. Заранее благодарен.

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

Добавлено: 26 дек 2007, 22:18
DASh
пардон
&quot писал(а):{12; 8\4; 6\ДУ; 10,35; ДП\4,В}
{12; 8\4; 6\ДУ; 10,35; ДП\4;В}

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

Добавлено: 27 дек 2007, 01:38
Dim_ok
ну а при таких форматах Ваш вариант будет рабочий, только
temp = temp + Val(cell)
меняйте на
temp = temp + cell

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

Добавлено: 27 дек 2007, 01:46
Dim_ok
ну а при таких форматах Ваш вариант будет рабочий, только
temp = temp + Val(cell)
меняйте на
temp = temp + cell