Добрый день уважаемые форумчане! Хочу поделиться небольшой ошибкой VBA. Возможно такие темы уже были, но их искать не очень удобно. Поэтому предложение к админам создать где-то между кнопками "Вопросы VBA" и "Готовые решения" (или ещё где-нибудь), кнопку "Ошибки EXCEL и VBA". Ведь, скорее всего, каждый сталкивался с какими-либо ошибками, и было бы удобно посмотреть уже известные косяки и как-то их обойти. Я, например, из-за этой ошибки два дня потерял. Переписал трижды алгоритм расчета, пока не вспомнил, что ноль это не всегда ноль. Возможно кто-то будет делиться методами обхода таких проблем.
Добрый день уважаемые форумчане! Хочу поделиться небольшой ошибкой VBA. Возможно такие темы уже были, но их искать не очень удобно. Поэтому предложение к админам создать где-то между кнопками "Вопросы VBA" и "Готовые решения" (или ещё где-нибудь), кнопку "Ошибки EXCEL и VBA". Ведь, скорее всего, каждый сталкивался с какими-либо ошибками, и было бы удобно посмотреть уже известные косяки и как-то их обойти. Я, например, из-за этой ошибки два дня потерял. Переписал трижды алгоритм расчета, пока не вспомнил, что ноль это не всегда ноль. Возможно кто-то будет делиться методами обхода таких проблем.msi2102
[/vba] и практически всюду будет ИСТИНА (ну где используются эти переменные).
Кстати, столкнулся уже давно с таким поведением при сравнении даже не результатов вычислений, а при сравнении двух значений ячеек, которые равны и по видимому в ячейке (и в отладке кода) значению, и по типу значения, но сравнение в VBA не проходят. Эти значения были импортированы в ячейки извне, не заведены вручную.
Достаточно первой строкой модуля написать [vba]
Код
Dim a$, b$
[/vba] и практически всюду будет ИСТИНА (ну где используются эти переменные).
Кстати, столкнулся уже давно с таким поведением при сравнении даже не результатов вычислений, а при сравнении двух значений ячеек, которые равны и по видимому в ячейке (и в отладке кода) значению, и по типу значения, но сравнение в VBA не проходят. Эти значения были импортированы в ячейки извне, не заведены вручную.Hugo
Нужно было обработать достаточно большую базу. Решил проверить на небольших цифрах. И волей случая выпала именно такая последовательность. Все результаты правильные, а одно ну ни в какую не находит. Только написано было так:
Код
If Cells(5, 1) = Cells(5, 2) Then
То есть без объявления переменных.
Нужно было обработать достаточно большую базу. Решил проверить на небольших цифрах. И волей случая выпала именно такая последовательность. Все результаты правильные, а одно ну ни в какую не находит. Только написано было так:
В таком варианте думаю и cstr() может не помочь, надёжнее сперва округлять, а уж потом cstr(). А ещё надёжнее сперва это сделать по каждому слагаемому
В таком варианте думаю и cstr() может не помочь, надёжнее сперва округлять, а уж потом cstr(). А ещё надёжнее сперва это сделать по каждому слагаемому Hugo
Собственно создал эту тему для того, что бы предупредить, что есть такая проблема и про неё не надо забывать, а то можно и пролететь. Я уже создавал подобную тему, только там ВПР не искал значения. А здесь был немного удивлен, что у VBA 23,4+23,4+23,4 не равно 70,2.
Собственно создал эту тему для того, что бы предупредить, что есть такая проблема и про неё не надо забывать, а то можно и пролететь. Я уже создавал подобную тему, только там ВПР не искал значения. А здесь был немного удивлен, что у VBA 23,4+23,4+23,4 не равно 70,2.msi2102
Так это частный случай? Или какая-то логика есть - почему ошибка? Не понимаю откуда этим миллионным долям взяться это же сложение а не деление. Если логики нет, то о чем можно быть предупроежденным? Если подставить вместо а 70.2 то условие а = b выполняется. Только разницу по прежнему отображает -1,42109E-14
Так это частный случай? Или какая-то логика есть - почему ошибка? Не понимаю откуда этим миллионным долям взяться это же сложение а не деление. Если логики нет, то о чем можно быть предупроежденным? Если подставить вместо а 70.2 то условие а = b выполняется. Только разницу по прежнему отображает -1,42109E-14Leanna
Лучше день потерять, потом за пять минут долететь!
Здравствуйте! Ошибка к вычислениям отношения не имеет, но существует в Excel. Закладка "Рецензирование", надпись на значке команды "Защитить книгу" не меняется даже если книга уже защищена. Сам попался на этом, когда не смог через Alt+F11 переключить Visible листа с xlSheetVeryHidden на xlSheetVisible в защищённой книге.
Это наблюдается и в Excel 2013, и в Excel 2010, и в Excel 2007.
P. S. В отличии от защиты книги надпись "Защитить лист" меняется на "Снять защиту листа" после установки соответствующей защиты.
Здравствуйте! Ошибка к вычислениям отношения не имеет, но существует в Excel. Закладка "Рецензирование", надпись на значке команды "Защитить книгу" не меняется даже если книга уже защищена. Сам попался на этом, когда не смог через Alt+F11 переключить Visible листа с xlSheetVeryHidden на xlSheetVisible в защищённой книге.
Это наблюдается и в Excel 2013, и в Excel 2010, и в Excel 2007.
P. S. В отличии от защиты книги надпись "Защитить лист" меняется на "Снять защиту листа" после установки соответствующей защиты.Yurbas
Доброго времени суток. Хочу поделиться очередным косячком EXCEL. Собственно это тема не новая, но с таким я столкнулся в первый раз, вернее такая ошибка появлялась при использовании ВПР, суммесли и тому подобное, а вот при элементарном вычитании впервые. Я писал небольшую обработку для базы данных, и чтобы ее опробовать забил в первые две ячейки 300,01 и 299. После чего протянул до отрицательных чисел (Получилось как в столбце D). Включаю обработку, выдает неверный результат. Провозился с макросом три часа. Трижды его переписал, результат тот же. Постепенно начал терять веру в жизнь, пока случайно в строке формул не увидел это: 243,4500000000010, вместо 243,45 (которые были в ячейке, формат ячеек Общий). Решил тупо вычесть из 300,01 – 1,01 и протянул формулу, результат точно с такой же погрешностью, в том же месте. Причем предыдущее число 244,4600000000000 идет без погрешности. Если (в соседних ячейках) из 244,46 вычесть 1,01 то результат получается 243,450000000000 т.е. без единицы на конце. Причем самое смешное это когда из получившегося результата с погрешностью вычесть результат без погрешности, по логике должно получиться 0,000000000001, оказывается не все так просто, результат: 0,0000000000004832. Причина этого известна и обсуждалась не один раз, просто сам факт того, что данная ошибка появилась при простом вычитании удивляет. Способов борьбы с этим тоже большое множество, в зависимости от поставленной задачи, начиная от точности на экране и заканчивая различными формулами, я думаю смысла останавливаться на этом нет. Просто имейте ввиду данный факт при работе, чтобы не потратить лишнего времени. Кстати я на эти грабли наступил уже дважды, даже зная об этом, потому что ошибка вылезла не сразу, а на 55 строке.
Доброго времени суток. Хочу поделиться очередным косячком EXCEL. Собственно это тема не новая, но с таким я столкнулся в первый раз, вернее такая ошибка появлялась при использовании ВПР, суммесли и тому подобное, а вот при элементарном вычитании впервые. Я писал небольшую обработку для базы данных, и чтобы ее опробовать забил в первые две ячейки 300,01 и 299. После чего протянул до отрицательных чисел (Получилось как в столбце D). Включаю обработку, выдает неверный результат. Провозился с макросом три часа. Трижды его переписал, результат тот же. Постепенно начал терять веру в жизнь, пока случайно в строке формул не увидел это: 243,4500000000010, вместо 243,45 (которые были в ячейке, формат ячеек Общий). Решил тупо вычесть из 300,01 – 1,01 и протянул формулу, результат точно с такой же погрешностью, в том же месте. Причем предыдущее число 244,4600000000000 идет без погрешности. Если (в соседних ячейках) из 244,46 вычесть 1,01 то результат получается 243,450000000000 т.е. без единицы на конце. Причем самое смешное это когда из получившегося результата с погрешностью вычесть результат без погрешности, по логике должно получиться 0,000000000001, оказывается не все так просто, результат: 0,0000000000004832. Причина этого известна и обсуждалась не один раз, просто сам факт того, что данная ошибка появилась при простом вычитании удивляет. Способов борьбы с этим тоже большое множество, в зависимости от поставленной задачи, начиная от точности на экране и заканчивая различными формулами, я думаю смысла останавливаться на этом нет. Просто имейте ввиду данный факт при работе, чтобы не потратить лишнего времени. Кстати я на эти грабли наступил уже дважды, даже зная об этом, потому что ошибка вылезла не сразу, а на 55 строке.msi2102
В VBA для переменных типа Single это постоянная проблема, что появляются "довески". И даже в MathCAD'е на такое нарывался Вообще говоря, я ещё в 90-е годы читал в книгах, что не рекомендуется напрямую сравнивать числа с плавающей запятой, а нужно, например, так:
[vba]
Код
if v1-v2>0.0001 then
[/vba]
Вместо 0.0001 вставляете своё значение, зависящее от обрабатываемых данных. Но никто никогда не говорил, что это не касается формульных вычислений в электронных таблицах и базах данных.
В VBA для переменных типа Single это постоянная проблема, что появляются "довески". И даже в MathCAD'е на такое нарывался Вообще говоря, я ещё в 90-е годы читал в книгах, что не рекомендуется напрямую сравнивать числа с плавающей запятой, а нужно, например, так:
[vba]
Код
if v1-v2>0.0001 then
[/vba]
Вместо 0.0001 вставляете своё значение, зависящее от обрабатываемых данных. Но никто никогда не говорил, что это не касается формульных вычислений в электронных таблицах и базах данных.Skif-F