当我单击运行ForceReopen的超链接时,如何在上一个活动工作表上重新打开工作簿?我没有执行任何操作,因为未设置LstSht。 (请注意,当我运行ForceReopen时,我不想保存更改。)
' Workbook module
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Set LstSht = Sh
End Sub
' Standard module
Public LstSht As Worksheet
Sub ForceReopen()
Application.OnTime Now + TimeValue("00:00:01"), "GoToLast"
ThisWorkbook.Close False
End Sub
Sub GoToLast()
LstSht.Activate
End Sub
答案 0 :(得分:1)
您需要存储最后一个活动工作表的名称 somwhere 。由于您不想关闭文件,因此文件本身不能保存。
一种可能性是创建一个小的文本文件,其中仅包含工作表名称以在打开文件时激活。然后,工作簿打开事件可以读取文本文件并激活指定的工作表。
工作簿激活事件应更新文本文件。提供错误处理程序以允许文本文件不存在,或指定的工作表不存在。根据要使其坚固的程度,可能还需要处理工作表名称的更改。
文本文件的位置是设计选择:可能与Excel文件位于同一文件夹,或某些固定的配置文件夹。
另一种可能性是使用注册表而不是文本文件。
答案 1 :(得分:1)
在Application.Caption中自动重新打开期间记住一些内容
在强制重新打开工作簿的过程中,即使丢失了所有其他全局变量,也可以将ActiveSheet.Name
存储在Application.Caption
中。
' Within ThisWorkbook:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.Caption = "Last Active: " & ActiveSheet.Name
' Stop ' temporary to see the caption, but restart will not work!
End Sub
' Both following subs within a normal module:
Public Sub ForceReopen()
Application.OnTime Now + TimeValue("00:00:01"), "GoToLast"
ThisWorkbook.Close False
End Sub
Private Sub GoToLast()
Dim iLastSheet As Integer ' Position of text "Last Active" in Caption
iLastSheet = InStr(Application.Caption, "Last Active:")
' Stop ' temporary to see "Last Active: ..." in the caption
If iLastSheet > 0 Then
On Error Resume Next
ThisWorkbook.Sheets(Mid(Application.Caption, iLastSheet + 13)).Activate
On Error GoTo 0
Application.Caption = ""
End If
End Sub
如果您将工作簿保存在Sheet1中并开始ForceReopen
驻留在Sheet3中(通过按钮,通过超链接,通过手动执行,无论如何),则它将在Sheet3中重新打开。
要检查功能,您可以添加第一个Stop
来查看Application.Caption
的设置是否正确(此后工作簿将不会打开,因此您必须在测试后删除此Stop):
答案 2 :(得分:-1)
您的计划中存在逻辑缺陷。为什么要激活上次查看的工作表然后关闭工作簿而不保存所做的更改?
On Error Resume Next
。此外,请确保该工作表已处于活动状态,但未将其激活。您可以使此过程成为函数,并在更改工作表(出于任何目的)时让它返回True。整个过程的效果,正如您所介绍的那样,将是在您执行任何操作的过程中,突然激活最后一个活动工作表,然后关闭工作簿而不保存您的工作。迷人的主意!