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

60

Ну, я просто создал простой sub и дал ошибку переполнения. Однако я не вижу ничего плохого в коде, и это действительно странно, поскольку 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
  • 1
    Интересно, что это НЕ вызывает ошибку переполнения, если вы укажете 50000 вместо 500 * 100 ...
  • 6
    Подсказка: попробуйте CLng(500)*100
Показать ещё 2 комментария
Теги:
excel-vba
excel

4 ответа

72
Лучший ответ

Рассмотрим:

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.

20

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

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

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

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

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

CLng(500) * 100

2

я получил ответ по следующей ссылке: Ссылка из Microsoft

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню