根据单元格值vba删除列

时间:2017-11-03 13:03:17

标签: vba excel-vba excel

我在Excel中有产品详细信息列表,第2行有标题,第3行有产品详细信息。

在C栏中,我的状态为“打开”或“已关闭”,如果列表为“仅打开”,我希望vba代码可以删除整个范围,因此,如果找到则不会关闭。如果数据同时具有“已关闭”和“已打开”或“仅已关闭”,则无需执行任何操作,只需将数据保留原样即可。

这是我已编写的较大代码的一部分,因此我希望使用vba代码实现此目的。

我不确定是否需要将范围设置为C列以及如何解释rng.Cells(q, 1).Value。现在它看起来像我的代码只是一步一步,没有错误但没有任何反应。我提供了我的测试数据和结果的图片。

Sub test()


    Dim Satus As Worksheet
    Dim LR1, q As Long
    Dim rng As Range


    Set Status = Worksheets("Sheet1")
    LR1 = Status.Cells(Rows.Count, "B").End(xlUp).Row
    Set rng = Status.Range("B2:G" & LR1)


    For q = 3 To LR1
        If InStr(1, rng.Cells(q, 1).Value, "Closed") = 0 Then
             Else
       Status.Columns("B:G").EntireColumn.Delete
       Status.Range("B2").Value = "No Closed Status"
        End If
    Next q
    End Sub

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

通过直接使用对象并使用Excel的本机函数来简化:

static bool IsSubclassOfRawGeneric(Type generic, Type toCheck)
    {
        while (toCheck != null && toCheck != typeof(object))
        {
            var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
            if (generic == cur)
            {
                return true;
            }
            toCheck = toCheck.BaseType;
        }
        return false;
    }

Option Explicit Sub Test() Dim Status As Worksheet Set Status = Worksheets("Sheet1") With Status Dim LR1 As Long LR1 = .Range("B" & .Rows.Count).End(xlUp).Row If .Range("C3:C" & LR1).Find("Closed", lookat:=xlWhole) Is Nothing Then .Range("C3:C" & LR1).EntireRow.Delete End If End With End Sub 是因为Is Nothing返回范围对象(如果已找到)。如果找不到,它将返回,基本上,没有。

答案 1 :(得分:0)

使用Worksheetfunction countif很简单。

Sub test()
    Dim Satus As Worksheet
    Dim LR1, q As Long
    Dim rng As Range, rngDB As Range
    Dim cnt As Long

    Set Status = Worksheets("Sheet1")
    With Status
        LR1 = .Cells(Rows.Count, "B").End(xlUp).Row
        Set rng = Status.Range("B2:G" & LR1)
        Set rngDB = .Range("c3:c" & LR1)
        cnt = rngDB.Rows.Count
        If WorksheetFunction.CountIf(rngDB, "Open") = cnt Then
            rng.EntireColumn.Delete
           .Range("B2").Value = "No Closed Status"
           .Range("a1") = "Data1 Result"
        End If
    End With
End Sub

答案 2 :(得分:0)

我认为这应该可以解决您的问题。您无法在for循环中决定整列的状态。您必须收集所有单个状态并在之后执行更改。

Sub test()

Dim Satus As Worksheet
Dim LR1, row As Long
Dim rng As Range
'Dim lOpen As Long
Dim lClosed As Long

Set Status = ThisWorkbook.ActiveSheet
LR1 = Status.Cells(Rows.Count, "B").End(xlUp).row
Set rng = Status.Range("B2:G" & LR1)

rngStart = 2                ' because of header line
rngEnd = rng.Rows.Count - 1 ' likewise
For row = rngStart To rngEnd
    Select Case rng.Cells(row, 2).Value
        'Case "Open"        ' just in case for future use
        '    lOpend = lOpend + 1
        Case "Closed"
            lClosed = lClosed + 1
        Case Else
     End Select
Next row

If lClosed = 0 Then
  rng.EntireColumn.Delete   ' delete just the data range
  Status.Range("B2").Value = "No Closed Status"
End If

End Sub