在VBA excel中,“ Case Else”问题优先于其他“ Case”条件

问题描述 投票:1回答:1

我遇到的问题是Case Else的优先级高于其他Case的条件。

宏的概念取决于工作表名称,将应用另一个单独的宏。我大约有8张纸,每张纸都有与之相关的特定宏,然后对于其余的纸(约20张),我使用Case Else并应用一个单独的宏。问题是,当末尾有Case Else功能时,将不应用任何其他Case。当我删除Case Else时,正确的宏将应用于工作表。好像Case Else成为默认值/优先。我在下面尝试了应用单独的宏的替代方法,但问题仍然存在:

Sub Specify()

    Dim Fun As String
    Dim sht As Worksheet

    For Each sht In Worksheets
        Select Case sht.Name
            Case "NB12", "NB15"
                Application.Run "Groundwater_Macros.xlsm!limits_Alluvium"
            Case "NB24"
                Application.Run "Groundwater_Macros.xlsm!limits_BOCOBOML_GFA"
            Case "NB16", "NB17", "NB19", "NB20", "Bore 31"
                Application.Run "Groundwater_Macros.xlsm!limits_BOCOBOML_MIA"
            Case "Bore 47", "Bore 48"
                Application.Run "Groundwater_Macros.xlsm!limits_FracturedRock_GFA"
            Case "Bore 4", "Bore 4a", "Bore 40"
                Application.Run "Groundwater_Macros.xlsm!limits_FracturedRock_MIA_West"
            Case "Bore 30"
                Application.Run "Groundwater_Macros.xlsm!limits_FracturedRock_MIA_East"
            Case Else
                Application.Run "Groundwater_Macros.xlsm!limits_Monitoring_bores"
                Debug.Print sht.Name

        End Select
    Next sht

End Sub
Sub Specify_test()


    Dim Fun As String
    Dim sht As Worksheet

    For Each sht In Worksheets
        Select Case sht.Name
            Case "NB12", "NB15"
                Call limits_Alluvium
            Case "NB24"
                Call limits_BOCOBOML_GFA
            Case "NB16", "NB17", "NB19", "NB20", "Bore 31"
                Call limits_BOCOBOML_MIA
            Case "Bore 47", "Bore 48"
                Call limits_FracturedRock_GFA
            Case "Bore 4", "Bore 4a", "Bore 40"
                Call limits_FracturedRock_MIA_West
            Case "Bore 30"
                Call limits_FracturedRock_MIA_East
            Case Else
                Call limits_Monitoring_bores
                If Len(Fun) Then Fun = Fun & vbCr
                Fun = Fun & sht.Name
        End Select
    Next sht
    MsgBox Fun, vbInformation, "Sheets not processed"


End Sub
Sub Specify_test2()


    Dim Fun As String
    Dim sht As Worksheet

    For Each sht In Worksheets
        'Select Case sht.Name
            If sht.Name = "NB12" Or sht.Name = "NB15" Then
                limits_Alluvium
            ElseIf sht.Name = "NB24" Then
                limits_BOCOBOML_GFA
            ElseIf sht.Name = "NB16" Or sht.Name = "NB17" Or sht.Name = "NB19" Or sht.Name = "NB20" Or sht.Name = "Bore 31" Then
                limits_BOCOBOML_MIA
            ElseIf sht.Name = "Bore 47" Or sht.Name = "Bore 48" Then
                limits_FracturedRock_GFA
            ElseIf sht.Name = "Bore 4" Or sht.Name = "Bore 4a" Or sht.Name = "Bore 40" Then
                limits_FracturedRock_MIA_West
            ElseIf sht.Name = "Bore 30" Then
                limits_FracturedRock_MIA_East
            Else
                limits_Monitoring_bores
            End If
        'End Select
    Next sht

End Sub
Sub Specify_test3()

Dim Fun As String
Dim sht As Worksheet

For Each sht In Worksheets
    Select Case sht.Name
    Case "NB12", "NB15": Call limits_Alluvium
    Case "NB24": Call limits_BOCOBOML_GFA
    Case "NB16", "NB17", "NB19", "NB20", "Bore 31": Call limits_BOCOBOML_MIA
    Case "Bore 47", "Bore 48": Call limits_FracturedRock_GFA
    Case "Bore 4", "Bore 4a", "Bore 40": Call limits_FracturedRock_MIA_West
    Case "Bore 30": Call limits_FracturedRock_MIA_East
    Case Else: Call limits_Monitoring_bores
    End Select
Next sht

End Sub

我已经对工作表名称进行了故障排除。我认为这不是问题,因为当省略Case Else时,将应用正确的宏。

excel vba
1个回答
2
投票

执行意外降到Case Else是一种症状,一个线索。

For Each sht In Worksheets

Sheets对象确切属于哪个特定工作簿,取决于要工作的太多事情可靠地>。

如果代码在ThisWorkbook模块中,那么我们应该使它明确:

For Each sheet In Me.Worksheets

但是该代码不能在ThisWorkbook模块中,否则我们将不在这里,所以...

如果我们在任何其他模块中,并且想要迭代ThisWorkbook中的工作表,那么我们将使用工作簿的代码名称

作为限定符:
For Each sheet In ThisWorkbook.Worksheets

如果我们不在ThisWorkbook之外的任何模块中,那么Worksheets本质上就是ActiveWorkbook.Worksheets,如果我们不知道

我们要从哪个工作簿中迭代工作表,则有机会“不是在迭代我们认为是活跃的工作簿的表格;-)

有一个Rubberduck inspection可以为您找到所有这样的隐式/不合格ActiveWorkbook引用(免责声明:我管理Rubberduck项目)。>>

© www.soinside.com 2019 - 2024. All rights reserved.