2013-12-06 3 views
1

У меня большая проблема с форматами. Когда VBA записывает номер (Time() - actualtime), результат получается в считанные секунды, но, как кажется, это дни! поэтому, когда я поставлю эту команду: Selection.NumberFormat = "[h]:mm:ss.00" секунды - это дни!Проблемы с временем форматирования в VBA

Решение добавляет /(24*3600), но это дает мне ошибку, возможно, потому что это действительно небольшое число.

ActiveCell = ((Timer() - startTime), где время начала - Timer() Определить некоторое время назад.

ответ

1

Это из-за преобразования типа. Поскольку 3600 и 24 являются целыми числами, результат их умножения преобразуется в 16 бит Int. A 16 бит Int имеет диапазон от -32768 до +32767

Вы можете увидеть это, запустив следующую строку, которая не дает ошибку и возвращает обратно 32767

MsgBox 32766 + 1 

В то время как ниже линии терпит неудачу с из-за превышения максимального значения.

MsgBox 32766 + 2 

Как уже упоминалось, вы можете обойти это путем деления значения отдельно

(Time() - actualtime)/3600/24 будет работать ..

Кроме того, вы можете сказать, что первенствует вы хотите использовать другой тип,

MsgBox (Time() - actualtime)/(24# * 3600) 'use Double 
MsgBox (Time() - actualtime)/(24& * 3600) 'use Long 

Хэш или амперсанд после 24-го сообщения что вы хотите, чтобы значение использовалось как определенный тип, и эти утверждения не сбой с ошибкой переполнения.

3

Попробуйте

Timeserial(0,0,Time() - actualtime) 

TimeSerial возвращает значение времени, и ввод требуемого значения в «секунды» аргумент обеспечит количество возвращенное обрабатывается правильно.

Дайте мне знать, если это поможет!

1

Увлекательный.

actualtime/(24 * 3600) 

производит ошибку переполнения в VBA.

actualtime/24/3600 

нет.

Что-то о умножении 24 и 3600 создает ошибку переполнения.

Смежные вопросы