کریس در حال توسعه یک ماکرو اکسل است که یک سری موارد را به کاربر نمایش می دهد. او می خواهد یک تاخیر در ماکرو مثلاً یک ثانیه بین هر قطعه اطلاعاتی که نمایش می دهد معرفی کند، و از خود می پرسد که آیا راه آسانی برای اضافه کردن چنین تاخیری وجود دارد؟
چند راه وجود دارد که می توانید تاخیر را در ماکرو خود وارد کنید. روش سنتی استفاده از متد Wait است که با شی Application استفاده می شود. شما از آن برای معرفی تاخیر یک ثانیه ای به این صورت استفاده می کنید:
Application.Wait (Now() + TimeValue("0:00:01"))
توجه داشته باشید که پارامتر مورد نیاز روش Wait زمانی است که می خواهید ماکرو شما از سر گرفته شود. به عبارت دیگر، زمان «انتظار تا» است. به همین دلیل است که در مثال بالا از زمان جاری (از تابع Now) با افزایش یک ثانیه استفاده می شود.
اگر ترجیح می دهید از روش Wait (به هر دلیلی) استفاده نکنید، می توانید فقط از یک حلقه برای صرف زمان خود استفاده کنید:
Dim WaitTime As Date
WaitTime = Now() + TimeValue("0:00:01")
Do While Now < WaitTime
Loop
یک نوع از این رویکرد به تابع تایمر متکی است که تعداد ثانیه ها را از نیمه شب برمی گرداند:
Dim Endpoint as Single
Endpoint = Timer + 1
Do While Timer < Endpoint
Loop
هنگام استفاده از یک حلقه به این روش، اگر فقط یک ثانیه تاخیر داشته باشید، احتمالاً مشکل بزرگی نخواهد بود. اگر نیاز به تأخیر طولانی تری دارید، احتمالاً می خواهید تابع DoEvents را در حلقه قرار دهید:
Dim Endpoint as Single
Endpoint = Timer + 1
Do While Timer < Endpoint
DoEvents
Loop
دلیل آن ساده است - اگر این کار را نکنید، اکسل در حالی که در حلقه است به هیچ رویداد دیگری پاسخ نمی دهد. این می تواند باعث شود که به نظر برسد سیستم شما در حین انتظار یخ زده یا آویزان شده است.
اگر به جزئیات بیشتر در تأخیرهای خود (تا محدوده میلی ثانیه) نیاز دارید، ممکن است بخواهید به عملکرد Sleep که بخشی از API ویندوز است تکیه کنید. (این بخشی از VBA نیست.) برای استفاده از آن، باید یک اعلان را در ابتدای ماژول خود، در ناحیه اعلامیه ها، قبل از هر روشی وارد کنید:
#If VBA7 And Win64 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)
#Else
Public Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)
#End If
سپس در ماکرو خود می توانید از تابع Sleep به این صورت استفاده کنید:
Sleep(1000)
این سیستم را برای 1000 میلی ثانیه مکث می کند که 1 ثانیه است.