Сохранение местоположения пользователя перед запуском макроса (Microsoft Excel)
У Джона есть макрос, который выполняет некоторую обработку на различных листах в книге. Он хочет в начале макроса сохранить диапазон ячеек (или одну ячейку), выбранный пользователем. Он использует 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
Конечно, в Excel всегда есть несколько способов выполнить любую задачу. В этом случае вы можете сократить свой код, запомнив только активную ячейку и выбранный диапазон:
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
Первая строка возвращается к выбору, а вторая строка затем удаляет именованный диапазон. Единственным недостатком этого подхода является то, что активная ячейка не сохраняется; код предполагает, что вы хотите, чтобы верхняя левая ячейка в диапазоне была активной ячейкой, когда это будет сделано. Вы также должны знать, что если ваша обработка удаляет ячейки, которые составляют именованный диапазон, тогда код может работать неправильно — Excel не может перейти в место, которое больше не существует.
Конечно, возможно, вам вообще не придется запоминать какое-либо местоположение, если вы правильно запрограммируете свой макрос. Хотя VBA позволяет вам «перемещаться» и выбирать различные области ваших листов и книги, в большинстве случаев в этом нет необходимости. Вы можете, например, просто работать с разными диапазонами, а затем выполнять свою работу с этими диапазонами, никогда не изменяя текущий выбор или активную ячейку. Действительно, VBA позволяет изменять, переформатировать, сортировать, удалять и делать с ячейками практически все, что вы можете себе представить, без необходимости их выбора.
_Примечание: _
Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (6161) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365. Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:
link: / excel-Storing_a_Users_Location_before_Running_a_Macro [Сохранение местоположения пользователя перед запуском макроса]
.