Ваша проблема
Проблема, с которой вы сталкиваетесь, связана с тем, что вы удаляете столбцы внутри диапазона цикла.Когда вы удаляете столбец, диапазон, который вы циклически изменяете, приводит к пропуску столбцов (в соответствии с вашими результатами).Чтобы бороться с этим, вы можете использовать метод Union
, который позволяет удалять столбцы вне цикла, чтобы вы не столкнулись с сообщенной проблемой.В нижнем решении показано, как исправить сообщенную проблему, если вы решите удалить столбцы внутри цикла.
Выберите вариант
Select Case
.Выполните цикл по диапазону, и если ячейка отсутствует в списке в первом случае, она будет помечена для удаления во втором случае (Case Else
).
После того, как вы зациклили свои заголовки, удалите все столбцы одновременно, что означает, что во время цикла нет сдвига диапазона.
Sub DeleteColumns()
Dim iCell As Range, DeleteMe As Range
For Each iCell In Range("A1:W1")
Select Case iCell
Case "Cartons", "ShipVia", "Name", "Address", "City", "State", "Zip"
'Do Nothing
Case Else
If Not DeleteMe Is Nothing Then
Set DeleteMe = Union(DeleteMe, iCell)
Else
Set DeleteMe = iCell
End If
End Select
Next iCell
If Not DeleteMe Is Nothing Then DeleteMe.EntireColumn.Delete
End Sub
Массив
Вы можететакже цикл через массив.Обратите внимание, что цикл столбца движется в обратном направлении, чтобы остановить смещение соответствующего диапазона внутри цикла (ваша первоначальная проблема).Для этого вам нужно сбросить цикл For Each
и переключиться на For j = # - #
, чтобы вы могли использовать свойство Step -1
Sub Array_Method()
Dim Arr: Arr = Array("Cartons", "ShipVia", "Name", "Address", "City", "State", "Zip")
Dim i As Long, j As Long
For j = 23 To 1 Step -1
For i = UBound(Arr) To LBound(Arr)
If Arr(i) = Cells(1, j) Then
Cells(1, j).EntireColumn.Delete
End If
Next i
Next j
End Sub