如何点击运行ForceReopen的超链接时,重新打开工作簿至最后激活工作表?
解决方法:无保存重新打开工作簿并激活最后工作表
问题根源
你的原代码有两个核心问题:
- 公共变量
LstSht是内存变量,工作簿关闭后Excel会释放它,导致GoToLast找不到有效引用。 - 缺少重新打开工作簿的逻辑,只执行了关闭操作,无法完成“重新打开”的需求。
下面是修正后的完整代码,分模块实现:
1. 工作簿模块(ThisWorkbook)
这个模块负责记录每次离开的工作表,确保我们能追踪到最后激活的工作表:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) ' 用隐藏名称记录最后离开的工作表名称(避免内存变量丢失) On Error Resume Next ThisWorkbook.Names("LastActiveSheet").Delete ' 删除旧记录 On Error GoTo 0 ' 添加新的隐藏名称,存储当前工作表名称 ThisWorkbook.Names.Add _ Name:="LastActiveSheet", _ RefersTo:="""" & Sh.Name & """", _ Visible:=False End Sub
2. 标准模块(比如Module1)
这个模块包含ForceReopen主过程和ReopenAndActivate辅助过程,实现无保存关闭、重新打开并激活最后工作表:
Sub ForceReopen() Dim wbFullPath As String Dim lastSheetName As String ' 获取当前工作簿的完整路径 wbFullPath = ThisWorkbook.FullName ' 读取之前记录的最后工作表名称 On Error Resume Next lastSheetName = ThisWorkbook.Names("LastActiveSheet").RefersTo lastSheetName = Replace(lastSheetName, """", "") ' 去掉引用中的引号 On Error GoTo 0 ' 如果没有记录(比如第一次打开),默认用第一个工作表 If lastSheetName = "" Then lastSheetName = ThisWorkbook.Sheets(1).Name End If ' 将路径和工作表名称存入注册表(关闭后仍能读取) SaveSetting _ AppName:="WorkbookReopenSettings", _ Section:="SessionInfo", _ Key:="WorkbookPath", _ Setting:=wbFullPath SaveSetting _ AppName:="WorkbookReopenSettings", _ Section:="SessionInfo", _ Key:="LastSheet", _ Setting:=lastSheetName ' 安排1秒后执行重新打开操作(给Excel足够时间关闭当前工作簿) Application.OnTime Now + TimeValue("00:00:01"), "ReopenAndActivate" ' 不保存更改关闭当前工作簿 ThisWorkbook.Close SaveChanges:=False End Sub Sub ReopenAndActivate() Dim wbPath As String Dim lastSheetName As String Dim targetWorkbook As Workbook ' 从注册表读取之前存储的信息 wbPath = GetSetting( _ AppName:="WorkbookReopenSettings", _ Section:="SessionInfo", _ Key:="WorkbookPath", _ Default:="") lastSheetName = GetSetting( _ AppName:="WorkbookReopenSettings", _ Section:="SessionInfo", _ Key:="LastSheet", _ Default:="") ' 重新打开目标工作簿 If wbPath <> "" Then Set targetWorkbook = Application.Workbooks.Open(Filename:=wbPath) ' 尝试激活最后工作表(容错:如果工作表被删除,跳过激活) If lastSheetName <> "" Then On Error Resume Next targetWorkbook.Sheets(lastSheetName).Activate On Error GoTo 0 End If End If ' 清理注册表中的临时信息(避免残留) DeleteSetting _ AppName:="WorkbookReopenSettings", _ Section:="SessionInfo" End Sub
关键说明
- 注册表存储:用
SaveSetting和GetSetting把工作簿路径和最后工作表名称存在Windows注册表中,工作簿关闭后这些信息不会丢失,确保重新打开时能读取。 - 容错处理:添加了错误捕获,比如工作表被删除时不会报错,默认用第一个工作表。
- 时间延迟:
Application.OnTime设置1秒延迟,给Excel足够时间关闭当前工作簿,避免打开冲突。
内容的提问来源于stack exchange,提问作者user2319146
相关产品推荐
相关产品推荐

