Страницы: 1
RSS
Баг или фича? Почему значение #d# для Excel'я является числом
 
Доброго времени суток, Планетяне!
Заказчик тут обнаружил интересную фичу (или багулину)…

Если писать 1e5, то это экспонициальный ввод числа - понятно, но почему литера d так себя ведёт?
Подробности на скринах и в названии темы

P.S.: замена .Value2 на .Value ничего не меняет
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
вообще фича:
Код
Sub test()
    For i = 0 To 9
        Debug.Print CDbl("6d" & i)
    Next
End Sub
Изменено: buchlotnik - 07.07.2020 18:32:56
Соблюдение правил форума не освобождает от модераторского произвола
 
прикольно, да... :) после d - количество 0-й. Не могу только найти упоминания пока
F1 творит чудеса
 
ну в общем виде работает с  d/e/D/E
см. FLOAT
Код
Sub test()
    For i = 0 To 9
        Debug.Print CDbl("8d-" & i)
        Debug.Print CDbl("8e-" & i)
        Debug.Print CDbl("8D-" & i)
        Debug.Print CDbl("8E-" & i)
    Next
End Sub
Изменено: buchlotnik - 07.07.2020 18:55:50
Соблюдение правил форума не освобождает от модераторского произвола
 
Когда-то всплывало, но не помню, где...

Еще интересное обнаружил.
Val() в VBA берет из текста все числовые знаки слева до первого нечислового символа.
Val("0,00003") = 0
Val(0.00003) = 0

Но!
Val("3d-5") = 0,00003
Val("3e-5") = 0,00003


В коде єкспоненциальная запись сразу преобразуется в число.
 
Цитата
vikttur написал:
до первого нечислового символа.
За исключением пробела:
Val("3d1 2") = 3000000000000
CDbl("3d1 2") = еггог
F1 творит чудеса
 
Это да, не учел...  Но я ударение ставил на том, что Val не обрезает экспоненциальное число.
 
еще любопытно, кстати:
Val("0.3d2") =  30
F1 творит чудеса
 
Доброе время суток
Просто похоже VBA считает d аналогом e, как decimal. Если набрать в Immediate
Код
?3d34

 3E+34 
Вполне себе логичный результат.
Изменено: Андрей VG - 07.07.2020 19:24:10
 
Владимир (ZVI) сформулировал кандминимум по этой теме здесь.  :)  
Владимир
 
Цитата
Максим Зеленский написал: любопытно...Val("0.3d2") =  30
Текст сначала преобразуется в число. Число целое. Val(целое) = целое
Но если это же "число" (0,3d2) взять из ячейки, то Val(...)= 0. Здесь явно видно, что сначала обрезание, потом преобразование преобразовывать нечего

С такими данным надо осторожно...
 
Цитата
vikttur написал:
Val(0.00003) = 0
Приветствую, Виктор! Это если у Вас в региональных настройках разделителем дробной доли является запятая. Аргументом функции VBA.Val является текст. Число 0.0003 будет преобразовано в текст согласно региональным настройкам и скормлено функции Val. Поэтому в условиях, указанных выше, выражение будет преобразовано в

Val("0,00003")

Val специфическая функция - она, в том числе, игнорирует региональные настройки. Точку Val всегда воспринимает как разделитель дробной доли. На запятой она в этом случае останавливается и возвращает 0. Опять же, классические разъяснения от любимого автора.
Изменено: sokol92 - 07.07.2020 20:44:18
Владимир
 
мда…Excel не перестаёт фокусничать, а то что на скрине (от Владимира ZVI) вообще треш, конечно — что хочу, то и ворочу  :evil:
для меня это, безусловно, проблема и баг, нежели фича, т.к. теперь придётся дополнительные проверки вводить  :(
спасибо за разъяснения!  :idea:

UPD: к счастью, решается с помощью простой и быстрой проверки
Код
If IsNumeric(x)
   If x<>--x Then MsgBox "Текст-Как-Число"
End If
Изменено: Jack Famous - 07.07.2020 22:52:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте, Алексей! Excel c таким поведением буквы d (D) не знаком, он по своей инициативе не будет преобразовывать в число текст вида 2d2. Это всё относится только к VBA. Когда Вы в #1 вычисляете IsNumeric(x) для текста x, то Вы выясняете (у VBA), может ли текст x быть преобразован в число в соответствии с региональными настройками данной системы Windows. Вот тут VBA и сообщает, что текст "2d2" может быть преобразован в число. Функции преобразования типов (Val, Cdbl, Csng, Ccur...) также знают про "d". См. также исследования коллеги в #4.
Изменено: sokol92 - 07.07.2020 20:58:21
Владимир
 
sokol92, приветствую, Владимир! Это проблема, поскольку в данных такие фрагменты "текста-как-чисел" содержатся, но обработаться должны как текст, а не число
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх