Выход из оператора if без выхода - PullRequest
0 голосов
/ 04 июня 2019

У меня есть код VBA, который удаляет пустые ячейки, позволяя данным далее в столбце перемещаться вверх. Есть две вещи, которые я хочу исправить. Во-первых, я не хочу выходить из подпрограммы, я хочу выйти из оператора if. Я читал, что вы можете выйти из циклов, whiles, fors и т. Д. Но не ifs. Я не хочу выходить из подпрограммы, потому что в моей подпрограмме больше кода. Есть предложения?

У меня также возникают проблемы с добавлением еще одной строки в коде для запуска, если в верхней части столбца уже есть данные.

    Sub Remove_Empties ()

    Dim Last as Long
    Dim Mcol as Range

    Last = Cells(Rows.Count, "AD").End(xlUp).Row
    If Last = 1 Then Exit Sub 'no value only header in row 1
    'otherwise
    Set Mcol = Range("AD2:AD" & Last) 'contains any value
    Application.ScreenUpdating = True
    Mcol.SpecialCells(xlCellTypeBlanks).Delete xlUp
    Application.ScreenUpdating = True

    End Sub

Я хочу, чтобы он мог запускать следующие три сценария. Первый содержит данные в строке под заголовком. Второй имеет пару пустых ячеек. Третий имеет все пустые клетки. 1 не должен меняться, 2 должен меняться в соответствии с форматом 1, а 3 не должен делать ничего. 2 и 3 можно сделать с кодом выше, но не 1.

    1         2         3
    A       
    B  
    C         A
    D         B
              C
              D

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Возможно, что-то вроде этого, отметив следующее:

  • Вам не нужно две Application.ScreenUpdating = True строки.Вы, вероятно, можете избавиться от обоих.
  • Вам необходимо учитывать возможность отсутствия пустых ячеек (столбец 1).

Sub Remove_Empties()

    Dim Last As Long
    Last = Cells(Rows.Count, "AD").End(xlUp).Row

    If Last <> 1 Then
        Dim Mcol As Range
        Set Mcol = Range("AD2:AD" & Last) 'contains any value

        Dim cellsToDelete As Range

        On Error Resume Next
        Set cellsToDelete = Mcol.SpecialCells(xlCellTypeBlanks)
        On Error GoTo 0

        If Not cellsToDelete Is Nothing Then
            cellsToDelete.Delete shift:=xlUp
        End If
    End If

End Sub

Или слегка сжато:

Sub Remove_Empties()

    Dim Last As Long
    Last = Cells(Rows.Count, "AD").End(xlUp).Row

    If Last <> 1 Then
        On Error Resume Next
        Range("AD2:AD" & Last).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
        On Error GoTo 0 
    End If

End Sub
0 голосов
/ 04 июня 2019

Я просто добавлю еще один ответ, который вы, возможно, сможете использовать в своей логике (коде) для продвижения вперед. Использование простого оператора GoTo выйдет из If. Например:

Sub UsingGoTo()

    If Last = 1 Then
        'do something
        GoTo CheckComplete
    Else
        'if not maybe exit sub?
        Exit Sub
    End If

CheckComplete:
    'continue with program

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