Страницы: 1
RSS
есть ли возможность в Excel суммировать числа больше 16-то разрядов?
 
собственно сами данные еще приличные, но вот результат вычисления уже больше 16-ти разрялов потому и "нагло врот". А хочется получить результаты расчета в десячичном представлении правильными и не в единичном случае, а в большой таблице. Может кто уже "воевал" с такой проблемой?
 
Думаю что можно через VBA-код объявить переменную как Decimal. Она по идее должна работать в диапазоне +/- 79 228 162 514 264 337 593 543 950 335. Но даже если вычислить это будет возможно, то как выводить результат?
Если число (с результатом) все-равно будет большим, то при выводе в ячейку оно все также будет обрезаться.
Когда испробованы все варианты, я начинаю плясать с бубном. Как правило — помогает.
 
Собирать число из ячеек и делить по ячейкам. Но что это будет?
 
Или возможно как текст вывести, если отчет только для просмотра нужен.
Когда испробованы все варианты, я начинаю плясать с бубном. Как правило — помогает.
 
Без длинной арифметики здесь не обойтись - тип Double, которым считает Excel, не может дать большего количества значащих цифр.
https://ru.wikipedia.org/wiki/Число_двойной_точности  
 
Decimal не годится (нет такого)
А вот Currency можно пробовать, проверьте результат: s : 12517996299717.3506 : Currency
Правда не вполне понятно откуда взялось 06... Промежуточное округление не помогает...
Изменено: Hugo - 06.10.2016 09:34:44
 
Цитата
Decimal не годится (нет такого)
Hugo, почему нету. Вроде бы все нормально, все присутствует
Код
Sub test()
    a = "100000000000000000001"
    b = "100000000000000000000"
    c = CDec(a) - CDec(b)
    MsgBox (c)
End Sub
Когда испробованы все варианты, я начинаю плясать с бубном. Как правило — помогает.
 
Типа переменной такого нет. Т.е. as decimal не работает.
А вот так и впрямь работает:
Код
Sub tt()
Dim a(), s, el

a = [a1:a5].Value

For Each el In a
s = s + CDec(el)
Next
MsgBox s
End Sub
Изменено: Hugo - 06.10.2016 10:19:39
 
Работа с числами в VBA, размер которых ограничен только ваше оперативной памятью (Надстройка).
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Hugo написал: вот так и впрямь работает: Sub tt()
но как это использовать в таблицах????
 
Можно пробовать использовать в UDF и писать на лист текстом:
Код
Function bigsum(r As Range) As String
Dim c As Range, s
For Each c In r.Cells
s = s + CDec(c)
Next
bigsum = s
End Function

Говорят в VBA уже 12 бит отводится для decimal, но какой точно будет предел вычисления я не нагуглил.
 
Вы про Тип данных Decimal?
«Бритва Оккама» или «Принцип Калашникова»?
 
В некоторых источниках пишут про 14 байт для VBA.
"С версии 5.0 поддерживается использование типа данных Decimal только в пределах типа Variant, т.е. невозможно описать переменную с типом Decimal. Пользователь, однако, имеет возможность создать переменную типа Variant с подтипом Decimal с помощью функции CDec."
Как Hugo и показал.
«Бритва Оккама» или «Принцип Калашникова»?
 
Да, конечно я думал 12 байт: " and the general purpose 16 byte Variant data type can be converted to a 12 byte Decimal data type using the VBA conversion function CDec."
https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
Спасибо за ссылку на MSDN, только как это будет работать в VBA нужно вероятно проверять, явно нигде не указано. Что значит "в пределах типа Variant"?
 
Значит объявлять как DIM ... as Variant и потом работать через CDec (как вы и показали), DIM ... as Decimal в отличии от VB.NET в VBA нельзя объявить.
Но нужно иметь ввиду, этот тип не стандартный, т.е. Long, Double (и еще куча стандартных) - работают напрямую с аппаратной частью при проведении арифметических операций, в Decimal все делается программно, поэтому медленнее.
«Бритва Оккама» или «Принцип Калашникова»?
 
Вот к примеру код перевода числа из одного основание в другое с использованием этого типа:
Код
Function Бит(Число As String, ОснованиеЧисла As Byte, ОснованиеРезультата As Byte) As String
 Dim dec, m As Byte, i As Byte, t
 t = Timer
 If ОснованиеЧисла < 2 Or ОснованиеЧисла > 36 Or ОснованиеРезультата < 2 Or ОснованиеРезультата > 36 Then Exit Function
 Число = UCase(Число)
 For i = 1 To Len(Число)
   m = Asc(Mid$(Число, i, 1)) - 48
   If m > 9 Then m = m - 7
   dec = CDec(dec * ОснованиеЧисла + m) 'max Decimal = "79228162514264337593543950335"-29
 Next i
 Do
   m = dec - (ОснованиеРезультата * Fix(dec / ОснованиеРезультата)) + 48
   If m > 57 Then m = m + 7
   dec = Fix(dec / ОснованиеРезультата)
   Бит = Chr$(m) & Бит
 Loop While dec > 0
Debug.Print "Бит = " & Timer - t
End Function
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх