vba如果单元格的值不相等,则删除

vba如果单元格的值不相等,则删除,vba,excel,if-statement,Vba,Excel,If Statement,我是VBA的新手,我似乎无法通过谷歌来理解这一点 我试图运行一个工作表,并使用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 Sub宏1 暗淡

我是VBA的新手,我似乎无法通过谷歌来理解这一点

我试图运行一个工作表,并使用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
Sub宏1
暗淡单元格作为范围
对于行中的每个单元格(“1”)
如果单元格值为“订单号”、“税务明细”等
然后。entireclumn.delete
端接头
但我似乎不知道如何将“If cell.Value”语句与多个值一起使用,也不知道如何删除我不想要的列。非常感谢您的帮助

干杯

贾斯汀


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

每次都必须进行比较/评估

If cell.Value <> "order_number" And cell.Value <> "tax_details" And cell.Value <> "etc"
If cell.Value“订单号”和cell.Value“税务详情”和cell.Value“等”
你很接近了

  • 您的
    For
    循环必须以
    Next
    语句结束
  • 您的
    Then
    必须与您的
    If
    出现在同一行才能有效,并且如果
    ,则应以
    结尾结束(除非您使用一行)
  • 您必须分别使用
    分隔条件进行测试
  • 单元格
    已经是这里的关键字(范围
    的子类),因此将该变量更改为
    rngCell
    或其他变量
  • 行(“1”)
    最好作为一个显式范围,否则它将直接循环该行中的每一列。那有很多专栏

  • Sub宏1
    Dim rngCell As范围
    对于范围内的每个RNG单元(“A1:GZ1”)。单元
    如果rngCell.Value“订单号”和rngCell.Value“税务详情”和rngCell.Value“等”,则
    rngCell.entireclumn.delete
    如果结束
    下一个细胞
    端接头
    
    为了测试多个条件,您可以使用逻辑运算符(AND、OR、NOT等)创建一条逻辑语句(即所有3条语句都有一个值)。如果您希望其中任何一个条件起作用,请使用“或”;如果您需要满足所有3个条件,请使用和

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

    似乎没有其他响应能够解决删除列时从左向右循环的问题。从下到上删除行,从右到左删除列,否则可能会跳过单元格/列

    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
    

    与其使用任意范围,我建议对第(1)行中的每个rngCell使用
    。SpecialCells(xlCellTypeValues)
    ,以确保始终获得包含值的所有单元格。如果GZ1之后有任何数据,这将忽略它。这是一种更好的方法<代码>范围(“A1”).End(“xlToRight”)
    在这里也可能有用。只要不是直接的
    行(1)
    您就需要从右向左循环,否则可能会丢失一些删除项。最好合并删除集,然后将它们全部删除。您正在从左到右检查列标题。感谢所有的指针。是否有一种从右到左循环For每个函数的方法?尝试使用“For”行的语法。为什么要使用“end(xltoleft).column而不是“end(xltoright)”?如果你向后走,你的起始列不需要是最后一列吗?还是我遗漏了什么?谢谢,我不从A1开始向右看。我从XFD1(.cells(1,.columns.count))开始向左看。在所有情况下都更可靠。
    If cell.Value <> "order_number" OR cell.value <> "tax_details"  OR cell.value <> "etc" then
    
    Cell.EntireColumn.delete
    
    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