2016-11-14 167 views
0

我有一個工作簿,每個工作簿上都有一個名稱(Windows登錄用戶名)。通過VBA隱藏excel工作表

我已經嘗試通過VBA來循環所有工作表,以匹配實際的Windows登錄用戶名與匹配的工作表,並且匹配完成後,只有該工作表保持可見(與所有其他人都是隱藏的)。

我設法做到這一點,但我只能做到它直到它找到匹配的工作表。例如,如果匹配的用戶名是第三個工作表(例如總共爲十個),代碼就停在那裏。我希望它貫穿所有工作表,然後只隱藏不匹配的工作表。

首先我有以下模塊:

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 

如何可以做到這一點任何提示?

感謝, 維克托•

+0

是否將您的代碼鏈接到特定的工作表? – FDavidov

回答

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 
+0

如果要隱藏來自不同用戶的其他工作表,我會使用'xlSheetVeryHidden'來阻止他們取消隱藏它們。 –

+0

@TimWilkinson我知道這個選項(我使用了很多),但遵守PO請求,無論如何我也有這個選項 –

+0

謝謝你的幫助! :) –

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 

請讓我知道這是如何適用於您的! :)

+0

感謝您的幫助:) –

+0

高興地幫助:) – user1