In this Article
- VBA Round
- Syntax of the VBA Round Function
- VBA Round a Variable
- VBA Rounding Results
- VBA Round Cell Value
- VBA RoundUp Function
- RoundUp to the Nearest Whole Number
- RoundUp Function Results
- VBA RoundDown Function
- RoundDown to the Nearest Whole Number
- RoundDown Function Results
- Other VBA Rounding Functions
- VBA Ceiling – RoundUp to A Specified Significance
- VBA RoundUp To Specified Significance Results
- VBA Floor – RoundDown to A Specified Significance
- VBA RoundDown to Specified Significance Results
VBA Round
The VBA Round Function rounds numbers to a specified number of digits.
Syntax of the VBA Round Function
The syntax of the VBA Round Function is:
Round(Expression, [Decimal_places]) where:
- Expression – The number to round.
- Decimal_places (Optional) – An integer that specifies the number of decimal places to round. The value must be greater than or equal to 0 (>=0). If blank, the default of 0 is used, which means the function rounds to the nearest integer.
So, let’s look at an example so that you can see how the VBA Round function works, rounding to 1 decimal place:
Sub Round1()
Msgbox Round(7.25, 1)
End Sub
The resulting MessageBox:
VBA Round a Variable
In the above example, we entered the to-be-rounded number directly into the function, usually however, you’d round a variable instead. The following is an example using a variable instead:
Note: We use the Double variable type in order to store decimal values.
Sub RoundUsingVariable()
Dim unitcount As Double
unitcount = 7.25
MsgBox "The value is " & Round(unitcount, 1)
End Sub
The result is:
VBA Rounding Results
Actual Number | Number of Decimal Places | Result |
---|---|---|
7.25 | 0 | 7 |
7.25 | 1 | 7.2 |
7.25 | 2 | 7.25 |
-7.25 | 1 | -7.2 |
-7.25 | 2 | -7.25 |
VBA Round Cell Value
You can also round a cell value directly in VBA:
Sub RoundCell()
Range("A1").Value = Round(Range("A1").Value, 2)
End Sub
VBA RoundUp Function
Let’s say you want to round a number up, using VBA. There is no built-in VBA RoundUp equivalent function, instead what you can do is call the Excel RoundUp Worksheet function from your VBA code:
roundupUnitcount = Application.WorksheetFunction.RoundUp(unitcount, 3)
Excel’s worksheet functions are available to use in VBA, through the use of the WorksheetFunction object. The only worksheet functions that you can’t call, are those that already have a built-in VBA equivalent.
A reminder of the syntax of the Excel Worksheet RoundUp Function:
ROUNDUP(Number, Digits) where:
- Number – The number that you would like rounded up.
- Digits – The number of digits that you would like to round the number.
So, let’s look at an example, so that you can see how to access the RoundUp Worksheet function in your VBA code:
Sub RoundUp()
Dim unitcount As Double
Dim roundupUnitcount As Double
unitcount = 7.075711
roundupUnitcount = Application.WorksheetFunction.RoundUp(unitcount, 4)
MsgBox "The value is " & roundupUnitcount
End Sub
The result is:
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
RoundUp to the Nearest Whole Number
You can round up to the nearest whole number by specifying 0 as the number of decimal places:
Sub RoundUpWhole()
MsgBox Application.WorksheetFunction.RoundUp(7.1, 0)
End Sub
The result delivered:
RoundUp Function Results
Actual Number | Digits | Result |
---|---|---|
7.075711 | 0 | 8 |
7.075711 | 1 | 7.1 |
7.075711 | 2 | 7.08 |
7.075711 | 3 | 7.076 |
7.075711 | -1 | 10 |
7.075711 | -2 | 100 |
7.075711 | -3 | 1000 |
VBA RoundDown Function
Let’s say you want to round a number down, using VBA. There is no built-in VBA RoundDown equivalent function either, instead again, what you would do is call the Excel RoundDown Worksheet function from your VBA code.
A reminder of the syntax of the Excel Worksheet RoundDown Function:
ROUNDDOWN(Number, Digits) where:
• Number – The number that you would like rounded down.
• Digits – The number of digits that you would like to round the number.
So, let’s look at an example, so that you can see how to access the RoundDown Worksheet function in your VBA code:
Sub RoundDown()
Dim unitcount As Double
Dim rounddownUnitcount As Double
unitcount = 5.225193
rounddownUnitcount = Application.WorksheetFunction.RoundDown(unitcount, 4)
MsgBox "The value is " & rounddownUnitcount
End Sub
The result is:
VBA Programming | Code Generator does work for you!
RoundDown to the Nearest Whole Number
You can round down to the nearest whole number by specifying 0 as the number of decimal places:
Sub RoundDownWhole()
MsgBox Application.WorksheetFunction.RoundDown(7.8, 0)
End Sub
The result is:
RoundDown Function Results
Actual Number | Digits | Result |
---|---|---|
5.225193 | 0 | 5 |
5.225193 | 1 | 5.2 |
5.225193 | 2 | 5.22 |
5.225193 | 3 | 5.225 |
5.225193 | -1 | 0 |
5.225193 | -2 | 0 |
5.225193 | -3 | 0 |
Other VBA Rounding Functions
VBA Ceiling – RoundUp to A Specified Significance
VBA does not have a Ceiling.Math function equivalent, so if you want to round a number up to the nearest integer or to the nearest specified multiple of significance, then you can call Excel’s Ceiling.Math worksheet function from your VBA code.
A reminder of the syntax of the Excel Worksheet Ceiling.Math Function:
CEILING.MATH(Number, [Significance], [Mode]) where:
- Number – The number that you would like to round up.
- Significance (Optional) – The multiple to which you want your number to be rounded to.
- Mode (Optional) – Controls whether negative numbers are rounded towards or away from zero.
So, let’s look at an example, so that you can see how to access the Ceiling.Math Worksheet function in your VBA code:
Sub RoundUpToSignificance()
Dim unitcount As Double
Dim ceilingmathUnitcount As Double
unitcount = 4.1221
ceilingmathUnitcount = Application.WorksheetFunction.Ceiling_Math(unitcount, 5)
MsgBox "The value is " & ceilingmathUnitcount
End Sub
The result is:
VBA RoundUp To Specified Significance Results
Actual Number | Significance | Mode | Result |
---|---|---|---|
4.1221 | 5 | ||
4.1221 | 3 | 6 | |
4.1221 | 50 | 50 | |
-4.1221 | 3 | -3 | |
-4.1221 | 3 | -1 | -6 |
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
VBA Floor – RoundDown to A Specified Significance
VBA does not have a Floor.Math function equivalent either. However, once again, if you want to round a number down to the nearest integer or to the nearest specified multiple of significance, then you can call Excel’s Floor.Math worksheet function from VBA.
A reminder of the syntax of the Excel Worksheet Floor.Math Function:
FLOOR.MATH(Number, [Significance], [Mode]) where:
• Number – The number that you would like to round down.
• Significance (Optional) – The multiple to which you want your number to be rounded to.
• Mode (Optional) – Controls whether negative numbers are rounded towards or away from zero.
So, let’s look at an example, so that you can see how to access the Floor.Math Worksheet function in your VBA code:
Sub RoundDownToSignificance()
Dim unitcount As Double
Dim floormathUnitcount As Double
unitcount = 4.55555559
floormathUnitcount = Application.WorksheetFunction.Floor_Math(unitcount, 2)
MsgBox "The value is " & floormathUnitcount
End Sub
The result is:
VBA RoundDown to Specified Significance Results
Actual Number | Significance | Mode | Result |
---|---|---|---|
4.55555559 | 4 | ||
4.55555559 | 3 | 3 | |
4.55555559 | 50 | 0 | |
-4.55555559 | 3 | -6 | |
-4.55555559 | 3 | -1 | -3 |
Округление чисел в VBA Excel с помощью оператора Round и встроенной функции рабочего листа WorksheetFunction.Round. Особенности бухгалтерского и обычного округления.
Оператор Round
А вы знаете, что при использовании для округления чисел в VBA Excel оператора Round, вы можете получить совершенно не тот результат, который ожидали? И ведь это действительно так!
Скопируйте в модуль VBA следующую процедуру и запустите ее выполнение:
Sub Test_1() Dim a1 As Single, a2 As Single, a3 As Single, a4 As Single a1 = Round(1.5, 0) a2 = Round(2.5, 0) a3 = Round(3.5, 0) a4 = Round(4.5, 0) MsgBox «Round(1.5, 0)=» & a1 & vbNewLine & _ «Round(2.5, 0)=» & a2 & vbNewLine & _ «Round(3.5, 0)=» & a3 & vbNewLine & _ «Round(4.5, 0)=» & a4 End Sub |
В результате вы получите это:
Удивительно, не правда ли? Как же так получилось?
Дело в том, что оператор Round осуществляет «бухгалтерское» (или «банковское») округление, которое призвано при большом количестве таких операций свести погрешность к минимуму. Это достигается за счет того, что оператор Round использует при округлении правило, отличное от того, которое мы знаем еще со школы, когда округляемое число увеличивается на единицу, если отбрасываемое число равно пяти. Суть округления с помощью оператора Round состоит в том, что если перед отбрасываемой пятеркой стоит нечетная цифра, то она увеличивается на единицу (округление вверх), а если перед ней стоит четная цифра, то она не увеличивается (округление вниз).
Еще можно сформулировать «бухгалтерское» округление так: при отбрасывании пятерки число округляется к ближайшему четному. Обратите внимание, что в результатах нашего примера все полученные числа — четные.
Проверим погрешность:
- Сумма исходных чисел: 1.5 + 2.5 + 3.5 +4.5 = 12
- Сумма округленных чисел: 2 + 2 + 4 + 4 = 12
Результат получился просто идеальный для приведенного примера, так как суммы исходных и округленных чисел равны.
Оператор WorksheetFunction.Round
Если вам необходимо общепринятое математическое округление, используйте встроенную функцию рабочего листа — WorksheetFunction.Round.
Скопируйте в модуль VBA процедуру с использованием WorksheetFunction.Round и запустите ее выполнение:
Sub Test_2() Dim a1 As Single, a2 As Single, a3 As Single, a4 As Single a1 = WorksheetFunction.Round(1.5, 0) a2 = WorksheetFunction.Round(2.5, 0) a3 = WorksheetFunction.Round(3.5, 0) a4 = WorksheetFunction.Round(4.5, 0) MsgBox «WorksheetFunction.Round(1.5, 0)=» & a1 & vbNewLine & _ «WorksheetFunction.Round(2.5, 0)=» & a2 & vbNewLine & _ «WorksheetFunction.Round(3.5, 0)=» & a3 & vbNewLine & _ «WorksheetFunction.Round(4.5, 0)=» & a4 End Sub |
Результат будет следующий:
Получилось то, что мы и ожидали.
Проверим погрешность:
- Сумма исходных чисел: 1.5 + 2.5 + 3.5 +4.5 = 12
- Сумма округленных чисел: 2 + 3 + 4 + 5 = 14
Результат очевиден — в данном случае сумма округленных чисел на 2 единицы больше суммы исходных.
Исходя из этого результата, можно сделать вывод, что «банковское» округление с помощью оператора Round дает более точные результаты при массовых операциях с округленными числами. Но в повседневной жизни чаще встречается обычное математическое округление.
Выбирайте округление, которое вам больше подходит для решаемой задачи!
- Int() возвращает ближайшее меньшее целое;
- Fix() отбрасывает дробную часть;
- Round() округляет до указанного количества знаков после запятой.
Однако Round может вернуть не совсем ожидаемый результат, т.к. функция применяет финансовое округление. По правилам данного округления если за последней к округлению цифрой стоит 5, то округляемую цифру увеличивают в том случае, если она нечетная и уменьшают, если четная.
Математическое же округление всегда округляет цифру в большую сторону, если за ней идет цифра 5 и выше, и отбрасывает остаток если 4 и меньше.
Т.е. если мы выполним такую строку кода
MsgBox Round(2.505, 2)
то результатом будет 2,5 , хотя предполагалось получить 2,51 . Поэтому порой для округления лучше использовать Format :
MsgBox Format(2.505, «#,##0.00»)
но в этом случае мы получим не число в чистом виде, а текст. И если нужно именно число, то придется производить дополнительные преобразования:
MsgBox CDbl(Format(2.505, «#,##0.00»))
Так же, для математического округления, можно использовать и такой вариант:
MsgBox Application.Round(2.505, 2)
Но здесь стоит учитывать, что это не чистый VB и этот метод сработает только в Excel, т.к. по сути мы обращаемся к встроенной в Excel функции округления ОКРУГЛ (ROUND) , которая применяет именно математическое округление.
Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.
Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum
Источник
Округление значений в коде VBA в Excel. Функции int () и fix().
Очень часто при создании алгоритмов подсчета тех или иных значений полученные результаты имеют значение десятичной дроби с большим количеством знаков после запятой. Работать с такими данными и отображать их не очень удобно и некрасиво.
Рассмотрим какими функциями следует округлять данные в коде vba Excel.
Первый способ округления при помощью функции int().
Данная функция выводит целое значение до запятой. При округлении отрицательных чисел int округляет десятичную дробь до большего целого значения.
Например: число Пи с минусом после округления — int (-3.1415926535 ) будет равно 4 (четырем целым).
Второй способ округление при помощи функции fix()
происходит аналогично с int . Отличается эта функция тем, что округляет отрицательные числа до меньшего значения. Так округлённое число Пи со знаком минус будет fix( -3.1415926535) = 3.
Если требуется не просто убрать дробную часть, а округлить до целого числа, можно использовать следующую функцию cint().
Пример:
Cint(fix( -3.1415926535)) = 3
Cint(int( -3.1415926535)) = 3
Как округлять до десятых и сотых (один и два знака после запятой, соответственно).
Для округления до десятых следует умножить переменную на 10 (десять), после чего округлить до целых и разделить на 10 (десять).
Пример:
Cint(int( -3.1415926535*10))/10 = 3.1
Cint(fix( -3.1415926535*10))/10 = 3.1
Для округления до сотых следует проделать ту же самую операцию, только умножать и делить не на 10, а на 100.
Пример:
Cint(int( -3.1415926535*100))/100 = 3.14
Cint(fix( -3.1415926535*100))/100 = 3.14
Пример кода округляющего значения из textbox, запускающийся нажатием кнопки CommandButtom1:
Private sub CommandButtom1_click()
textbox2.value = Cint(int(textbox1.value *100))/100
END SUB
Видео с примером работы макроса:
Как видите, ничего сложного в округлении чисел в vba Excel нет. Удачи Вам в изучении программы
Округление значений в коде VBA в Excel. Функции int () и fix().: 1 комментарий
Cint(int(-3.1415926535*100))/100 = 3.1
А это надёжно? Я вместо сотней поставил 1000 и в одном из случаев произошла ошибка переполнения. Опять поставил сотни.
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Источник
Excel vba округление
Функция ОКРУГЛ (ROUND) в Excel
Смотрите также: =ОКРУГЛТ(_число_;0,5)Guest быстрее. чем WorksheetFunction.Round(X, математическим правилам, а 2,30Хм. как интересно!1,26449 ->1.26 2 2 2 по нему :-) & .Address & есть не надо
Вообще эта проверкаКазанскийНо будьте осторожны справке. макросы, которые выполняют но используя доступную
Синтаксис функции ОКРУГЛ
Функция ОКРУГЛ в Excel
Denis Ch
: Function My_Round(ByVal X N): по банковским. Я и неи никак иначе! 1,5 2 2 Соответственно, это обстоятельство «>0,ROUND(» & .Address
коробок? не нужна. Если: Принцип такой
— данное действиеНажмите сочетание клавиш операции округления чисел. в VBA функцию округляет значения до: Уважаемый ZVI, подскажите
Public Function ZVI_Round(X
- В частности:
- знал, что ROUNDИ в руссифицированном 2 1,75 2
- — основной фактор & «,0),»»»»)»)Будем иметь вместо
- число целое, тоapplication.roundup(64.24,-1) уже НЕОБРАТИМО, поэтому
CTRL+C Как вы можете Round(). Чтобы посмотреть указанного количества разрядов, пожалуйста, а как ByVal N As
Полезная информация
- As Double, OptionalRound(1.5)=2, ничего необычного; у нас такая Excel функция ОКРУГЛ(1,265;2)
- 2 2 2 различия при малых
- .Replace 0, «часть неотправки «часть места» оно и округлится
- А дальше зависит испытывать советую на
- На листе выделите видеть, результат, возвращаемый
- соответствующий код макроса т.е. знаков до реализовать функцию аналогичную Integer = 0)
Примеры использования функции ОКРУГЛ в Excel
- N As IntegerНо Round(2.5)=2, а шибко умная! ) даст вам значение 2 2 2
- временах (от 0-2 места», xlWholeПохоже без цикла до себя самого. от того, как КОПИИ книги. ячейку A1 и макросом, может полностью для пользовательской функции
- или после запятой. ОКРУГЛВВЕРХ с помощью As Double = 0) As не 3, как Полез в Сеть 1,27. 2,25 3 3 сек при использованииEnd With никак.
Округление до целого числа функциями ОКРУГЛ и FormatNumber в VBA
задать столбец, естьik нажмите сочетание клавиш отличаться от ожидаемого. нажмите комбинацию горячих Например, при помощи VBADim B As Double обычно ожидается. за разъяснениями:
Разный результат округления в Excel и VBA
А в американском 3 2,5 3
ScreenUpdating=False)End Subdl хочется:
ли в нем: можно так: CTRL+V.Как уже выше упоминалось, клавиш ALT+F11: нее можно округлитьMCH DoubleDim b#Упрощенно, для одного1. Гипотеза, почему VBA, «Round» - 3 3 2,752) Поскольку ZVIdl: Sub Test1()If Not Int(MyCartonsCell.Value) формулы или только=сумм(округл(A1:A10;2))Чтобы переключиться между один алгоритм неВ Module1 прописан код числа в ячейке: как вариант:
десятичного знака правило
Функция ОКРУГЛ и Round VBA округляют по-разному?
так странно ведёт 1,26. 3 3 3 использовал масщтабирование с: увы недосмотрел, всёDim Rng As = MyCartonsCell.Value Then константы, есть липрим. просмотром результатов и является лучше или пользовательской макро-функции. А2 с двухFunction MyRoundUp(V As 0 ThenIf N
округление VBA
——,
в моем кодеSet Rng =
With Rng Лузер, Владимир. точности (число значащих
макрос для создания формул.
удивляет результатами. сторону. То естьОКРУГЛ(число; число_разрядов)
* 10 ^
Int(Abs(X) / BZVI_Round = Round(X округления при суммировании
(см. раздел ‘Theпост старый, номожет для x придется смещать и .Range(.Cells(2, 1), .Cells(.Rows.Count,.Replace 0, «=»»пусто»»»,Буду менять. цифр в дробной динамическиой диаграммы, все1
Жаль, что эти два
2,5 округляется доROUND(number, num_digits)
DecPlaces) / 10 + 0.5) + Sgn(X) * большого количества чисел.
Round() Function is пусть не вводит
Спасибо. уменьшать rng)
арботает но он2 алгоритма были реализованы
3; 10,345 до
В качестве аргументов функции ^ DecPlacesEnd If
2.222E-16, b) Это удобно банкам,
Inconsistently Implemented’, где в заблуждение тех,
3) В итоге,End With
Set Rng0 =: Вполне приличный код,Функция округляет числа. Как3
одновременно, кроме того,
10,35 и т. ОКРУГЛ могут выступать
End IfEnd FunctionEnd If но знают ли
написано, что в кто его читает: Есть столбец А,
мои результаты были
.SpecialCells(xlCellTypeFormulas, 2) nataLi, если учесть
Round сделать чтобы не4
довольно хаотичным образом.
д. Это именно числа, текстовые представленияEnd Functionk61If Abs(ZVI_Round) = об этом их VB6/VBA применяется т.н.
в котором есть обусловлены: а) отсутствием.Replace 0, «»,.Replace «=»»пусто»»», 0,
(Number,2) эквивалентна функции округлял. Вот код:
5 Возможно было бы то правило, которое чисел, ссылки на
ZVI: фото средств измерения
0 Then ZVI_Round клиенты?
‘банковское округление’, цельМой вариант функции самые разные цены. нечисловых значений и
xlWhole xlWholeМассив небольшой, заFormat(Number,»#.##»)Private Sub Worksheet_Change(ByValA B более естественным, если мы выучили в ячейки с числовыми: ‘ZVI:2012-02-09 VBA ROUNDUP упомянутых, и не
= 0
’ Проверка VBA-
которого — как
округления:
Эти цены нужно
б) сравнительно низкой
Set Rng0 =
.Value = Application.Round(.Value, скоростью гнаться неВозвращаемое значение Target As Range)
Формула Описание (результат) бы функция VBA школе, и тот данными, а также
function упомянутых, выше.End Function округления
написано двумя разделами’Функция правильного математического округлить в большую долей времени на .SpecialCells(xlCellTypeBlanks) 0)
нужно, поэтому ВашВ результате действия функцииConst DropDownList =
=ОКРУГЛТ(10; 3) Округляет Round() возвращала тот результат, который ожидало
формулы и функции.Function ZVI_RoundUp(V AsСлева направо: [Железый]Прилагаю таблицу сравнительногоSub Нюансы_округления() выше — минимизировать округления ‘1.260 ->
сторону так чтобы, выбор диапазона.Value = Application.Round(.Value,.Replace 0, «часть вариант округления годится. возвращается округленное число,
же результат, что бы получить большинство Оба аргумента обязательные. Double, Optional DecPlaces Феликс (серийный номер
тестирования скорости выполненияMsgBox «Round(1.5)=» & ‘bias’, ошибку, набегающую
1.26 ; 1.265 они заканчивались на
Михаил С. 0) места», xlWhole Можно немного переделать: тип которого совпадаетConst DataRange =
ближайшего числа, кратного и экселевская функция из нас.Число As Integer = — Г89573), логарифмическая 3-х вариантов. Round(1.5) & vbCr при сложении нескольких -> 1.27 ; 9 (столбец В).: Маленький офтоп. Если.Replace 0, «частьEnd WithSub Test1() с типом переданного «$A$26:$M$32″ 3 (9) ОКРУГЛ (в конце
В случае использования доступных(number) – значение, 0) As Double
линейка, счёты (mini).— _
округляемых чисел). 1.268 -> 1.27 Можна ли это
кому интерсно - места», xlWholeRng0.Replace «часть места»,Dim Rng As аргумента
Const ChartRange ==ОКРУГЛТ(-10; -3) Округляет концов, в английской в VBA функций, которое требуется округлить.Dim x#Всё поддерживается в
ZVI
& «Round(2.5)=» &Вот такие интересные Function RoundMath(Tochn As как-то автоматизировать и
результаты теста изEnd With 0, xlWhole Range, Arr(), rПараметры «B24:M24″
число -10 до версии Excelя, она (кроме Round ()Число_разрядовx = Fix(V
исправном состоянии наZVI
Round(2.5), _
результаты.
Double, iR As написать макрос. post_61633.xls на разных
Rng0.Replace «часть места»,
End Sub As Long
NumberDim NewData As ближайшего числа, кратного называется также - это также CByte(num_digits) — количество * 10 ^ случай энергетического каллапса.
: —vbExclamation, «Crazy VBA
Кстати, ROUND - Integer) As Double
Пример задания: есть операционках и версиях
0, xlWholeZVI
Set Rng =Обязательный аргумент может представлять
Variant 3 (-9)
ROUND). (), CInt (),
разрядов, до которого DecPlaces)
Прикрепленные файлы post_200817.jpgПрошу исправить, должно
round» не единственная функция
Dim Rounded As 5,02 нужно получить
Excel. (Комп одинEnd Sub
: А чем цикл Лист1.UsedRange.Columns(1)
любое допустимое числовое
Dim OldData As=ОКРУГЛТ(1,3; 0,2) Округляетalexcel
CLng () и необходимо округлить аргумент
If x <>
(88.6 КБ)
быть:End Sub
с ‘банковским округлением’ Double, HTochn As 5,09; 6,18 -
и тот же.)ZVI
не мил? МожетIf Rng.Cells.Count =
выражение Variant
число 1,3 до: Есть кусочек кода: CCur () )число
V * 10
ZVI
Function ZVI_Round(x, Optional
Интересно, что многие
в VB6 и
Double, TTochn As
6,19; 74,54 -Верунчик: 1) Если речь быть, тем, что 1 Then ExitNumDigitAfterDecimalDim AnimationArray As ближайшего числа, кратногоIf UserForm2.CheckBox1.Value =
используется алгоритм, называемый
(number). ^ DecPlaces Then: Слишком просто было
N = 0)
публикации ошибаются относительно
VBA! Вот остальные: Double Dim HTochnCroped 74, 59; 11,19: Я делю одну о кодах до в раз 6-7 SubНеобязательный аргумент, представляющий собой
Variant 0,2 (1,4) True Then
банковским или методом
Аргумент
x = x
бы :-) As Double
математического метода округления
CByte, CInt, CLng,
As Long, TTochnCroped
— 11,19; 150,0
ячейку на другую.
поправки «часть места»,
быстрее не цикла?
Arr() = Rng.Value
целое положительное число,Dim OldPoint As
=ОКРУГЛТ(5; -2) Возвращает
Cells(i, 9).Value =
Гаусса. Здесь «половинки»
число_разрядов
+ 1
Подправил в ВашемDim b# в VBA, и CCur. As Long, IDelta
— 150,09 и Данное значение присваиваю
указывающее, сколько знаков Long сообщение об ошибке, Cells(i, 9) / округляются раз в(num_digits) может быть:ZVI_RoundUp = Round(x
Round
Функция Round
b = Fix(N) даже коммерческие программы
Але-Дашкова As Integer HTochn т.д. переменной. Как мне в XL2007 наИ это еще 2 To UBound(Arr)
следует оставить послеDim NewPoint As т. к. число 5
Положительным – округляется дробная / 10 ^ MyRound, чтобы всеIf N
VBA — округление — просьба глянуть код
большое спасибо. переменной все время разница незаметна, а
использован медленный FormatNumber 1)) опущен, то дробнаяDim x As
имеют разные знаки Int(Cells(i, 9)) сторону, всегда к
(справа от запятой). 1) ноль. А теперь
b = 10 принося тем самым
как написать программу, TTochn = HTochnIgor_Tr в большую сторону?
в 5000 строкGuest
Case 2 To часть отбрасывается Integer (#ЧИСЛО!)
Cells(i, 9).Value = ближайшему четному. ПоэтомуРавным нулю – значениеEnd Function сравните оуругление до ^ -b кому-то убытки, а округляющую число до * 10 HTochnCroped: А чем не
Подскажите пожалуйста. И
вариант без цикла: 1) Если речь 6
ПримерDim i AsMarchuk Cells(i, 9) * 5,5, как и округляется до целой
ZVI
3-знака =ZVI_Round(X;3) иZVI_Round = Round(x кому-то неожиданную прибыль.
двух знаков после = Fix(HTochn) TTochnCroped подходит простенькая функция
заранее спасибо! на 20%-30% быстрее. о кодах до
Arr(r, 1) =Dim A,retval A=123.456789 Integer
: вот я не 5
в случае использования части.: Для полного диапазона
=My_Round(X;3)
/ b +Более точно определение
запятой. Программа должна = HTochnCroped *
RoundUpВерунчик
2) Если речь
поправки «часть места»,
CDbl(FormatNumber(Arr(r, 1), 0))
retval=Round(A) ‘возвращается 123Dim p As внимательный :(
End If экселевской функции, будетОтрицательным – округляется целая
отрицательных DecPlaces, правильнее. X. ZVI_Round. My_Round x * 1E-16,
банковского округления можно использовать функцию Int. 10 IDelta =?: Округлять до какого
о коде предложенном то у меня
End Select retval=Round(A,3) ‘возвращается 123.457
DoublealexcelЯ так округляю округлено до 6.
часть исходного значения
так, с использованием
0,0785 .. 0,079 0) * b прочесть здесь:
Igor_Tr
TTochn — TTochnCropedNewStudent07 какого знака после DL, то у
в XL2007 наNextКатегорияIf Target.Address =: вот я не
числа до ближайшего
Однако VBA поступит (слева от запятой). ZVI_Round, приведенной выше:
.. 0,078Else
Реализация (на мой: У Вас уникальная If (IDelta >=
: А как ее
запятой? меня в XL2007
примере используемом здесьRng.Value = Arr()
Математические функции DropDownList Then
внимательный 🙁 числа кратного 5
иначе, например, с
Если в качестве аргумента
’ZVI:2012-02-09 VBA ROUNDUP
0,5115 .. 0,512
ZVI_Round = Round(x взгляд, не очень способность поднимать настроение.
5) Then Rounded
надо преминить, чтобыЕсли округлять до
на примере используемом
разница незаметна, аEnd SubNatali
SelectedItem = ActiveSheet.Range(DropDownList).Value
Спасибо очень полезнаяно строка Cells(i,
числом 2,5 -
число_разрядов function
.. 0,511 + x * оптимальная) разных видов Тоже, там же, = ((HTochnCroped + получилось то, что
целого, то чему здесь разница незаметна, в 5000 строкlapink2000: Добрый день, уважаемыеSelectedItemRow = WorksheetFunction.Match(SelectedItem,
функция я о
9).Value = Int(Cells(i, оно будет округлено(num_digits) подставить нецелое
Function ZVI_RoundUp(V As0,5035 .. 0,504
1E-16, b) округления, на английском и через Enter.
1) / (10
надо?? равно 4 /
а в 5000 вариант без цикла
: Еще вариант без форумчане.
ActiveSheet.Range(DataRange).Columns(1), 0) + ней не знал. 9)) не округляет до 2, а
число, то при Double, Optional DecPlaces
.. 0,503
End If здесь:
Вот только проблема.
^ iR)) Else
Igor_Tr
2 ? 2
строк вариант без
на 20%-30% быстрее. цикла:
Написала процедуру для
ActiveSheet.Range(DataRange).Row — 1 Чем больше узнаю
а просто убирает
не до 3! расчете Excel отбросит As Integer =
0,0195 .. 0,020
If Abs(ZVI_Round) =
— Значения типа Integer
Rounded = (HTochnCroped: Обычная фукция листа
или 3?
цикла на 12%-17%
2) Если речьSub Test1() автоматического округления кол-ва
NewData = ActiveSheet.Cells(SelectedItemRow, Excel, тем больше дробную часть.Подскажите чтоЯвляется ли банковский алгоритм дробную часть.
0) As Double .. 0,019
0 Then ZVI_RoundZVI
— ЭТО ЦЕЛОЕ / (10 ^
Excel. Справки -Казанский
медленнее. о коде предложенном
Dim Rng As
коробок (во вложении 2).Resize(1, 12).Value удивляюсь его возможностям.
вписать в код,
плохим? Само применение
В Excel есть иDim x#
0,0135 .. 0,014 = 0
Sh_Alex ЧИСЛО. И зачем
iR)) End If полный глобус. В
:Наверное, зависит от
DL, то у
Range файл)
OldData = ActiveSheet.Range(«B24:M24»).Value
Та ты шо. чтоб число округлялось банковского алгоритма не другие полезные функцииx = Fix(V .. 0,013End Function
: В дополнение к тогда округлять то, RoundMath = Rounded
VBA это будетShersh теста, может, и меня в XL2007With ThisWorkbook.Worksheets(«Лист1»)Задача была следующая:AnimationArray = NewDataalexcel по матиматическим правилам(1,5=2 является чем-то необычным, для округления. Вот
* 10 ^0,0115 .. 0,012Откорректированый вариант таблицы изложенному ZVI. что и так End Function выглядеть так:, 4/2=2 от версии Excel. на примере используемом
Set Rng = округляем данные поFor i =
: Немогу понять где а не 1 а тем более некоторые из них:
DecPlaces) .. 0,011 прилагаетсяПриведенный способ банковского
круглое?
d_Boba
Где 2 -округлять до целогоПриложил тестовый вариант здесь разница незаметна, .Range(.Cells(2, 1), .Cells(.Rows.Count, следующим правилам:
1 To 15 собака зарыта . и т.д.)
плохим. Так какОКРУГЛТ — округляет доIf x <>0,8115 .. 0,812— округления, применяется вКазанский: по поводу законов число после запятой, числа. все время с исходными данными, а в 5000
1).End(xlUp))
Если значение являетсяp = 100 Помогите. Во вложении
Спасибо.
в зависимости от соседнего кратного. V * 10
.. 0,811
ZVI геодезии с незапамятных
: x=123.456 x=int(x*100)/100Но это
округления чисел: на которое останется. в большую сторону. на которых сравнивал
строк вариант безEnd With
integer — пропускаем,
/ 100 /
файл там всёGuest применения он имеет
ОКРУГЛВНИЗ и ОКРУГЛВВЕРХ —
^ DecPlaces ThenGuestГость
времен, по-видимому, с
отбрасывание разрядов, а эту тему есть,NewStudent07
Верунчик
время разных вариантов.
цикла на 12%-17%Rng.Value = Application.Round(Rng.Value, все ОК 15 * i
подробно описано.: Application.RoundUp(3.5, 0)
свои существенные преимущества.
округляют в меньшую
x = x: Да, скорее My_Round: Последний вариант ZVI_Round() тех, когда и
не округление. Додумайте
как ни странно,: Главный вопрос в
: Так как все
медленнее.
0)Если значение -For x =
VikNik
округляем вверх 3,5
Стандартное округление (всегда или большую сторону.
+ 1 — это только
неправильно отрабатывает округление банков (в современном
сами, как сделать разные мнения. одно
том, как сделать
Верунчик приведенные нецикловые варианты
lapink2000
End Sub дробное число, то: 1 To WorksheetFunction.Count(NewData): Правильно округляет! , 0 знаков в большую сторону)ЦЕЛОЕ — округляет доZVI_RoundUp = ZVI_Round(x алгоритм :( числа 0,5. понимании) не было.
округление (добавить 0.01, — то которое так, чтобы число, делим a на выдают ошибку на: Последний пост -ytk5kykyесли значение =0.005) школе, ДРУГОЕ написаноПример задания: есть worksheetfunction.RoundUp(a/b,0) при повторном запуске,ytk5kykyНе увидел в значение на словаNewPoint = NewData(1,
просто Round. ВотMarchuk с большим числом
Почему MS неZVI округления при математическойАпострофф в справочниках по 5,02 нужно получитьVlad999 то в тестовых
: По умолчанию кажется, Ващих кодах выполнение «часть места» x) тебе просто Round: sorri, up округленных таким методомЧЁТН и НЕЧЁТН —MCH привела правила округления: Все верно, вроде обработке геодезических измерений.: Спокойствие, округляем через математике (например Корна). 5,09; 6,18 -: данных исключил значения,
что без цикла условия: если значениеиначе округляем поAnimationArray(1, x) =
нужен.New значений, приводит к округляют до соседнего: =ZVI_RoundUp(2,2;2) = 2,21 к общему знаменателю, исправлял. По крайней А вычисления, ещеInt они действительно отличаются. 6,19; 74,54 -Казанский меньше единицы. У быстрее должно быть.
Округление
— 11,19; 150,0Казанский в 6-7 раз забыть в конце слова «часть места» но в одном p RoundDown
WorksheetFunction.RoundUp(Cells(i, 9), 0) пример:
В следующем примере показано=ZVI_RoundUp(128,717;3) = 128,718 — работают по вариант 🙂 Вот
«таблиц семизначных логарифмов» Round2 = Int(d учитывать машинное представление — 150,09 и: вариант x =
медленнее. цикла next илиZVI месте (число 5,6)
Next xCells(i, 9) =alexcel
Здесь то же самое, действие функции ОКРУГЛи т.п. ПРАВИЛЬНО, правильный вариант арифметического Вега и конторских
* 100 + чисел. если кто т.д. CInt(a / b
Опять же замечу, loop поставить.: Вы в таможне отказывается округлять.Range(ChartRange).Value = AnimationArray WorksheetFunction.RoundDown(Cells(i, 9), 0): О спасибо
что и в с отрицательным, положительнымMCHа VBA.Int и округления, заодно привожу счетов, альтернативой были 0.5) / 100 хочет порисуйте 0Igor_Tr + 0.5) что для конкретнойИщи потом его. не работали, часом?Да и вообще,DoEventsЛюбовьMarchuk первом примере. Округлено и равным нулю: Оказывается VBA Round() VBA.Round — извращенцы еще одну функцию «шестизначные таблицы тригонометрических End Function и 1 особеннно: То-есть Вам нужноКазанский задачи разница во:-) Хотел часть груза хотелось бы узнатьNext i: Здравствуйте! У меня: есть у меня каждое из чисел, вторым аргументом. в отличии от ? для округления с функций» Петерса иIgor_Tr интересны те которые последнюю цифру 9?, такой вариант имеет времени не имеетZVI припрятать. Ладно, вот ваше мнение поEnd If вроде бы элементарный такая функция а затем суммированыВ данном примере в =ОКРУГЛ() не работаетОтвет optional. заданной точностью: железный «Феликс».: Извиняюсь, заклинило. после запятой. честно А просто последнюю право на жизнь? значения т.к. абсолютное: Не Станиславский, но он: коду, может, есть
End Sub вопрос, но ответа=ОКРУГЛТ итоги. Полученные итоги качестве первого аргумента
с отрицательным числомGuest
’ ZVI:2009-06-02 VBAС уважением, Александр.
Округление в большую сторону, чтобы число заканчивалось на 9
Але-Дашкова я сам не заменять на 9?Илья9 время мало для Не верю! ПроSub Test1() какие-то подводные камниКазанский найти не могу.=ОКРУГЛТ(102;5) оеругляет число сравниваются с итогом,
используется другая функция разрядов, поэтому MyRoundUp: To k61 arithmetic rounding functionНостальжи: Спасибо всем большое! буду в этоNewStudent07
: любого из приведенных
припрятанный груз толькоDim Rng As с этим округлением.: Какие числа округляются? Помогите пожалуйста.
102 до кратного который бы получил Excel. Формула сначала нуждается в доработке:. помню приходил
’ Arguments are: Эх, а какbabeta впрягаться но кому: Да, последнюю нужноVlad999
вариантов на требуемых Вы и не Range, Arr(), r
А то привезу В коде округленияВ таблице Excel 5. если бы не
суммирует значения вFunction MyRoundUp(V As в мамину контору the same as здорово было считать: как округлить значение интересно — может 9, а как
, нет, в CInt данных. По-моему, ошибки забыли :-) As Long 1,5 коробки или
нет. Может, надо мне нужно сложитьНо почему-то у округлялись числа. Как
диапазоне A2:A4, а Double, Optional DecPlaces и мне разрешали for WorksheetFunction.Round(V,DecPlaces)
на счётах нормы так чтобы не порисовать. я за заменять. и CLng неявно на «часть места»ytk5kykySet Rng = 0,005 коробки. Не поменять формат ячеек два числа 858,52+814,53=комп.выдает меня не работает. видно, при применении затем округляет полученный
As Integer = покрутить Феликс !’ Функция, аналогичная естественной убыли товаров! была погрешности в компьютерами уже 25Igor_Tr
присутствует Round, а нецикловых вариантов при
: То груз, а Лист1.UsedRange.Columns(1) хотелось бы. или подписей диаграммы
1673,06.(округляет). Дело вMarchuk
Не правильно работает функция ROUND() в VBA Access
банковского алгоритма округления результат до одного 0) As Double
. =ОКРУГЛ(число;число_разрядов) А «Феликс». сумме, надо написать лет наблюдаю и
: Обычными функциями работы эта функция производит повторном запуске (случайном, то next.
If Rng.Cells.Count =Спасибо, и убрать в том, что, если
: ОКРУГЛТ
чисел, используемого в
знака после запятой.If DecPlaces >=ZVIFunction ZVI_Round(V As
Всё ушло, всё ROUND а потом почти все их
с строками. Можно «банковское» округление, т.е. например) — этоlapink2000 1 Then Exit
Natali Параметрах галку «точность установить 3 знака
См. также
VBA, полученный итогФункция ОКРУГЛ может быть 0 Then: Сначала был Visual
Double, Optional DecPlaces
умчалося в невозвратную не помню
«ошибки» имеют объяснение. так: в сторону ближайшего бОльшая проблема для: Для плюрализьму. Вот Sub: Неужели? Никто? Никогда как на экране»? после запятой, тоВозвращает число, округленное является намного более использована в ExcelIf Round(V, DecPlaces) Basic (VB), а As Integer = даль. Igor67grom34N = cells(x,y).value четного: Код ?round(1.5) пользователя, чем время. этот вариант «безArr() = Rng.Value не поможет?Кстати, ответ будет 1673,055. с желаемой точностью. точным к «оригинальному» и в формулах = V Then затем уже VBA. 0) As Double(Сейчас дедушка Мазай
: . : Не правильно работает ‘ dim N 2 ?round(2.5) 2слэн цикла» у меняFor r =VovaKp = 100 Т.к. мне нужноЕсли данная функция итогу. Это происходит массива. К примеру, MyRoundUp = V:В VB изначальноIf DecPlaces
Округление числа до 2 знаков после запятой
ошибки, возникающие в их и возвращает V * 10 логично. Но возникло * 10 ^ разбавим тему VBA-кодом. округляют до 2 (НЕПРАВИЛЬНО) должно быть
1, 1), 9, отрицательных чисел: Sub UsedRange, сделано это мудрёнее в написании > 0 AndDim rgFinish As » задать точность всем ясно, что выберите команду Надстройки. результате округления. результат. ^ DecPlaces Then
противоречие между округлением -DecPlacesВообще-то я хотел знаков, пересчет валюты 1.27 1, 1)))Если не test() Dim i сознательно для повышения
округление
ПОЧЕМУ. секрет — а Debug.Print , «RoundUp», надежности для случаевSub Test1() 0.5 Then конечных данных
на какую нибудь 6. Помогите пожалуйста.
выберите Пакет анализа что в ExcelеОкругление – экселевские причуды Exit Function Excel, видимо, посчитали,ZVI_Round = Round(V как округлять в не маловажно знатьМожет написать свою для чего такое? «-Int(-i)», «CInt(i + если установлен фильтр,Dim Rng As
Arr(r, 1) =Dim lLastRowInfoGTD As
кнопку на панели
С уважением, Любовь и нажмите кнопку выполнено простое разделение: и несоответствия одной
End If что так как + V * VBA аналогично Excel?” по какому правилу,
функцию округления, если Что за магическое 0.5)»; vbLf; String(50, скрытые или полу-пустые Range, c As
«часть места» Long ‘ счетчик быстрого доступа или
Казанский OK.
экселевские функции используют из «причуд» Excelя,MyRoundUp = -Int(-V это разные объектные
2E-16, DecPlaces)Имея в виду или для чего эта глюкавая. число 9? «-«) For i
ячейки (обсуждалось).
String
Else для диапазона новую вкладку?
: Параметры — ТочностьВыполните инструкции программы один алгоритм, а которая может вызвать * 10 ^ модели с разнымиEnd If некую функцию MyRound(X, Вам необходимо округление.
Спасибо всем.Забыл спросить. Почему = -3 ToНо если, например,With ThisWorkbook.Worksheets(«Лист1»)Arr(r, 1) =Dim MyCartonsCell AsHugo
как на экране. установки, если это
функции VBA -
некоторую путаницу, если DecPlaces) / 10 библиотеками, то так
If Abs(ZVI_Round) = N)
Английский и русскийgrom34
разделитель целое/дробь -
3 Step 0.25 помимо тестовых данныхSet Rng = CDbl(FormatNumber(Arr(r, 1), 0)) Range ‘ для: Записать макрос неHugo необходимо. другой. Это было о ней не
^ DecPlaces логичнее. 0 Then ZVI_Round
где X – вариант.: Функция работает правильно. запятая? Не будет Debug.Print i, WorksheetFunction.RoundUp(i,
на листе где-то
.Range(.Cells(2, 1), .Cells(.Rows.Count,
End If округления коробок пробовали?
: Округляйте слагаемые 858.52Синтаксис бы все равно знаешь — этоEnd FunctionЧто касается Int(), = 0 ‘
округляемое число,=ROUND(A1;2) =ОКРУГЛ(A1;2) На самом деле ругаться Excel? В 0), -Int(-i), CInt(i далеко внизу будет 1).End(xlUp))End SelectDim Cell AsSub Macro1() и 814.53.ОКРУГЛТ(число;точность) странным, но, по
применение программой двух
ZVI то к ней Exclude -0 returnа N –Округляет число до при округлении, когда
моей локализации - + 0.5) Next какое-нибудь значение, то
End WithNext
Variant, i As’
Или поставьте вЧисло — округляемое крайней мере, имело разных алгоритмов округления
: Да, погорячился я нет претензий. Проблемы value количество разрядов округления,
указанного количества десятичных на конце 5, это ошибка (нужно
End Sub Код UsedRange прихватит много
c = Rng.Address(,Rng.Value = Arr() Long’ Macro1 Macro настройках «точность как
значение. бы какую-то внутреннюю чисел. Далее обо немного :-) возникают из-за способа
End Function как в Excel разрядов (по правилам
округлять положено по точку). RoundUp -Int(-i) CInt(i пустых ячеек, что
, , True)End Sub
lLastRowInfoGTD = ThisWorkbook.Worksheets(«Лист1»).Cells(Rows.Count,
’ Macro recorded на экране».Точность — точность,
согласованность. К сожалению, всем по порядку.А в варианте представления Double чисел:’ ZVI:2009-06-07 VBA (положительное, отрицательное или
математики). принципу: итоговая последняяNewStudent07 + 0.5) ————————————————— будт прилично тормозить.
With Rng
lapink2000
1).End(xlUp).Row 14.09.2011 by Hugo
The_Prist с которой требуется
программисты Microsoft поПоследствия существования «причуд» на Михаила (MCH) проблемыGuest
rounding to the
ноль).babeta цифра должна быть
: Igor_Tr, огромное спасибо!
-3 -3 -3 Это повлияет на.Value = Evaluate(«IF(«
: Мой вариант:
Set rgFinish =’: А у меня
округлить число.
какой-то причине были
рисунке ниже: с отрицательными числами,
: ZVI, спасибо за desired multiple
Сразу напрашивается: WorksheetFunction.Round(X,: спасиба, но что ЧЕТНОЙ — вот
Нет, не секрет.
-2 -2,75 -3
результаты. Для сравнения & .Address &
Sub Test1() ThisWorkbook.Worksheets(«Лист1»).Range(«A2:A» & lLastRowInfoGTD
’ с Вашими числамиЗаметки очень непоследовательными и,
Как вы можете видеть
например с: пояснения и Вашу’ Like Excel
N), но это
вы называите «мастер он так и На магическое 9
-2 -2 -2,5
методов правильнее приводить «>0,ROUND(» & .Address
Application.MaxChange = 0.001 получается не 1673,055,ОКРУГЛТ производит округление например, в других
на рисунке, результаты-0,0785
UDF. function =MROUND(Value, Multiple) медленная функция, так функций» может напишите округляет. Если хочешь, должны заканчиваться цены -3 -2 -2 коды к единому & «,0),»»»»)») Rangei = 2
ActiveWorkbook.PrecisionAsDisplayed = True 1673,05
с избытком. Округление функциях VBA, таких округления (и итоги)
-0,5115Александр
from Analysis ToolPack как относится к англиский вариант :)) как ты сказал
в магазине))) -2,25 -3 -2
виду выделения диапазона,.Replace 0, «частьWith ThisWorkbook.Worksheets(«Лист1»)For Each CellEnd SubВывод: у Вас
производится, если остаток
как FormatNumber или СУЩЕСТВЕННО ОТЛИЧАЮТСЯ!-0,5035
: У меня проблема.
Add-In классу Application.Guest (5 всегда округляетIgor_Tr
-2 -2 -2
чего я не места», xlWholeSet Rng =
In rgFinishSub Macro2() изначально слагаемые имеют от деления числа
Format (при форматированииВсе что было сделано,
-0,0005 Нужно округлить число’ Функция, аналогичнаяИзящная функция попалась
: Есть такой знак вверх), то прибавь: А магазин «ХИМТОВАРЫ»?
-2 -2 -1,75 сделал, а простоEnd With .Range(.Cells(2, 1), .Cells(.Rows.Count,
Cell = Format(Cell,’ большую разрядность, чем
на точность больше
чисел с использованием так это округлено-0,0025 в середине формулы. =ОКРУГЛТ(число;точность) когда-то мне в
— fx /вставка округляемому 0,005, умножь
nadmin -2 -1 -1
использовал исходные данныеEnd Sub 1).End(xlUp))
«#,##0», «0»)
’ Macro2 Macro Вы видите в
или равен половине этих функций в каждое из чисел,-0,0194
Например:
Function ZVI_MRound(V As
Интернете: функции-, при нажатии на 100, отдели: И совсем не
-1,5 -2 -1 без каких-либо изменений.lapink2000End With
Range(«A» & i).Value’ Macro recorded ячейках. Есть два точности. зависимости от выбранного
а затем суммирование-0,0195((2,8-2,1)/0,8)*25
Double, Optional MultipleFunction MathRound(X As активизируется мастер функций. целое и раздели правильно! -1 -1,25 -2lapink2000: Пардон, одна строка
With Rng
= Cell 14.09.2011 by Hugo
пути: формулой приПример
формата также может их. В первом
-0,0135мне нужно значение
As Double = Double, Optional N
Pavel55 на 100.
Кто вам сказал, -1 -1 -1
: Все очень просто, лишняя :-).Value = Application.Round(.Value,i = i + 1
’ сложении округлять
Чтобы этот пример происходить округление) используется случае (столбец B)
-0,0115 ((2,8-2,1)/0,8) округлить до 1) As Double As Integer =
: меню Вставка -А как вообще что при округлении
-1 -1 0
и ZVI этоSub Test1()
0)Next’=ОКРУГЛ(A1;2)+ОКРУГЛ(B1;2) проще было понять,
стандартный алгоритм округления: был округлен с-0,8115 целого числа. Можно
If Multiple = 0) As Double Функция. работает ROUND() число -0,75 -1 0 уже объяснил :-)Dim Rng As.Replace 0, «частьEnd SubApplication.MaxChange = 0.001или сначала все скопируйте его наСледовательно, функция VBA Round помощью стандартной экселевской
-130,223 сделать это в 0 Then ExitMathRound = CDbl(FormatNumber(X,ZVI
По правилам математикидолжно 0 -0,5 -11) Я исходил
Range, c As места», xlWholeytk5kykyActiveWorkbook.PrecisionAsDisplayed = False числа привести к
пустой лист.
(2,5, 0) вернет функции ОКРУГЛ, вои т.п. одной формуле? Function
округление происходит вверх
разделяться на чётное/нечётное?
0 0 -0,25 из того, что String
End With: VovaK, а где
End Sub тому виду, вИнструкции как результат 2, втором случае (столбецНадежнее всего так:
End FunctionОкругление в Excel если следующая цифраПо российским стандартам
-1 0 0 операция разовая и
With ThisWorkbook.Worksheets(«Лист1»)
End Sub
требуемое «часть места»?Игорь котором видите:Создайте пустую книгу
но уже функция
C) – было
Function RoundUp(v As: =ОКРУГЛ((2,8-2,1)/0,8;0)*25 + V *
Она примерно в вполне предсказуемое, т.к. >=5, и вниз математики, округление происходит
0 0 0
что в диапазонеSet Rng =ytk5kyky
NataLi, Вы что: А как округлятьМеню-Параметры Excel-ДОполнительно-Задать точность или лист. FormatNumber (2,5, 0)
использовано написанную в Double, Optional DecPlacesчуть короче 2E-16) / Abs(Multiple),
2.4 раза быстрее
оно выполняеться по если следующая цифра от пятёрки всегда 0 0,25 1 не будет не
.Range(.Cells(2, 1), .Cells(.Rows.Count,: Я тоже так
хотели сказать этим все числа в как на экране.Выделите пример в
вернет как результат
VBA функцию пользователя, As Integer ==ОКРУГЛ((2,8-2,1)/0,8;)*25
0) * Abs(Multiple) WorksheetFunction.Round(X, N) математическим правилам. 1.27,
1 1 1 при тестировании, яEnd WithТолько если у
Удивительно, что оно в большую сторону?
Excel. В 2003 выделяйте заголовок строки здесь логика? делает ничего иного,
RoundUp = WorksheetFunction.RoundUp(v,
: А если округлить 0 Then ZVI_MRound не столь изящно известно, что функция правилам работает ROUND() т.к. следующая за 0,75 1 1
наращивал диапазон, а
With Rng NataLi имеется и у Вас вообщенапример есть 64,24
это где-то в
или столбца.Стоит помнить об этих кроме как только
DecPlaces) нужно до 0,5 = 0 выглядит, но почти
Round() в VBA
a=round(2.305,2) выдает результат
округляемой цифрой, цифра
1 1 1
не кол-во проходов
.Value = Evaluate(«IF(«
так 0? То
как-то работает.
надо 70
Сервис-Параметры-вкладка Вычисления.
Выделение примера в
различиях, создавая свои
округляя указанные числа,
End FunctionКазанскийEnd Function в 10 раз
округляет не по 2,31 а не
= 5
Источник
- Download source — 62.8 KB
Introduction
In many areas, rounding that accurately follows specific rules are needed — accounting, statistics, insurance, etc.
Unfortunately, the native functions of VBA that can perform rounding are either missing, limited, inaccurate, or buggy, and all address only a single rounding method. The upside is that they are fast, and that may in some situations be important.
However, often precision is mandatory, and with the speed of computers today, a little slower processing will hardly be noticed, indeed not for processing of single values. All the functions presented here run at about 1 µs.
They cover the normal rounding methods:
- Round down, with the option to round negative values towards zero
- Round up, with the option to round negative values away from zero
- Round by 4/5, either away from zero or to even (Banker’s Rounding)
- Round to a count of significant figures
The first three functions accept all the numeric data types. They all accept a specified count of decimals — including a negative count which will round to tens, hundreds, etc.
The last exists in three varieties — for Currency
, Decimal
, and Double
respectively.
Those with Variant as return type will return Null
for incomprehensible input.
Background
More than a decade ago, Donald Lessau created a site dealing with Visual Basic issues: VBspeed. One of these issues was to create a replacement for Round
which was (and still is) buggy, though fast. Also, it could (and still can) only perform Banker’s Rounding which may not be what you expect when you look for 4/5 rounding. Several suggestions were put forward, one extremely simple using Format; but string
handling, as it is, is not very fast, so other solutions were thought out, all more or less wrapped around the classic rounding method Int(Value + 0.5)
. They can all be found here.
If you are convinced that Round
is not buggy, just try this simple example:
RoundedValue = Round(32.675, 2)
It will return 32.67
while both a normal 4/5 rounding as well as Banker’s Rounding would return 32.68.
Today, computers are much faster, and while Round
is very fast, it will in many cases be preferable with a function that is a bit slower if it on the other hand always returns the expected result.
So — from these old contributions — I’ve brushed up the old 4/5 rounding function with an option for choosing Banker’s Rounding, and added sibling functions for rounding up or down (also with options) with focus on the ability to correctly handle as wide a range of input values as possible. Still, they run at about 1 µs. Finally, for completeness and because it is quite different from the the other functions, a function for rounding to significant figures was added.
It’s important to stress that there is no right or wrong rounding method, thus it makes no sense to argue why Mid Rounding away from zero is «better» than Banker’s Rounding. What’s important, however, is to know how each method operates and which side effects this may cause, so you can choose the optimum method for the current task.
Examples
It can be useful to list examples that shows the differences between the different rounding methods and how they act upon positive as well as negative values. Here are just a few.
Value n 12.344 12.345 12.346 12.354 12.355 12.356 RoundUp(n, 2, False) 12.35 12.35 12.35 12.36 12.36 12.36 RoundUp(n, 2, True) 12.35 12.35 12.35 12.36 12.36 12.36 RoundDown(n, 2, False) 12.34 12.34 12.34 12.35 12.35 12.35 RoundDown(n, 2, True) 12.34 12.34 12.34 12.35 12.35 12.35 RoundMid(n, 2, False) 12.34 12.35 12.35 12.35 12.36 12.36 RoundMid(n, 2, True) 12.34 12.34 12.35 12.35 12.36 12.36 RoundSignificantDec(n, 4, , False) 12.34 12.35 12.35 12.35 12.36 12.36 RoundSignificantDec(n, 4, , True) 12.34 12.34 12.35 12.35 12.36 12.36 Value n -12.344 -12.345 -12.346 -12.354 -12.355 -12.356 RoundUp(n, 2, False) -12.34 -12.34 -12.34 -12.35 -12.35 -12.35 RoundUp(n, 2, True) -12.35 -12.35 -12.35 -12.36 -12.36 -12.36 RoundDown(n, 2, False) -12.35 -12.35 -12.35 -12.36 -12.36 -12.36 RoundDown(n, 2, True) -12.34 -12.34 -12.34 -12.35 -12.35 -12.35 RoundMid(n, 2, False) -12.34 -12.35 -12.35 -12.35 -12.36 -12.36 RoundMid(n, 2, True) -12.34 -12.34 -12.35 -12.35 -12.36 -12.36 RoundSignificantDec(n, 4, , False) -12.34 -12.35 -12.35 -12.35 -12.36 -12.36 RoundSignificantDec(n, 4, , True) -12.34 -12.34 -12.35 -12.35 -12.36 -12.36
More can be found in the two modules in the code with suffix Test
.
Using the Code
Normal Rounding
The main function — rounding by 4/5 — goes like this. Please note the in-line comments for details:
Public Const Base10 As Double = 10 Public Function RoundMid( _ ByVal Value As Variant, _ Optional ByVal NumDigitsAfterDecimals As Long, _ Optional ByVal MidwayRoundingToEven As Boolean) _ As Variant Dim Scaling As Variant Dim Half As Variant Dim ScaledValue As Variant Dim ReturnValue As Variant If Not IsNumeric(Value) Then ReturnValue = Null ElseIf Value = 0 Then ReturnValue = Value Else Scaling = CDec(Base10 ^ NumDigitsAfterDecimals) If Scaling = 0 Then ReturnValue = Value ElseIf MidwayRoundingToEven Then If Scaling = 1 Then ReturnValue = Round(Value) Else On Error Resume Next ScaledValue = Round(CDec(Value) * Scaling) ReturnValue = ScaledValue / Scaling If Err.Number <> 0 Then ReturnValue = Round(Value * Scaling) / Scaling End If End If Else On Error Resume Next Half = CDec(0.5) If Value > 0 Then ScaledValue = Int(CDec(Value) * Scaling + Half) Else ScaledValue = -Int(-CDec(Value) * Scaling + Half) End If ReturnValue = ScaledValue / Scaling If Err.Number <> 0 Then Half = CDbl(0.5) If Value > 0 Then ScaledValue = Int(Value * Scaling + Half) Else ScaledValue = -Int(-Value * Scaling + Half) End If ReturnValue = ScaledValue / Scaling End If End If If Err.Number <> 0 Then ReturnValue = Value End If End If RoundMid = ReturnValue End Function
To perform the rounding, the value to be rounded is scaled up or down by a power of ten determined by the required number of decimals, converted to Decimal
to avoid bit errors, and an integer rounding is done. If this fails due to the limited range of Decimal
, it falls back using Double
. Finally, the value is scaled back and returned.
Using it requires nothing more than importing (or copy/paste) the module RoundingMethods
included in the zip into your project. Then the functions can be used in a similar way that you would use Round
:
RoundedValue = RoundMid(32.675, 2)
However, by default, it performs a normal 4/5 and optionally Banker’s Rounding.
It is supplemented by the rounding up or down functions:
RoundUp
RoundDown
These act basically like -Int(-n) or Int(n) but also feature an option for rounding away from zero or towards zero respectively (see the example results above).
Rounding to Significant Figures
Rounding to significant figures is somewhat different, though scaling and rounding still is an essential part:
Public Function RoundSignificantDbl( _ ByVal Value As Double, _ ByVal Digits As Integer, _ Optional ByVal NoDecimals As Boolean, _ Optional ByVal MidwayRoundingToEven As Boolean) _ As Double Dim Exponent As Double Dim Scaling As Double Dim Half As Variant Dim ScaledValue As Variant Dim ReturnValue As Double If (Value = 0 Or Digits <= 0) Then ReturnValue = Value Else Exponent = Int(Log10(Abs(Value))) + 1 - Digits If NoDecimals = True Then If Exponent < 0 Then Exponent = 0 End If End If Scaling = Base10 ^ Exponent If Scaling = 0 Then ReturnValue = Value Else On Error Resume Next ScaledValue = CDec(Value / Scaling) If Err.Number <> 0 Then ReturnValue = Value Else If MidwayRoundingToEven = False Then Half = CDec(Sgn(Value) / 2) ReturnValue = CDbl(Fix(ScaledValue + Half)) * Scaling Else ReturnValue = CDbl(Round(ScaledValue)) * Scaling End If If Err.Number <> 0 Then ReturnValue = Value End If End If End If End If RoundSignificantDbl = ReturnValue End Function Public Function Log10( _ ByVal Value As Double) _ As Double Log10 = Log(Value) / Log(Base10) End Function
To perform the rounding, the value to be rounded is scaled up or down by a power of ten determined by the logarithm10
of the value, converted to Decimal
to avoid bit errors, and an integer rounding is done. If this fails due to the limited range of Decimal
, it falls back using Double
. Finally, the value is scaled back and returned.
This is an example with one value scaled and rounded to four significant figures:
Input value: 0.030675 - Rounded value: 0.03068 Input value: 0.30675 - Rounded value: 0.3068 Input value: 3.0675 - Rounded value: 3.068 Input value: 30.675 - Rounded value: 30.68 Input value: 306.75 - Rounded value: 306.8 Input value: 3067.5 - Rounded value: 3068 Input value: 30675 - Rounded value: 30680 Input value: 306750 - Rounded value: 306800 Input value: 3067500 - Rounded value: 3068000 Input value: 30675000 - Rounded value: 30680000
For all functions, note that potential floating point errors are avoided by casting to Decimal
with CDec
.
The current version can always be found at GitHub.
The attached zip contains code for all the functions, a test module, as well as a Microsoft Access 2013 project.
Variations
A lot of variations are possible using the functions as a base.
For example, given the value n = 128.19
:
Round to the nearest quarter (0.25
):
RoundedValued = RoundMid(n / 0.25) * 0.25 RoundedValued -> 128.25
Round to the nearest integer 5
:
RoundedValue = RoundMid(n / 5) * 5 RoundedValue = 130.00
Round up to the nearest bargain price:
RoundedValue = RoundUp(n) - 0.01 RoundedValue -> 128.99
Points of Interest
If you wish to study the peculiars of the native Round
, then study the module RoundingMethodsTest
where a lot of values and results can be found. Also, should you wish to modify a function for your specific purpose, as a minimum it should pass the test included in the test module.
History
- Initial version
Главная » Функции VBA »
28 Апрель 2011 129098 просмотров
- ABS() — эта функция возвращает абсолютное значение переданного ей числа (то же число, но без знака). Например, ABS(3) и ABS(-3) вернут одно и то же значение 3.
- Int(), Fix() и Round()позволяют по разному округлять числа:
- Int() возвращает ближайшее меньшее целое;
- Fix() отбрасывает дробную часть;
- Round() округляет до указанного количества знаков после запятой.
Однако Round может вернуть не совсем ожидаемый результат, т.к. функция применяет финансовое округление. По правилам данного округления если за последней к округлению цифрой стоит 5, то округляемую цифру увеличивают в том случае, если она нечетная и уменьшают, если четная.
Математическое же округление всегда округляет цифру в большую сторону, если за ней идет цифра 5 и выше, и отбрасывает остаток если 4 и меньше.
Т.е. если мы выполним такую строку кодато результатом будет 2,5, хотя предполагалось получить 2,51. Поэтому порой для округления лучше использовать Format:
MsgBox Format(2.505, "#,##0.00")
но в этом случае мы получим не число в чистом виде, а текст. И если нужно именно число, то придется производить дополнительные преобразования:
MsgBox CDbl(Format(2.505, "#,##0.00"))
Так же, для математического округления, можно использовать и такой вариант:
MsgBox Application.Round(2.505, 2)
Но здесь стоит учитывать, что это не чистый VB и этот метод сработает только в Excel, т.к. по сути мы обращаемся к встроенной в Excel функции округления ОКРУГЛ(ROUND), которая применяет именно математическое округление.
- Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.
Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum
- Sgn() — позволяет вернуть информацию о знаке числа. Возвращает 1, если число положительное, -1, если отрицательное и 0, если проверяемое число равно 0.
- Mod() — Делит два числа и возвращает только остаток. Например, выражение 8 Mod 3 вернет число 2, т.к. без остатка(в виде дроби у результата деления) 8 делится на 3 только до 2-х(8 / 3 = 2,66666666666667).
При этом функция Mod учитывает и знак числа — если первое число или оба числа отрицательные, то результатом будет отрицательное число. Если же отрицательное только второе число — то результат будет положительным числом.
При попытке получить остаток при делении чисел с плавающей запятой результат может быть не тем, который ожидается, потому что перед выполнением деления оба числа округляются по математическим законам(5 и выше до большего, 4 и ниже — до меньшего). Например, выражение 8 Mod 3.5 вернет 0, а выражение 8 Mod 3.4 — 2.