通过VBA隐藏excel工作表

时间:2016-11-14 11:43:36

标签: excel vba excel-vba

我有一个工作簿,其中包含许多工作表,每个工作表上都有一个colaborator名称(Windows登录用户名)。

我尝试通过VBA遍历所有工作表以匹配实际的Windows Logged On用户名和匹配的工作表,并且在匹配完成后,只有该工作表保持可见(所有其他工作表都被隐藏)。 / p>

我已经成功地完成了这项工作,但我只能这样做,直到它找到匹配的工作表。例如,如果匹配的用户名是第三个工作表(例如总共十个),则代码停在那里。我希望它能够遍历所有工作表,然后才隐藏不匹配的工作表。

首先,我有以下模块:

Sub WorksheetFilter()

Dim Username As String
Dim Worksheetname As String

Worksheetname = ActiveWorkbook.ActiveSheet.Name

Username = Environ("Username")

If Worksheetname <> Username Then
   ActiveSheet.Visible = False
End If

End Sub

然后,我在Workbook_Open()事件上调用上一个模块:

Option Explicit
Dim WS As Worksheet

Private Sub Workbook_Open()

For Each WS In ActiveWorkbook.Worksheets
    WorksheetFilter
Next
End Sub

有关如何实现这一目标的任何提示?

谢谢, 维克托•

2 个答案:

答案 0 :(得分:4)

使用以下代码,并将其放在Workbook事件下的Workbook_Open模块中。

只需遍历所有工作表,然后将每个工作表与username进行比较。

Option Explicit

Public Sht As Worksheet


Private Sub Workbook_Open()

For Each Sht In ThisWorkbook.Sheets

    If Sht.Name = Environ("Username") Then
        Sht.Visible = xlSheetVisible
    Else
        Sht.Visible = xlSheetHidden

        ' option 2: use very hidden, only able to unhide through code (unable to unhide using right-click)
        'Sht.Visible = xlSheetVeryHidden
    End If

Next Sht

End Sub

答案 1 :(得分:1)

请参阅下面的内容:将代码切碎一下。您无需定义工作表名称。这是针对模块级别的,您可以按照常规

在工作簿打开事件中调用它
Option Explicit
Dim ws As Worksheet
Dim Username As String
Sub WorksheetFilter()

Username = Environ("Username")

For Each ws In ActiveWorkbook.Worksheets


    If ws.Name <> Username Then
        ws.Visible = False

    Else
        ws.Visible = True
    End If
Next ws
End Sub

请告诉我这对您有何帮助! :)