我正在为 Excel 编写一个 VBA 宏,以删除没有特定标题的列。我已经接近了,但在删除列的方式上遇到了一个奇怪的问题。
我正在使用一个简单的嵌套 IF。奇怪的是,当我运行代码时,它只删除不在我的列表中的所有其他列。我必须运行宏 4 或 5 次才能得到想要的结果。该代码旨在成为更大宏的一部分,并且也适用于其他用户,因此使其第一次正常工作是关键。
Sub DeleteColumns()
Set MR = Range("A1:W1")
For Each cell In MR
If cell.Value <> "Cartons" Then
If cell.Value <> "ShipVia" Then
If cell.Value <> "Name" Then
If cell.Value <> "Address" Then
If cell.Value <> "City" Then
If cell.Value <> "State" Then
If cell.Value <> "Zip" Then
cell.EntireColumn.Delete
End If
End If
End If
End If
End If
End If
End If
Next
End Sub
最佳答案
你的问题
您看到的问题是由于您正在删除循环范围内的列所致。当您删除列时,您循环遍历的范围会发生变化,这会导致列被跳过(与您的结果一致)。为了解决这个问题,您可以使用 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
属性(property)
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
关于excel - 如何删除没有特定标题的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261161/