我有一个工作簿,其中包含许多工作表,每个工作表上都有一个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
有关如何实现这一目标的任何提示?
谢谢, 维克托•
答案 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
请告诉我这对您有何帮助! :)