"Worksheet.Visible = xlSheetVisible" 更改活动选项卡
Posted
技术标签:
【中文标题】"Worksheet.Visible = xlSheetVisible" 更改活动选项卡【英文标题】:"Worksheet.Visible = xlSheetVisible" Changes the Active Tab 【发布时间】: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
【问题讨论】:
【参考方案1】:我也无法复制错误...但您可以在确实产生错误的工作簿中尝试此操作...
Set oldActive = ActiveSheet
mySheet.Visible = xlSheetVisible
oldActive.Activate
【讨论】:
现在唯一的问题是,在这变得比在每个循环中添加Application.Wait (Now)
更快之前,我需要处理多少个选项卡?我不知道答案,但我确实喜欢你的解决方案,因为它更清楚它正在解决什么问题,并且无论计算机有多慢(或多快?)都应该工作。【参考方案2】:
我相信这是需要非常不推荐DoEvents
的著名案例。
它基本上让 Windows 处理队列中等待执行的所有消息。
因此通常不建议在较大的应用程序中使用它,但在简单的 VBA 宏中会产生奇迹。
试试这个:
Case Else
mySheet.Visible = xlSheetVisible
DoEvents
End Select
希望对你有帮助。
【讨论】:
这只是DoEvents
而不是Application.DoEvents
!
不幸的是,添加DoEvents
并不能解决问题,所以我想我不会使用这个非常不推荐的功能:\
@Rory 我的错,已修复。谢谢。以上是关于"Worksheet.Visible = xlSheetVisible" 更改活动选项卡的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ["tag":"google","count":1,"tag":"microsoft",&q
"message":"请求失败,状态码 500","name":"Error","stack":&q
"errors":"errors":["detail":"您无权执行此操作。","code":&qu
"Navicat" , "mysql" , "xxx.war" , "tomcat",“JDK","