John有一个宏,可以对工作簿中的各个工作表进行一些处理。他希望在宏的开头保存用户选择的单元格区域(或单个单元格)。他使用ActiveCell.Address来确定这一点。然后,在宏的末尾,他想返回给用户的选择范围与他们最初选择的范围相同。

问题是,宏可能在与用户开始的工作表完全不同的工作表上完成,并且ActiveCell.Address仅提供单元格地址,而不是工作表名称,并且绝对不是范围。 John想知道存储所需内容的最佳方法,以便他可以返回到宏末尾用户的原始位置。

为了使某人重返工作岗位的最佳机会,它包含三个元素:工作簿,工作表和单元。实际上,最后一个元素(单元格)可能有点简化,因为用户将始终选择一个单元格(这是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中可用的Parent对象:

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_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(6161)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较早菜单界面找到此技巧的版本: