“Worksheet.Visible = xlSheetVisible”更改“活动”选项卡

为什么Excel使用下面的代码更改活动工作表,以及如何(优雅地/恰当地)阻止它执行此操作?

我有一个工作簿与许多选项卡,并使用VBA筛选基于我的select列表框中的可见工作表。 在程序显示一个隐藏表格后暂停程序,使用断点或Application.Wait (Now) ,使得所有的东西都运行正常,但是这样做会让我觉得很糟糕,而且更喜欢另一种方法。 我不能在有许多空白标签的新工作簿中重现错误,并且在开始和结束时删除Application.ScreenUpdating调用也不会改变我的结果,所以我认为这是Excel花费太长的时间来处理我的每张表,这是造成这个奇怪的错误。

这个bug很烦人,因为如果我不小心在列表框中select了错误的项目,Excel会切换到另一个工作表,我必须手动点击返回到包含该列表框的工作表来修复我的select。

 Application.ScreenUpdating = False For Each mySheet In Worksheets Select Case mySheet.Name Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "SOP", "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", "SOP", "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", "SOP", "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 

我也不能重复错误…但是你可以尝试在工作簿中产生错误…

 Set oldActive = ActiveSheet mySheet.Visible = xlSheetVisible oldActive.Activate 

我相信这是非常不推荐的DoEvents需要的着名案例。

它基本上让Windows处理队列中等待执行的所有消息。

因此,通常不推荐在更大的应用程序中使用,但是在简单的VBAmacros中却有奇迹。

尝试这个:

  Case Else mySheet.Visible = xlSheetVisible DoEvents End Select 

希望能帮助到你。