Страницы: 1
RSS
Баг или волшебство, Макрос для проверки наличия округлений в активном диапазоне
 
Всем доброго времени суток. Прошу помощи с макросом для поиска чисел, которые не округлены до выбраного знака после запятой, в активном диапазоне. Рабочий алгоритм я построила на округлении и разнице округленного и не округленного.

Представляю код:

Код
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 считает, что число не округленное. Прошу помощи, потому что не понимаю в чём ошибка, а возможно я выбрала неправильную стратегию... Код хоть и очень простой, но очень полезный.

Буду очень благодарна за помощь, рабочий файл прикрепляю.
Изменено: БМВ - 14.06.2022 21:36:36
 
Всем доброго времени суток! Представляю свой код для проверки не округленных значений в активном диапазоне.

Код
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го знака после запятой. Рабочий алгоритм построила на разнице округленного и не округленного значений. Очень прошу помощи, так как новичок. Может я выбрала не правильную стратегию. Код очень прост и очень полезен в моих ежедневных задачах. Файл прикрепляю.

При выгрузке также прошу обратить внимание на последний столбик с формулой суммы.

Буду очень благодарна, спасибо!
Изменено: Голикова Ульяна - 13.06.2022 21:43:56
 
Голикова Ульяна,  код следует оформлять соответствующим тегом. Для этого существует кнопка <...>
 
А "<>" это как? :)
 
Код
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

<...> - это кнопка в верхней строке редактора сообщений
Изменено: Ігор Гончаренко - 13.06.2022 20:35:40
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
А "<>" это как?
Это называется ни больше ни меньше, ни нашим ни вашим )
Изменено: testuser - 14.06.2022 04:44:24
 
Голикова Ульяна, здравствуйте
Вам не подсказали главного — VBA.Round (тоже самое, что просто Round) использует банковское, а не математическое округление.
Для математического нужно привлекать функцию листа (есть и другие способы): WorksheetFunction.Round
Подробнее: VBA Excel. Округление чисел (особенности)
Код
UPD: для данной задачи и банковкое округление подходит
Почему "одинаковые" значения при этом считаются разными — ниже
Изменено: Jack Famous - 14.06.2022 11:47:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
не это главное было в задаче
главное что в ячейке написано и видно 31.354, а оказываеися там 31.35400000003
мы это утрясли в бурной личной переписке с автором темы, не вижу смысла 1024 раз обьяснять всем, что у чисел с плавающей точкой есть некоторые особенности их записи в память
это можно обьяснять сколько угодно, но 1025 обращение по этому поводу я гарантирую, голова на отсечение! это вечная тема, как даты в текстовом формате
Изменено: Ігор Гончаренко - 14.06.2022 10:45:03
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, я вас понимаю, но 31.35400000003 <> 31.354, видно это или нет)))
    1. Задача стояла в "проверке наличия округлений".
    2. Число 31.35400000003 НЕ должно её пройти (как бы там Excel нам не объяснял стандарты вычислений в двоичной системе).
    3. Метод "на разнице округленного и не округленного значений" вполне себе рабочий.
    4. Вы сравниваете округление до заданного количества знаков N с округлением до N+1. Это может помочь в отсекании хвостов, но игнорирует разницу между исходным и округлением до N. А именно это (по исходным данным) и было нужно.

Специфику VBA.Round нужно объяснять обязательно, я считаю (хотя, в данном случае, действительно, оно вполне применимо).
Если "хвосты" проверяемых чисел нужно игнорировать, то можно сравнивать разницу между округленным и исходным до нужного порога, но это уже не будет равенство. А его можно достичь в данном случае.
Изменено: Jack Famous - 14.06.2022 11:43:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
еще вариант
Код
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
Изменено: MCH - 14.06.2022 11:33:12
 
Цитата
Ігор Гончаренко написал:
главное что в ячейке написано и видно 31.354, а оказываеися там 31.35400000003
Игорь, как это увидеть?
 
вот этот макрос
Код
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 покажет адреса ячеек, содержащих незаметные хвосты
Изменено: Ігор Гончаренко - 14.06.2022 13:17:36
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Прочитайте внимательно первый пункт разъяснений от разработчика.
Вот еще одно эссе на эту тему от серпентологов.
Изменено: sokol92 - 14.06.2022 13:34:28
Владимир
Страницы: 1
Наверх