excel - 如何删除没有特定标题的列?

标签 excel vba

我正在为 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/

相关文章:

vba - Access 2007 VBA DoCmd.Close 不工作

excel - VBA Dir 在名为 ".."或 Documents.xlsx 的目录中提取 Ghost 文件

linux - 不一致的 CPAN 模块行为——该怪谁?

excel - 根据多个条件格式化

excel - 在 Excel VBA 中更改为加拿大 (CDN) 法语数字格式

VBA - EXCEL 删除指定范围以外的列

excel - VBA - 在打开工作簿之前检查它是否受到保护

vba - 在 Access 中使用 SQL Server 存储过程的输出参数

在 Excel 中运行 R 脚本

arrays - Excel:动态数组公式