هنگامی که یک ماکرو می نویسید، به گونه ای طراحی شده است که هر زمان که بخواهید آن را اجرا کنید اجرا شود. اگر نیاز به ایجاد یک ماکرو داشته باشید که هر زمان که چیزی در کاربرگ شما تغییر کند، اجرا شود، چه؟ این به ویژه اگر در حال ایجاد یک تابع سفارشی هستید که می خواهید در سلول های کاربرگ استفاده کنید، ضروری است.
در اینجا مهم است که بدانیم منظور از نوسانات تابع چیست. اکسل یک تابع را فراری در نظر می گیرد که نتوان مقدار آن را از لحظه ای به لحظه دیگر یکسان فرض کرد. توابع کاربرگ زیر ماهیت فرار در نظر گرفته می شوند:
https://www.decisionmodels.com/calcsecretsi.htm
توابع کاربرگ چه ربطی به ماکروها دارند؟ خوب، می توانید یک ماکرو ایجاد کنید که یک UDF (عملکرد تعریف شده توسط کاربر) است که ممکن است در دسته ای قرار گیرد که مقداری ندارد که «از لحظه ای به لحظه ی دیگر یکسان فرض شود». به طور پیش فرض، اکسل فرض می کند که هر ماکرویی که ایجاد می کنید غیر فرار است. هرچند ممکن است اینطور نباشد. UDF تک خطی زیر را در نظر بگیرید:
Function FutureDay(D As Integer) As Double
FutureDay = Now() + D
End Function
تمام این کار این است که زمان را در حال حاضر تعیین می کند و یک مقدار صحیح به آن زمان اضافه می کند تا تاریخ و زمان آینده (یا گذشته) را تعیین کند. شما می توانید این UDF را در یک کاربرگ به این صورت فراخوانی کنید:
=FutureDay(7)
که یک مقدار تاریخ/زمان را 7 روز در آینده برمی گرداند. با این حال، وقتی کاربرگ شما دوباره محاسبه می شود، UDF دوباره محاسبه نمی شود. این بدان معنی است که مقدار تاریخ/زمان در سلول دیگر دقیق نیست.
راه حل این است که به اکسل بگویید UDF شما فرار است. این کار را با اضافه کردن یک خط به ماکرو انجام می دهید:
Function FutureDay(D As Integer) As Double
Application.Volatile
FutureDay = Now() + D
End Function
اکنون وقتی اکسل کاربرگ را مجدداً محاسبه می کند، UDF شما را نیز مجدداً محاسبه می کند.
باید توجه داشته باشید که در ماکروهای خود فقط باید از روش Volatile به مقدار کم استفاده کنید. استفاده از آن در همه جا ضرری ندارد، به جز اینکه کار اضافی را به محاسبه مجدد برگه های شما اضافه می کند. برای اطمینان از اینکه کارها در سریع ترین زمان ممکن اجرا می شوند، فقط از Volatile در جایی که تشخیص می دهید واقعاً مورد نیاز است استفاده کنید.