【问题标题】:vba if cells do not equal values then deletevba 如果单元格不等于值,则删除
【发布时间】:2018-07-19 21:27:43
【问题描述】:

我对 VBA 还很陌生,我似乎无法通过 google 弄清楚这一点。

我正在尝试遍历工作表并使用 If 语句根据它们的第 1 行值删除不必要的列。我正在尝试这样做:

    Sub Macro1
    Dim cell As Range
    For Each cell In Rows("1")
    If cell.Value <>  "order_number", "tax_details", "etc"
    Then .EntireColumn.delete
    End Sub

但我似乎无法弄清楚如何将“If cell.Value”语句与多个值一起使用,也无法弄清楚如何删除我不想要的列。任何帮助深表感谢。

干杯,

贾斯汀

编辑:感谢所有回复,一切都非常有帮助。解决了这个问题,我学到了很多。

【问题讨论】:

    标签: vba excel if-statement


    【解决方案1】:

    你很接近。

    1. 您的For 循环必须以Next 语句结束
    2. 您的Then 必须与您的If 出现在同一行才有效,并且应该以End If 结束(除非您使用单行)
    3. 您必须单独测试您的条件,并用AND 分隔它们
    4. Cell 已经是这里的关键字(Range 的子类),所以将该变量更改为 rngCell 或其他不同的值。
    5. Rows("1") 作为显式范围会更好,否则它将逐字逐句遍历该行中的每一列。有很多列。

    Sub Macro1
        Dim rngCell As Range
        For Each rngCell In Range("A1:GZ1").Cells
            If rngCell.Value <>  "order_number" And rngCell.Value <>  "tax_details" AND rngCell.Value <> "etc" Then 
                 rngCell.EntireColumn.delete
            End If
        Next cell
    End Sub
    

    【讨论】:

    • 我建议不要使用任意范围,而是使用For Each rngCell in Rows(1).SpecialCells(xlCellTypeValues) 来确保您将始终获得所有包含值的单元格。如果GZ1之后有数据,则忽略。
    • 这是一个更好的方法。 Range("A1").End("xlToRight") 在这里也可能有用。只要不是直的Row(1)
    • 您需要从右到左循环,否则可能会丢失一些删除
    • 最好将删除集联合起来,以后再全部删除。您正在从左到右检查列标题。
    • 感谢所有的指点。有没有办法用 For Each 函数从右到左循环?
    【解决方案2】:

    似乎没有其他回应可以解决您在删除列时从左到右循环的事实。从下到上删除行并从右到左删除列,否则您可能会跳过单元格/列。

    Sub Macro1
        Dim i as long
    
        with worksheets("sheet1")
            For i=.cells(1, .columns.count).end(xltoleft).column to 1 step-1
                select case lcase(.cells(1, i).value)
                    case "order_number", "tax_details", "etc"
                        'do nothing
                    case else
                        .columns(i).entirecolumn.delete
                end select
            next i
        end with
    End Sub
    

    【讨论】:

    • 试图在“For”行的语法下。你为什么使用“end(xltoleft).column 而不是“end(xltoright)”?如果你退后一步,你的开始列不需要是最后一个吗?还是我错过了什么?谢谢
    • 我不是从 A1 开始看的。我从 XFD1 (.cells(1, .columns.count)) 开始向左看。在所有情况下都更加可靠。
    【解决方案3】:

    为了测试多个条件,您使用逻辑运算符(AND、OR、NOT 等)来创建单个逻辑语句(即所有 3 个的单个值)。如果您希望任何条件起作用,请使用“或”,如果您需要满足所有 3 个条件,请使用 AND。

    If cell.Value <>  "order_number", "tax_details", "etc"
    

    应该是

    If cell.Value <> "order_number" OR cell.value <> "tax_details"  OR cell.value <> "etc" then
    

    要以这种方式删除整个列,您需要引用要删除的列。如果您正在遍历行,则可以通过

    访问它
    Cell.EntireColumn.delete
    

    【讨论】:

      【解决方案4】:

      您必须每次比较/评估。

      If cell.Value <> "order_number" And cell.Value <> "tax_details" And cell.Value <> "etc"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 2017-06-20
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多