"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","

"error":"message":"服务需要 JSON-RPC","code":0,"origin"

Artisan 错误 "error":"type":"PDOException","message":"SQL