Сбой макроса при добавлении дополнительного условия «Если нравится, то»

#excel #vba

#excel #vba

Вопрос:

У меня есть макрос, который отлично работает с двумя условиями в моем заявлении. Однако, когда я собираюсь добавить третий, макрос завершается с ошибкой.

Вот код. Это включает в себя третье условие (которое ищет 12212958). Если я удалю или закомментирую эту строку, она будет работать отлично. Когда это не удается, debug переводит меня к этой строке и выделяет эту строку.

Почему это должно быть?

 Sub Clear_Internal_Transactions()
  Dim Firstrow As Long
  Dim lastRow As Long
  Dim Lrow As Long
  Dim CalcMode As Long
  Dim ViewMode As Long

  With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
  End With
  
  With Sheets("DATA_IMPORT")
    Range("A1:F300").Sort Key1:=Range("B1"), Order1:=xlDescending
    
    'We select the sheet so we can change the window view
    .Select
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    .DisplayPageBreaks = False
    'Set the first and last row to loop through
    Firstrow = .UsedRange.Cells(1).row
    lastRow = .UsedRange.Rows(.UsedRange.Rows.Count).row
    'We loop from Lastrow to Firstrow (bottom to top)
    For Lrow = lastRow To Firstrow Step -1
      With .Cells(Lrow, "C")
        If Not IsError(.Value) Then
          If .Value Like "*12135709*" Then .EntireRow.Delete
          If .Value Like "*12135710*" Then .EntireRow.Delete
          If .Value Like "*12212958*" Then .EntireRow.Delete
        End If
      End With
    Next Lrow
  End With

  ActiveWindow.View = ViewMode
  With Application
      .ScreenUpdating = True
      .Calculation = CalcMode
  End With

End Sub
  

Ответ №1:

Попробуйте это вместо:

 Select Case True
    Case Instr(.Value, "12135709") > 0, Instr(.Value,"12135709")>0, Instr(.Value,"12212958")>0
       .EntireRow.Delete
End Select
  

Ответ №2:

Логика IF ошибочна — если строка удаляется при первом или втором IF, последующее IF выдаст ошибку, поскольку программа уже удалила соответствующую строку. Это не «третье условие», создающее проблему, это комбинация ваших данных и плохой работы программы. Вам следует рассмотреть возможность использования либо SELECT CASE , либо поместить свои IFS в одну строку, если значение похоже на ИЛИ (менее читаемое решение):

 If .Value Like "*12135709*" Or .Value Like "*12135710*" Or .Value Like "*12212958*" Then .EntireRow.Delete
  

Комментарии:

1. Спасибо за ваше объяснение, теперь я вижу недостаток в этом коде. Я взял его откуда-то еще и адаптировал с довольно ограниченными знаниями.