Глобальные переменные пусты, даже если они были установлены в подпрограмме vba.

Пытался создать таймер в VBA. Мое намерение состоит в том, чтобы иметь возможность вызывать TimerStart, TimerLaps и TimerStop в других функциях, чтобы оценить, сколько времени потребуется для завершения блока кода. Но у меня проблемы с тем, что моя глобальная переменная пуста.

Private starttime As Double   

Sub TimerStart()
    starttime = Timer
End Sub

Function TimerLaps() As Double
    TimerLaps = Timer - starttime
End Function

Function TimerStop() As Double
    i = starttime
    starttime = 0
    TimerStop = Round(Timer - i, 2)
End Function

Sub test()
    Call TimerStart

    MsgBox TimerStop()
End Sub

Спасибо ребята!


person Vegard    schedule 05.08.2015    source источник
comment
Я также пытался установить время начала как глобальное и общедоступное, но это все равно не работает. Я установил его как частный, потому что это означает, что область действия находится внутри модуля в моем сознании.   -  person Vegard    schedule 05.08.2015


Ответы (2)


Пытаться:

Global starttime As Double 

В верхней части вашего модуля (вместо Private starttime As Double)

ИЗМЕНИТЬ

Global starttime As Double

Sub test()
    Call TimerStart
    Application.Wait (Now + #12:00:02 AM#)
    MsgBox TimerStop()
End Sub

Sub TimerStart()
    starttime = Timer
End Sub

Function TimerStop() As Double
    Dim i As Double
    i = starttime
    starttime = 0
    TimerStop = Round(Timer - i, 2)
End Function
person tea_pea    schedule 05.08.2015
comment
Я пробовал это, но это не работает. При вызове TimerStop() время начала пусто. - person Vegard; 05.08.2015
comment
Я предполагаю, что вы сначала позвонили в TimerStart? Запуск вспомогательного «теста» работает для меня... (за исключением того, что он работает так быстро, что время равно 0) - person tea_pea; 05.08.2015
comment
В порядке. Может я не правильно задал вопрос. Я получаю другое время, но я хочу, чтобы результатом были секунды, прошедшие с момента, когда я вызываю timerstart до timerstop. Если я помещу «Application.Wait (Now + #12:00:02 AM#)» между «Call TimerStart» и «MsgBox TimerStop()» в «Sub Test()», я хочу, чтобы результат был около 2 секунд. - person Vegard; 05.08.2015
comment
Тогда это не моя логика, но она все равно не работает. Это так расстраивает ... Может быть, это из-за каких-то настроек в моей версии VBA или что-то в этом роде? - person Vegard; 05.08.2015
comment
пытаясь понять, почему это может быть. Вы прошли через код построчно, используя F8? и вы можете посмотреть в окне местных жителей, чтобы попытаться увидеть, где он не делает то, что вы думаете. - person tea_pea; 05.08.2015
comment
Вы размещаете общедоступную переменную в стандартном модуле кода? Если она помещена, например, в модуль пользовательской формы, то переменная остается в памяти только тогда, когда пользовательская форма активна. - person Excel Developers; 05.08.2015
comment
Кроме того, если у вас есть End отдельно в строке в любом месте кода, это приведет к тому, что все общедоступные переменные потеряют свои значения. - person Excel Developers; 05.08.2015

Вы можете использовать двумя способами:

Global starttime As Double 

И

Public starttime As Double 

Используйте один из них вместо Private. Основным отличием является:

Global можно использовать только в стандартных модулях, тогда как Public можно использовать во всех контекстах (модулях, классах, элементах управления, формах и т. д.)
Global< /strong> исходит из более старых версий VB и, вероятно, был сохранен для обратной совместимости, но был полностью заменен Public.

person R.Katnaan    schedule 05.08.2015
comment
Я пробовал это, но это не работает. При вызове TimerStop() время начала пусто. - person Vegard; 05.08.2015
comment
Я проверил с Public, я получил правильное сообщение. Да, время начала будет равно 0, потому что starttime = 0. Но вы получите другое время. - person R.Katnaan; 05.08.2015
comment
В порядке. Может я не правильно задал вопрос. Я получаю другое время, но я хочу, чтобы результатом были секунды, прошедшие с момента, когда я вызываю timerstart до timerstop. Если я помещу «Application.Wait (Now + #12:00:02 AM#)» между «Call TimerStart» и «MsgBox TimerStop()» в «Sub Test()», я хочу, чтобы результат был около 2 секунд. - person Vegard; 05.08.2015