2015-07-10 1 views
5

Я пытаюсь использовать следующий код, чтобы показать, как долго выполнялась серия команд. В этом примере я ожидал, что он вернется с «10» или что-то подобное.VBA - Показывает, сколько времени понадобилось подпункту

Вместо этого он возвращается с:

enter image description here

Что происходит и как я могу отформатировать это правильно?

Sub timeyWimey() 

    Dim t1 As Date 
    Dim t2 As Date 
    Dim timeTaken As Date 

     t1 = Now() 
     Application.Wait (Now + TimeValue("0:00:10")) 
     t2 = Now() 

     timeTaken = t2 - t1 

     MsgBox timeTaken 

End Sub 

Edit:

Финальный код после того, как некоторые большие ответы:

Sub timeyWimey() 

    'Dim t1 As Double 
    'Dim t2 As Double 


     t1 = Now() 
     Application.Wait (Now + TimeValue("0:00:10")) 
     t2 = Now() 

     timeTaken = t2 - t1 

     MsgBox Format(timeTaken, "nn:ss.000") 

End Sub 

Результаты в:

enter image description here

BAM! Задача решена! Спасибо всем за вашу помощь!

ответ

2

Дата хранится как числовое значение в MS Access и MS Excel. Так что если в вашем непосредственном окне (Ctrl + G) вы вводите ?Cdbl(now()), вы получите следующее: 42195.5204050926.

Все цифры изображают, сколько дней прошло с 1899 года 30 декабря, а десятичная цифра показывает, сколько из текущего дня прошло.

Так что в вашем коде вы в основном говорят, что-то вроде этого:

timeTaken = 42195.5222337963 - 42195.5204050926 

В этом примере я просто проверил Now() один раз, а затем снова через несколько минут. Итак, я закончил с 0.0018287037.

Теперь, если я иду, чтобы увидеть, что с помощью Date переменного, например, как в вашем примере, я в основном говорю, что время это было в 0.0018287037, который 30 декабря 1899, 12:02:38 AM.

Вы можете визуально видеть это, возвращаясь к вашему непосредственному окну и набрав ?cdate(0.0018287037) и вы получите результат, как: 12:02:38 AM. Для того, чтобы сделать еще один шаг дальше, то вы можете ввести ?cdate(1.0018287037) и вы получите результат, говоря: 1899-12-31 12:02:38 AM

Таким образом, в вашей ситуации вы можете просто просто изменить:

MsgBox timeTaken 

To:

MsgBox Format(timeTaken, "nn:ss") 

Примечание: Я не заметил на скриншоте, что он говорит «Excel», хотя этот ответ все равно должен быть действительным.

+0

спасибо. Так что это определенно объясняет проблему. Позвольте мне немного подумать об этом. – timbram

+0

Итак, как работает формат чисел после десятичной (сумма текущего дня)? Если перезапустить мой сценарий, сохранив все как удвоение, я получаю, что время, прошедшее (10 секунд), равно 0.00005787036934635. Это процент от дня или чего-то еще? – timbram

+0

Я добавил, как вы могли бы отформатировать двойной конец моего ответа. А '0,00005787036934635' - это в основном процент за день. Например, если бы это было 0.5, это было бы 12: 00noon, потому что половина дня прошла. – Newd

1

Обычно вы должны использовать DateDiff function, чтобы рассчитать разницу между двумя датами, но я думаю, что в вашем случае вам нужно что-то еще, поскольку DateDiff не даст вам миллисекунды.Вместо этого просто замените свой вызов на функцию «Сейчас» на Timer(), что составляет всего несколько секунд (осторожно, но это дает вам только время, прошедшее с полуночи, поэтому t2 - t1 может быть отрицательным, а если ваши команды остаются последними дней вы не получите никакого значимого результата).

+0

Спасибо, что будет отлично работать для моих целей. – timbram

1

Вы можете попробовать функцию таймера. Как указывают другие ответы, могут быть некоторые оговорки.

Dim startTime As Double, endTime As Double 
startTime = Timer 

Application.Wait (Now + TimeValue("0:00:10")) 

endTime = Timer 
msgBox endTime - startTime 
+0

Ненавижу это, и мне это нравится! :) Я ненавижу, что беспорядок во времена - это большая часть боли в VBA! Тем не менее, дело со временем может быть сложным зверьком на ЛЮБОМ языке! Этот метод работает, и для моего текущего процесса я не так сильно беспокоюсь о миллисекундах и не буду запускать его за ночь или что-то еще. – timbram

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