Почему ячейки (1,1) = 500 * 100 вызывают переполнение, а 50000*100-нет?


Ну, я просто создал простой суб, и это дает ошибку переполнения. Однако, я не вижу ничего плохого в код, и это действительно странно, так как 50000*100 намного больше, чем 500*100.

sub add()
    'This will cause an overflow error
    cells(1,1) = 500 * 100
    'But this won't
    cells(2,2) = 50000 * 100
end sub
4 63

4 ответа:

считаем:

Sub add()
    'This works:
    Cells(1, 1) = CLng(500) * 100
    'as does this:
    Cells(2, 2) = 50000 * 100
End Sub

очевидно, VBA выбирал тип по умолчанию Integer для первого выражения, потому что этот тип достаточно велик, чтобы содержать литералы с правой стороны. 50000 слишком большой для Integer так он интерпретирует его как Long. CLng явно запускает продвижение к Long.

максимальное значение для A Integer и 32767 и с 50000 больше это бросается как Long тип. Таким образом, результаты вписываются в Long просто отлично. Но в первом случае все делается с Integer типы и полноводна.

(Integer=500) * (Integer=100) = (Integer=50000)  'Overflow
(Long=50000) * (Integer=100) = (Long=5000000)    'Ok

Это связано с тем, как VBA оценивает математические выражения. Возвращаемый тип выражения будет типом первого операнда в выражении или его ближайшим эквивалентом числового типа. Однако конечный результат может не соответствовать этому типу возврата и вызвать ошибку переполнения.

когда вы делаете 500*100 , возвращает тип integer. В то время как при выполнении 50000*100 возвращаемый тип этого выражения является длинным.

чтобы избежать ошибки переполнения, вы можете сделать явное приведение, чтобы он знал ваши намерения

CLng(500) * 100

Я получил ответ по следующей ссылке: ссылка от microsoft

кажется, что даже я не назначил тип числа, excel автоматически назначает его на основе его длины. Таким образом, 500 определяется как целое число, а результат 50,000 слишком велик для типа integer. Вот почему.