简体   繁体   中英

Hide excel worksheet via VBA

I have a workbook that has a number of worksheets each one with a colaborator name on it (Windows login username).

I've tried via VBA to loop through all Worksheets to match the actual Windows Logged On username with the matching Worksheet, and after the match is done, only that Worksheet is kept visible (with all the others being hiden).

I've managed to do this partially but i can only do it untill it finds the matching worksheet. For example, if the matching username is the third worksheet (in a total of ten for example) the code stops there. I want it to run through all worksheets and only then hide the non matching Worksheets.

First i have the following module:

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

Then, i call the previous module on the Workbook_Open() event:

Option Explicit
Dim WS As Worksheet

Private Sub Workbook_Open()

For Each WS In ActiveWorkbook.Worksheets
    WorksheetFilter
Next
End Sub

Any hints on how this can be achieved?

Thanks, Vítor

Use the code below, and put it in the Workbook module under the Workbook_Open event.

Just loop through all sheets and compare each one with the 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

Please see below: chopped your code around a bit. You do not need to defien the worksheets name. This is for the module level, you can call it in the workbook open event as per usual

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

Please let me know how this works for you! :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM