Excel VBA - 始终在打开时显示工作表

Aar*_*mas 4 excel vba excel-vba

如何使用VBA代码满足以下条件?

  1. 即使在没有启用宏的情况下打开worbook,特定工作表也始终显示在打开状态.
  2. 工作簿用户可以在处理任何工作表时保存工作簿.
  3. 保存不得干扰用户 - 不导航到不同的工作表,没有消息框等.
  4. 常规保存功能(Ctrl- S,单击保存)必须保持可用,使用时必须遵守上述标准.

我想避免在本问题的底部列出的尝试解决方案.

详细信息:
工作簿是在Windows 7计算机上使用Office 2007创建的.它是一个包含2个工作表的.xlsm工作簿,"Scheduler"和"Info".工作表标签不可见.并非所有用户都会在打开工作簿时启用宏.

打开工作簿后,用户将只能看到如下所示的一个工作表:

  • 如果宏被禁用,"Info"会显示,并且基本上告诉任何打开工作簿的人需要为完整工作簿功能启用宏.如果此时启用了宏,则会激活"调度程序".
  • "Scheduler"是存储和编辑数据的地方,如果启用了宏,则会自动显示.在未启用宏的情况下打开工作簿时,不会向用户显示该内容.

如果打开工作簿并禁用宏,则"Info"必须首先显示.

尝试解决方案(我正在寻找更好的解决方案!):

  • Workbook.BeforeSave事件中放置代码.这将保存并激活"信息",以便在打开工作簿时显示.但是,如果用户在"调度程序"中并且没有完成,我在此事件中找不到一种方法可以在保存后重新激活"调度程序".
  • 使用Application.OnKey重新映射Ctrl- sCtrl- S按键.不幸的是,这省去了使用鼠标保存的用户(单击文件...保存或Office按钮...保存).
  • Checking during every action and if needed activating "Scheduler". In other words, inserting code in something like the Workbook.SheetActivate or .SheetChange events to put "Scheduler" back into focus after a save with "Info" activated. This runs VBA code constantly and strikes me as a good way to get the other code in the workbook into trouble.
  • Placing code in the Worksheet("Info").Activate event, to change focus back to "Scheduler". This leads to the result of "Scheduler", not "Info", showing when the workbook is opened, even with macros disabled.

nun*_*bar 5

这不行吗?更新以妥善处理保存

Private Sub Workbook_Open()
    ThisWorkbook.Worksheets("Scheduler").Activate
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Worksheets("Info").Activate
    If (ShouldSaveBeforeClose()) Then
        Me.Save
    Else
        Me.Saved = True ' Prevents Excel Save prompt.
    End If
End Sub

Private Function ShouldSaveBeforeClose() As Boolean
    Dim workbookDirty As Boolean
    workbookDirty = (Not Me.Saved)
    If (Not workbookDirty) Then
        ShouldSaveBeforeClose= False
        Exit Function
    End If

    Dim response As Integer
    response = MsgBox("Save changes to WorkBook?", vbYesNo, "Attention")
    ShouldSaveBeforeClose= (response = VbMsgBoxResult.vbYes)
End Function
Run Code Online (Sandbox Code Playgroud)