جان متعجب است که آیا راهی در VBA برای شناسایی آخرین سلولی که توسط کاربر تغییر کرده است وجود دارد؟ او نمی خواهد بداند که آیا سلول توسط یک ماکرو تغییر کرده است یا خیر، اما به طور خاص توسط یک کاربر.
پاسخ بله است. می توانید از رویداد Worksheet_Change برای نوشتن کنترل کننده ای استفاده کنید که وقتی سلول خاصی در یک کاربرگ تغییر می کند، ضبط می کند. ماکرویی که این کار را انجام می دهد می تواند نسبتاً ساده باشد، مانند این:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.StatusBar = Target.Address
End Sub
ماکرو به سادگی آدرس آخرین تغییر را در نوار وضعیت قرار می دهد. شما می توانید ماکرو را طوری تغییر دهید که آدرس را در یک متغیر جهانی (که خارج از کنترل کننده رویداد اعلام می شود) به این صورت حفظ کند:
Dim sAddr As String
Private Sub Worksheet_Change(ByVal Target As Range)
sAddr = Target.Address(False, False)
End Sub
سپس می توانید از یک ماکرو معمولی برای بازیابی آدرس ذخیره شده در متغیر sAddr استفاده کنید و هر کاری که می خواهید با آن انجام دهید.
برای اطمینان از اینکه کنترل کننده رویداد هیچ تغییری را که توسط ماکروها انجام می شود را ثبت نمی کند، تنها راه برای انجام این کار این است که قبل از اجرای هر دستور ماکرو که کاربرگ را تغییر می دهد، مدیریت رویداد را خاموش کنید. به عنوان مثال، تغییر ویژگی EnableEvents زیر می تواند قبل و بعد از دستوری که محتویات سلول A1 را تغییر می دهد استفاده شود:
Application.EnableEvents = False
Range("A1") = "Hello"
Application.EnableEvents = True
با خاموش بودن مدیریت رویداد، کنترل کننده رویداد Worksheet_Change فعال نمی شود و آدرس «آخرین تغییر» به روزرسانی نمی شود. نتیجه این است که شما در نهایت فقط تغییرات انجام شده توسط کاربران را ردیابی می کنید، نه تغییرات انجام شده توسط ماکروها.