【发布时间】:2016-05-05 01:08:13
【问题描述】:
为什么 Excel 会使用下面的代码更改活动工作表,我如何(优雅/适当地)阻止它这样做?
我有一个包含许多选项卡的工作簿,并且正在使用 VBA 根据我在列表框中的选择来过滤可见工作表。在显示隐藏工作表后暂停程序,使用断点或Application.Wait (Now),使一切正常运行,但这让我觉得这是一种不好的做法,我更喜欢另一种选择。我无法在具有许多空白选项卡的新工作簿中重现该错误,并且在开始和结束时删除 Application.ScreenUpdating 调用也不会改变我的结果,所以我认为 Excel 处理我的每张工作表花费的时间太长,这是导致这个奇怪的错误。
这个错误很烦人,因为如果我不小心在列表框中选择了错误的项目,Excel 会切换到另一个工作表,我必须手动单击返回包含该列表框的工作表来修复我的选择。
Application.ScreenUpdating = False
For Each mySheet In Worksheets
Select Case mySheet.Name
Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "S.O.P.", "MFGD Time", "MFGD Group", "HowTo", ChrW(&H21BB)
'These sheets are always visible, so do nothing
Case Else
mySheet.Visible = xlSheetVisible 'or xlSheetHidden or xlSheetVeryHidden or xlSheetVisible
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Application.Wait (Now) 'WITHOUT THIS SLIGHT DELAY, ACTIVE TAB CHANGES
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Select
Next
For i = 1 To Worksheets("Labor Summary").ListBoxes("ListBoxForSlicers").ListCount
'The category names are "Div 1" and "Div 2", referenced here and in the ListBox from ColorIndexTable'
CategoryName = Application.WorksheetFunction.index(Range("ColorIndexTable[Category]"), i)
CategorySelected = Worksheets("Labor Summary").ListBoxes("ListBoxForSlicers").Selected(i)
If CategorySelected Then
Select Case CategoryName
Case "Div 1"
For Each mySheet In Worksheets
Select Case mySheet.Name
Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "S.O.P.", "MFGD Time", "MFGD Group", "HowTo", ChrW(&H21BB)
'These sheets are always visible, so do nothing
Case "MFGC", "CUT", "ASSM", "HOT MELT", "POT", "MOLD", "POST-OP", "MARK", "PACK", "PPRNT", "TEST"
'These sheets ought to be visible, so do nothing
Case Else
mySheet.Visible = xlSheetHidden
End Select
Next
Case "Div 2"
For Each mySheet In Worksheets
Select Case mySheet.Name
Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "S.O.P.", "MFGD Time", "MFGD Group", "HowTo", ChrW(&H21BB)
'These sheets are always visible, so do nothing
Case "CUT", "ASSM", "TEST", "POST-OP", "PACK"
'These sheets ought to be visible, so do nothing
Case Else
mySheet.Visible = xlSheetHidden
End Select
Next
End Select
End If
Next
Application.ScreenUpdating = True
【问题讨论】: