在最后一个活动表上重新打开工作簿

时间:2019-01-19 08:33:12

标签: excel vba

当我单击运行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

3 个答案:

答案 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):

Screenshot to demonstrate the first part

您可以添加第二个Stop进行检查,如果Application.Caption在自动重新打开后是否按预期设置: enter image description here

答案 2 :(得分:-1)

您的计划中存在逻辑缺陷。为什么要激活上次查看的工作表然后关闭工作簿而不保存所做的更改?

  1. 通过LstSht的名称设置一个公共变量。 (我希望它是工作表名称而不是工作表对象,但这可能是出于口味问题。
  2. 在每张纸的Activate事件上设置变量。请注意,首次打开工作簿时,可能不会发生Activate事件。因此,还必须在Workbook_Open事件中设置该变量。
  3. 在GoToLast过程中,请确保变量不包含值,以防万一。使用On Error Resume Next。此外,请确保该工作表已处于活动状态,但未将其激活。您可以使此过程成为函数,并在更改工作表(出于任何目的)时让它返回True。

整个过程的效果,正如您所介绍的那样,将是在您执行任何操作的过程中,突然激活最后一个活动工作表,然后关闭工作簿而不保存您的工作。迷人的主意!

相关问题