Проблемы, связанные с тем, что Case Else имеет приоритет над другими условиями Case в VBA excel - PullRequest
1 голос
/ 11 февраля 2020

У меня возникают проблемы, когда кажется, что Case Else имеет приоритет над другими Case условиями.

Идея макроса зависит от имени листа, применяется другой отдельный макрос. У меня есть около 8 листов, у которых есть специфические макросы c, связанные с каждым, а затем для остальных листов (~ 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 опущен, применяется правильный макрос.

1 Ответ

3 голосов
/ 11 февраля 2020

Выполнение, неожиданно возвращающееся к Case Else, является симптомом, подсказкой.

For Each sht In Worksheets

Точно, к какой именно c книге относится данный объект Sheets, зависит от слишком много вещей для надежной .

Если код находится в модуле ThisWorkbook, то мы должны сделать это явно:

For Each sheet In Me.Worksheets

Но этот код может не в модуле ThisWorkbook, иначе нас бы здесь не было, поэтому ...

Если мы находимся в каком-либо другом модуле и хотим перебирать листы в ThisWorkbook, тогда мы использовал бы кодовое имя рабочей книги в качестве квалификатора:

For Each sheet In ThisWorkbook.Worksheets

Если мы находимся в каком-либо модуле, отличном от ThisWorkbook, то только Worksheets по существу ActiveWorkbook.Worksheets, и если мы не знаем из какой книги мы перебираем листы, есть вероятность, что мы не перебираем листы книги, которую мы считали активной; -)

Существует проверка Rubberduck , которая может найти все такие неявные / неквалифицированные ссылки ActiveWorkbook для вас (отказ от ответственности: я управляю Rubberduc к проекту).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...