جان یک ماکرو دارد که پردازش هایی را روی کاربرگ های مختلف در یک کتاب کار انجام می دهد. او می خواهد، در ابتدای ماکرو، محدوده سلول ها (یا تک سلولی) را که کاربر انتخاب کرده ذخیره کند. او برای تعیین این مورد از ActiveCell.Address استفاده می کند. سپس، در پایان ماکرو، میخواهد با همان محدوده انتخابی کاربر که در ابتدا انتخاب کرده بود، به کاربر بازگردد.
مشکل این است که ماکرو را میتوان در یک کاربرگ کاملاً متفاوت از جایی که کاربر شروع کرده به پایان رساند، و ActiveCell.Address فقط یک آدرس سلول را میدهد، نه نام کاربرگ و قطعاً محدودهای را نمیدهد. جان در مورد بهترین راه برای ذخیره چیزهایی که نیاز دارد میپرسد تا بتواند در انتهای ماکرو به مکان اصلی کاربران بازگردد.
برای بهترین شانس برای بازگشت کسی به جایی که شروع کرده است، سه عنصر وجود دارد: کتاب کار، کاربرگ و سلول. در واقع، این آخرین عنصر (سلول) ممکن است کمی ساده باشد، زیرا کاربر همیشه یک سلول را انتخاب می کند (این همان چیزی است که توسط ActiveCell.Address برگردانده می شود)، اما ممکن است علاوه بر این یک محدوده انتخاب شده باشد.
در اینجا چگونه می توانید هر چهار مورد را دریافت کنید:
Dim rngOrigSelection As Range
Dim rngOrigCell As Range
Dim sOrigWS As String
Dim sOrigWB As String
Set rngOrigSelection = Selection
Set rngOrigCell = ActiveCell
sOrigWS = ActiveSheet.Name
sOrigWB = ActiveWorkbook.Name
هنگامی که می خواهید بعداً کاربر را به جایی که بود برگردانید، می توانید از این نوع کد استفاده کنید:
Workbooks(sOrigWB).Activate
Sheets(sOrigWS).Select
rngOrigSelection.Select
rngOrigCell.Activate
البته، اکسل همیشه راه های متعددی دارد که می توانید هر وظیفه ای را انجام دهید. در این مورد، می توانید کد خود را تنها با به خاطر سپردن سلول فعال و محدوده انتخاب شده کوتاه کنید:
Dim rngOrigSelection As Range
Dim rngOrigCell As Range
Set rngOrigSelection = Selection
Set rngOrigCell = ActiveCell
هنگامی که می خواهید کاربر را به مکان بازیابی کنید، به شی والد موجود در VBA تکیه می کنید:
rngOrigSelection.Parent.Parent.Activate
rngOrigSelection.Parent.Select
rngOrigSelection.Select
rngOrigCell.Activate
شی والد محدوده انتخابی که ذخیره کردید، کاربرگی است که آن محدوده در آن قرار دارد، و والد آن شی والد، کتاب کاری است که کاربرگ در آن قرار دارد.
روش دیگر این است که به سادگی در ماکرو خود، یک محدوده با نام ایجاد کنید که به هر چیزی که کاربر انتخاب کرده است اشاره دارد:
ActiveWorkbook.Names.Add Name:="MyOrigPlace", RefersTo:=Selection
بعد از اینکه پردازش خود را انجام دادید، وقتی آماده بازگشت به آنچه کاربر انتخاب کرده بودید، از این کد استفاده می کنید:
Application.Goto Reference:="MyOrigPlace"
ActiveWorkbook.Names("MyOrigPlace").Delete
خط اول به انتخاب باز می گردد و خط دوم محدوده نامگذاری شده را حذف می کند. تنها اشکال این روش این است که سلول فعال حفظ نمی شود. این کد فرض میکند که میخواهید پس از اتمام، سلول بالا سمت چپ در محدوده، سلول فعال باشد. همچنین باید توجه داشته باشید که اگر پردازش شما سلولهایی را که محدوده نامگذاری شده را تشکیل میدهند حذف کند، ممکن است کد به درستی کار نکند - اکسل نمیتواند به جایی برود که دیگر وجود ندارد.
البته، اگر ماکرو خود را به درستی کدنویسی کنید، ممکن است اصلاً مجبور نباشید مکانی را به خاطر بسپارید. در حالی که VBA به شما این امکان را می دهد که "حرکت کنید" و قسمت های مختلف برگه ها و کتاب کار خود را انتخاب کنید، در بیشتر موارد این کار ضروری نیست. به عنوان مثال، میتوانید به سادگی با محدودههای مختلف کار کنید و سپس کار خود را روی آن محدودهها انجام دهید، بدون اینکه هرگز انتخاب یا سلول فعال فعلی را تغییر دهید. در واقع، VBA به شما این امکان را میدهد که بدون نیاز به انتخاب سلولها، تغییر، قالببندی مجدد، مرتبسازی، حذف و تقریباً هر کاری را که تصور میکنید روی سلولها انجام دهید.