Всем доброго времени суток. Прошу помощи с макросом для поиска чисел, которые не округлены до выбраного знака после запятой, в активном диапазоне. Рабочий алгоритм я построила на округлении и разнице округленного и не округленного.
Представляю код:
Код
Sub RoundЕ()
Dim cl As Range
Dim x1 As Integer
x1 = InputBox("Введите количество знаков после запятой")
For Each cl In Selection.Cells
'cl.Value = cl.Value
k1 = cl.Value
k2 = Round(cl.Value, x1)
If k1 <> k2 Then cl.Interior.Color = 11389944
Next
End Sub
Обычно я проверяю на округления до 3го числа, решила написать макрос для данной задачи, но столкнулась с тем, что даже при 34,425 = 34,425 - VBA считает, что число не округленное. Прошу помощи, потому что не понимаю в чём ошибка, а возможно я выбрала неправильную стратегию... Код хоть и очень простой, но очень полезный.
Буду очень благодарна за помощь, рабочий файл прикрепляю.
Всем доброго времени суток! Представляю свой код для проверки не округленных значений в активном диапазоне.
Код
Sub RoundЕ()
Dim cl As Range
Dim x1 As Integer
x1 = InputBox("Введите количество знаков после запятой")
For Each cl In Selection.Cells
'cl.Value = cl.Value
k1 = cl.Value
k2 = Round(cl.Value, x1)
If k1 <> k2 Then cl.Interior.Color = 11389944
Next
End Sub
Столкнулась с проблемой, когда VBA считает, что число 31,995 - не округленное до 3го знака после запятой. Рабочий алгоритм построила на разнице округленного и не округленного значений. Очень прошу помощи, так как новичок. Может я выбрала не правильную стратегию. Код очень прост и очень полезен в моих ежедневных задачах. Файл прикрепляю.
При выгрузке также прошу обратить внимание на последний столбик с формулой суммы.
Sub RoundЕ()
Dim cl As Range, x1&
x1 = InputBox("Введите количество знаков после запятой")
Selection.Interior.Pattern = xlNone
For Each c1 In Selection.Cells
If Round(c1, x1) <> Round(c1, x1 + 1) Then c1.Interior.Color = 11389944
Next
End Sub
<...> - это кнопка в верхней строке редактора сообщений
Голикова Ульяна, здравствуйте Вам не подсказали главного — VBA.Round (тоже самое, что просто Round) использует банковское, а не математическое округление. Для математического нужно привлекать функцию листа (есть и другие способы): WorksheetFunction.Round Подробнее:VBA Excel. Округление чисел (особенности)
Код
Код
Sub RoundЕ()
Dim cl As Range, x1&
x1 = InputBox("Введите количество знаков после запятой")
Selection.Interior.Pattern = xlNone
For Each cl In Selection.Cells
If Round(cl, x1) <> cl Then cl.Interior.color = 11389944
Next
End Sub
UPD: для данной задачи и банковкое округление подходит Почему "одинаковые" значения при этом считаются разными — ниже
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, не это главное было в задаче главное что в ячейке написано и видно 31.354, а оказываеися там 31.35400000003 мы это утрясли в бурной личной переписке с автором темы, не вижу смысла 1024 раз обьяснять всем, что у чисел с плавающей точкой есть некоторые особенности их записи в память это можно обьяснять сколько угодно, но 1025 обращение по этому поводу я гарантирую, голова на отсечение! это вечная тема, как даты в текстовом формате
Ігор Гончаренко, я вас понимаю, но 31.35400000003 <> 31.354, видно это или нет))) 1. Задача стояла в "проверке наличия округлений". 2. Число 31.35400000003 НЕ должно её пройти (как бы там Excel нам не объяснял стандарты вычислений в двоичной системе). 3. Метод "на разнице округленного и не округленного значений" вполне себе рабочий. 4. Вы сравниваете округление до заданного количества знаков N с округлением до N+1. Это может помочь в отсекании хвостов, но игнорирует разницу между исходным и округлением до N. А именно это (по исходным данным) и было нужно.
Специфику VBA.Round нужно объяснять обязательно, я считаю (хотя, в данном случае, действительно, оно вполне применимо). Если "хвосты" проверяемых чисел нужно игнорировать, то можно сравнивать разницу между округленным и исходным до нужного порога, но это уже не будет равенство. А его можно достичь в данном случае.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Sub RoundЕ()
Dim cl As Range
Dim x1 As Integer
x1 = Val(InputBox("Введите количество знаков после запятой"))
Selection.Interior.Pattern = xlNone
For Each cl In Selection.Cells
If CStr(cl.Value) <> CStr(Round(cl.Value, x1)) Then
cl.Interior.Color = 11389944
End If
Next
End Sub
Sub ShowDifference()
Dim c As Range
For Each c In ActiveSheet.UsedRange
If c <> Round(c, 5) And c.Column <> 26 Then
Debug.Print c.Address & " " & c - Round(c, 5)
End If
Next
End Sub
выполненный в файле из сообщения 1 в окне Immediate покажет адреса ячеек, содержащих незаметные хвосты