Ray می خواهد، در صورت امکان، راهی برای متحرک کردن «شمارش بالا» برای یک مقدار در یک سلول باشد. به عنوان مثال، در سلول B7 ممکن است مقدار 23 داشته باشد. او می خواهد به آن مقدار در سلول E4 اشاره کند و تعداد سلول های E4 را از 0 تا 23 (0، 1، 2، 3، و غیره) داشته باشد که هر عدد را نشان می دهد. به نوبه خود.
هیچ روش داخلی برای انجام این کار در اکسل وجود ندارد، اما می توانید از یک ماکرو برای انجام انیمیشن استفاده کنید. اساساً، ماکرو باید بفهمد در سلول B7 چه چیزی وجود دارد، و سپس از یک حلقه For...Next برای عبور از مقادیر بین 0 و هر آنچه در B7 است استفاده کند. در طی هر بار تکرار حلقه، مقدار E4 تغییر می کند و نوعی تاخیر ایجاد می شود.
بخش تاخیر ماکرو چیزی است که در واقع توانایی تغییر نحوه انجام کار ماکرو را فراهم می کند. تأخیر لازم است تا انیمیشن کار کند. بدون آن، اعداد در E4 خیلی سریع افزایش می یابند. اکسل چند راه مفید برای پیاده سازی تاخیر ارائه می دهد. به عنوان مثال، این مثال از ماکرو به تابع Sleep متکی است:
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Private Sub Worksheet_Change(ByVal Target As Range)
Dim n As Integer
Const cellWatch As String = "$B$7"
Const cellCount As String = "$E$4"
Const msec As Long = 200 milliseconds
If Target.Address = cellWatch Then
Application.EnableEvents = False
Range(cellCount).Show
If IsNumeric(Target) Then
For n = 0 To Target skipped if Target < 0
Range(cellCount) = n
Sleep msec delay each increment
Next n
End If
Range(cellCount) = Target
Application.EnableEvents = True
End If
End Sub
این کد باید به ماژول ThisWorksheet اضافه شود، زیرا طوری طراحی شده است که هر بار که چیزی در کاربرگ تغییر می کند اجرا شود. کد بررسی می کند که آیا سلول در حال تغییر سلول هدف (B7) است یا خیر. اگر اینطور باشد، مقدار را در آنجا می گیرد و به حلقه For...Next می پرد که هر چیزی را در سلول E4 به روزرسانی می کند. تابع Sleep برای به تاخیر انداختن، در این مثال، 200 میلی ثانیه بین هر به روز رسانی E4 استفاده می شود.
اگر ماکرویی می خواهید که کوتاه تر باشد و به کنترل کننده رویداد Worksheet_Change متکی نباشد، ممکن است موارد زیر را در نظر بگیرید. از روش Wait برای مکث در حلقه For...Next استفاده می کند:
Sub CountUp()
Dim J As Integer
For J = 0 To Range("B7").Value
Range("E4").Value = J
Application.Wait (Now + TimeValue("0:00:01"))
Next J
Range("E4").Value = Range("B7").Value
End Sub
این نسخه از ماکرو یک ثانیه کامل بین هر به روز رسانی به سلول E4 مکث می کند.
هر زمان که از یک ماکرو مانند این استفاده می کنید که نوعی تاخیر را پیاده سازی می کند، به یاد داشته باشید که کاربرگ شما ممکن است کمتر پاسخگو باشد. این به دلیل آن تأخیر است و هر چقدر هم که مقدار آن در سلول E4 زیاد باشد. (هرچه مقدار بزرگتر باشد، تأخیر کل بیشتر می شود.)