#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. Спасибо за ваше объяснение, теперь я вижу недостаток в этом коде. Я взял его откуда-то еще и адаптировал с довольно ограниченными знаниями.