隐藏工作表完全支持userform

时间:2017-03-02 15:34:45

标签: excel vba excel-vba

我有一个userform,并希望这是打开工作簿时向用户显示的第一件事,并隐藏此表单后面的工作表。

我理解以下是执行此操作的代码:

Private Sub Workbook_Open()
Application.Visible = False
UserForm1.Show vbModeless
End Sub

这会成功执行操作,但我的工作表会在隐藏并显示用户窗体之前闪烁一两秒钟。 这足以让某人截取屏幕截图或查看用户表单背后的有价值信息。

它看起来也不是很整洁!

有没有办法改变VBA中的任何内容来实现这一目标?

我发现可以使用批处理脚本或类似的东西,但我没有这方面的经验,并且不希望在已经复杂的表单中添加另一个维度。

2 个答案:

答案 0 :(得分:1)

我选择隐藏所有敏感表的Workbook_BeforeClose事件。这样,在没有启用宏的情况下,您的数据对于打开文件的人来说仍然是隐藏的。

这是一个新的标准模块

Option Explicit
Option Private Module

Public Sub SheetsHidden(ByRef hidden As Boolean)
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.name <> "Home" And hidden Then 'your *safe* sheet name
            ws.Visible = xlSheetVeryHidden
        Else
            ws.Visible = xlSheetVisible
        End If
    Next ws
End Sub

然后您可以从ThisWorkbook模块

中调用它
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    SheetsHidden True
End Sub

对用户进行身份验证后,您可以使用参数False取消隐藏工作表。

我还建议探索UserForms,特别是:

With New UserForm1
    .Show vbModeless
    'do more with your form
End With

答案 1 :(得分:0)

根据设计,如果没有外部脚本或工具,则无法在不显示Excel的情况下打开Excel文件。

隐藏所有工作表的更简单方法是将文件另存为.xla(m)(或使用ThisWorkbook.IsAddin = True

Private Sub Workbook_Open()
    ThisWorkbook.IsAddin = True ' True by default for .xla(m) Excel Add-In files
    Application.Visible = Workbooks.Count
    UserForm1.Show vbModeless
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not ThisWorkbook.IsAddin Then ThisWorkbook.IsAddin = True
    If Not ThisWorkbook.Saved Then ThisWorkbook.Save
    If Workbooks.Count Then Application.Visible = True Else Application.Quit
End Sub

并以表格关闭事件:

Private Sub UserForm_Terminate()
    If Workbooks.Count Then ThisWorkbook.Close True Else Application.Quit
End Sub