دیو به این فکر می کند که آیا می تواند یک کتاب کار را مجبور به بستن پس از مدت زمان مشخصی کند، مشروط بر اینکه در حال حاضر از آن استفاده نمی شود. در دفتر او، افراد دفترچه های کاری را که روی سرور هستند باز می کنند و سپس فراموش می کنند که باز هستند. وقتی این اتفاق میافتد، هیچ کس دیگری نمیتواند آنها را ویرایش کند، بنابراین او میخواهد اگر به مدت 60 دقیقه بدون مراقبت باقی بماند، کتابهای کاری را مجبور به بسته شدن کند.
انجام این کار با استفاده از ماکروها امکان پذیر است، اما ممکن است واقعاً مایل به انجام آن از منظر تجاری یا کاربر محور نباشید. به عنوان مثال، اجازه دهید بگوییم که یک کاربر دارای سه کتاب کار بر روی سیستم خود است تا بتوان بین آنها مقایسه کرد. ممکن است برای مدتی طولانی با دو تا از کتابهای کار گره بخورید، که سومین کتابی است که باعث خاموش شدن میشود. اگر کد VBA شما به درستی نوشته نشده باشد، ممکن است در نهایت هر کدام از کتابهای کاری را که در زمان کنونی فوکوس داشته باشد، خاموش کند - واضح است که نتیجهای که شما نمیخواهید رخ دهد.
علاوه بر این، هنگام بسته شدن، با تغییرات ذخیره نشده چه میکنید؟ اگر آنها را ذخیره کنید، با این مشکل مواجه می شوید که شاید کاربر قصد ذخیره آنها را نداشته است. اگر آنها را ذخیره نکنید، مشکل برعکس رخ می دهد - شاید داده های زیادی وجود داشته باشد که باید ذخیره می شد. شما نمی توانید روش بسته شدن را بپرسید که آیا اطلاعات باید ذخیره شوند یا خیر. که کتاب کار را به همان اندازه باز نگه می دارد که آن را باز (و استفاده نشده) نگه می دارد.
یک راه حل ممکن این است که به سادگی کتاب کار را به اشتراک بگذارید یا به صورت مشترک (Excel 2019 و Excel در Office 365) بنویسید. اگر اشتراکگذاری یا نویسندگی مشترک را فعال کنید (همانطور که در ExcelTips دیگر بحث شد )، چندین نفر میتوانند همزمان یک کتاب کار مشابه را باز کنند. اگر یکی از آن افراد آن را باز بگذارد، هیچ کس دیگر ناراحت نمی شود زیرا هنوز هم می تواند آن را باز کند و به صورت اختیاری، تغییراتی در کتاب کار ایجاد کند.
اگر تصمیم دارید مسیر کلان را طی کنید، راه حل نسبتاً ساده است. شما به نوعی ساختار تایمر نیاز دارید (که به راحتی با استفاده از روش OnTime پیاده سازی می شود) و راهی برای بررسی اینکه آیا شخصی در حال انجام کاری در کتاب کار است یا خیر.
برای شروع، کد زیر را به یک ماژول ماکرو استاندارد اضافه کنید. توجه داشته باشید که سه روال وجود دارد که باید اضافه شود:
Dim DownTime As Date
Sub SetTimer()
DownTime = Now + TimeValue("01:00:00")
Application.OnTime EarliestTime:=DownTime, _
Procedure:="ShutDown", Schedule:=True
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime EarliestTime:=DownTime, _
Procedure:="ShutDown", Schedule:=False
End Sub
Sub ShutDown()
Application.DisplayAlerts = False
With ThisWorkbook
.Saved = True
.Close
End With
End Sub
این سه روال نسبتاً ساده هستند. دو مورد اول به ترتیب تایمر را روشن کرده و خاموش می کنند. توجه داشته باشید که این روال ها از متغیر DownTime استفاده می کنند که خارج از هر یک از روال ها اعلام شده است. به این ترتیب می توان از محتویات آن در چندین روال استفاده کرد.
روال سوم، ShutDown، برنامه ای است که در واقع کتاب کار را می بندد. فقط در صورتی فراخوانی می شود که روش OnTime منقضی شود، در پایان یک ساعت. بدون ذخیره تغییراتی که ممکن است ایجاد شده باشد، کتاب کار را می بندد.
روال های بعدی (چهار مورد از آنها وجود دارد) باید به شی ThisWorkbook اضافه شوند. ویرایشگر VBA را باز کنید و روی شی ThisWorkbook در Project Explorer دوبار کلیک کنید. در پنجره کدی که اکسل باز می شود، این روال ها را قرار دهید:
Private Sub Workbook_Open()
Call SetTimer
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call StopTimer
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Call StopTimer
Call SetTimer
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Excel.Range)
Call StopTimer
Call SetTimer
End Sub
دو روال اول هنگام باز شدن کتاب کار و بسته شدن آن فعال می شوند. تایمر را روشن می کنند و خاموش می کنند. هر زمان که کاربرگ مجدداً محاسبه شود یا هر زمان که شخصی در کتاب کار انتخابی انجام دهد، دو روال دیگر به طور خودکار اجرا می شوند. هر دو شاخص خوبی هستند که نشان می دهد شخصی از کتاب کار استفاده می کند (به صورت غیر فعال باز نیست). آنها تایمر را متوقف می کنند و سپس آن را مجدداً راه اندازی می کنند تا شمارش معکوس یک ساعته دوباره شروع شود.
استفاده از مجموعه ای از ماکروها مانند اینها یک نقطه ضعف دارد: شما به طور موثر قابلیت Excels Undo را حذف می کنید. هنگامی که یک ماکرو اجرا می شود، پشته Undo به طور خودکار توسط اکسل پاک می شود. از آنجایی که ماکروها با هر تغییری که در کتاب کار ایجاد میشود اجرا میشوند، تغییرات افراد قابل بازگشت نیستند. (هیچ راهی برای دور زدن این نقص وجود ندارد.)
مشکل دیگر این است که ماکروها را فقط میتوان در کتابهای دارای قابلیت ماکرو ذخیره کرد. بنابراین، راهحل مبتنی بر ماکرو برای فایلهای XLSX معمولی کار نخواهد کرد، زیرا اجازه ماکروها را در آنها نمیدهند. در آن صورت، شما به راهحلهای غیر کلان محدود میشوید، مانند روشن کردن اشتراکگذاری کتاب کار یا نویسندگی مشترک.