Sub проба1()
Dim кк As Double
кк = 10 * 1000 * 10
End Sub
Dim кк As Double
кк = 10 * 1000 * 10
End Sub
02.03.2013 13:33:26
Sub проба1()
Dim кк As Double кк = 10 * 1000 * 10 End Sub |
|
|
|
02.03.2013 13:37:34
Для начала следует прочитать
|
|
|
|
02.03.2013 16:19:12
какой еще глюк?
пока не произошло присвоение переменной типа double, интерпретатор определяет тип и аргументов, и результата на основе операторов и символьной записи чисел. целые числа и воспринимаются как целые. а результат уже не умещается в целое. сравните: кк = 3270 * 10 и кк = 3280 * 10 и в обратную ![]() кк = 32700 * 10 и кк = 32800 * 10 достаточно писать так: кк = 10.0 * 1000 * 10 кстати, VBE автоматом меняет такую строку на кк = 10# * 1000 * 10
Изменено:
фрилансер Excel, VBA - контакты в
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг |
|
|
|
02.03.2013 16:30:10
|
|||
|
|
21.05.2023 13:00:51
почему только неполная "М" ? ты что-то скрываешь? в чём-то замешан? щас бы в инете к никам придираться. ikki то очень осмысленный ник, намного круче йцукена надеюсь регистрацию на форуме по тилибону скоро прикрутят? + геолокацию ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- последние две строки выдают ошибку как полечить?:
тут последняя строка тоже выдает ошибку при использовании массива как лечить? только через a1 = clng(a00(0)) * 100 * 100 ?:
и так тоже не хочет:
Изменено: |
|||||||||
|
|
21.05.2023 17:31:33
1. Сначала выполняются вычисления в скобках по частям по математическим правилам и приоритетам вычисления. 2. В каждой вычисляемой части учитывается типы данных и их ограничения. Если в вычисляемой части мат. выражения тип не указан, а все числа от -32768 до 32767, то Excel трактует числа и результат как Integer и выдает ошибку, если результат не укладывается в интервал Integer (-32768 … 32767). Например, в окне Immediate: ?10000 * 10 выдаст ошибку ?32768 * 10 ошибки нет, тип результата - long 3. Если в вычисляемой части мат.выражения хоть одно число или переменная имеет тип double, то результат этой части (и общий результат) также будет иметь тип double и переполнения не будет. Аналогично, если нет ни одного double, но есть long, то тип результата будет long. ?10000 * 10 выдаст ошибку ?10000& * 10 ошибки нет, тип результата - long ?10000# * 10 ошибки нет, тип результата - double
Изменено: |
|||
|
|
21.05.2023 19:43:34
вот три строки, 1 выдаст ошибку, а 2 и 3 не выдадут хотя непонятно как это работает - если плюс изменил ситуацию, значит тип мат операции имеет значение а дальше в 3й строке мы убрали нолик около лонга - на лонг a1 этот ноль вообще не влияет, а каким образом он влияет на a2 тоже не понятно. т.е. если учитывается общий результат справа от равно, то наличие лонга должно решать все проблемы, т.к. справа 10 нулей, а у лонга 18
за всю практику первый раз столкнулся напрямую с перемножением в vba и это всё сделано как то криво косо неудобно да еще если часто менять типы данных у переменной, то выскакивает ошибка о несоответствии. причем если ты менял с 1 на 10 - то эта ошибка никак не обойдётся, пока не введешь третье число типа 200, тогда он успешно обновляет тип данных (MS 2010) в общем в любой непонятной ситуации пиши CDbl() или CLng() и это в большинстве случаев поможет
Изменено: |
|||||||
|
|
21.05.2023 23:35:51
Выражение (a1 * 100000) * (a2 * 1000) вычисляются по частям так: 1. (a1 * 100000) = 1000000& 2. (a2 * 1000) = 10000% 3. 1000000& * 10000& =10000000000 = ошибка, т.к. макс. значение Long равно 2147483647
Изменено: |
|||||||||||
|
|
21.05.2023 23:46:11
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
|
|||
|
|
22.05.2023 05:08:17
а то
![]()
хотя наоборот есть - оно без короткого знака
Изменено: |
|||||||||
|
|
22.05.2023 05:32:23
вместо Dim a0 As Variant можно записать Dim a0 это одно и то же |
||||
|
|
|||