根据搜索删除行并查找

时间:2014-11-05 20:31:54

标签: vba excel-vba excel

我需要这段代码来删除包含0的行作为D列中的左边数字。我还需要在B列中删除与fl,37941或orlando匹配的行。但是现在它不会删除任何内容列D,除非列B中的内容匹配。所以这是代码以及我需要它做什么。现在它不会删除D列中的任何内容,除非列B中的内容匹配。我该如何修复它?

|A          |B          |C         |D

|           |orlando    |          |0        -Remove row

|           |           |          |37850    -Keep row

|           |Sorlando   |          |         -Remove row

|           |Ohio       |          |0434     -Remove row

|           |           |          |07856    -Remove row

|           |           |          |78560    -Keep row

|           |orlando    |          |         -Remove row

Sub Removal()
Dim i As Long, searchString As String

    For i = Range("B" & Rows.Count).End(xlUp).Row To 1 Step -1
        ' if a row is marked for deletion, delete it and continue.
      If Left(Range("D" & i), 1) = "0" Then
        Rows(i).Delete
          ' skip to next row
        GoTo NextRow
      End If

    searchString = LCase(Range("B" & i))

    If (InStr(1, searchString, "orlando") > 0) Or _
        (InStr(1, searchString, "fl") > 0) Or _
        (InStr(1, searchString, "37941") > 0) Then
        Rows(i).Delete
    End If

NextRow:
    Next i

End Sub

2 个答案:

答案 0 :(得分:0)

目前尚不完全清楚D列中的值是否伪装成数字或数字,而自定义格式产生前导零。我建议强制Left(Range("D" & i).Text, 1)或等效,以确保涵盖两种情况。

Sub Removal()
    Dim i As Long, searchString As String

    For i = Range("B" & Rows.Count).End(xlUp).Row To 1 Step -1
        ' if a row is marked for deletion, delete it and continue.
        searchString = LCase(Range("B" & i).Value)
        If Asc(Range("D" & i).Text) = 48 _
          Or CBool(InStr(1, searchString, "orlando", vbTextCompare)) _
          Or CBool(InStr(1, searchString, "fl", vbTextCompare)) _
          Or CBool(InStr(1, searchString, "37941", vbTextCompare)) Then
            Rows(i).Delete
        End If
    Next i

End Sub

VBA Asc(...)函数返回字符串中单个最左边字符的ASCII代码。零是 48 。我知道你正在转换为小写,但无论如何我都投入了vbTextCompare参数。如果D列中的数值是工作表公式的结果,则您需要将Range("D" & i).Text更改为Range("D" & i).Value,以使用公式的返回值作为条件。

答案 1 :(得分:0)

我想我会稍微改变一下这个问题,如下所示:

  1. 确定要评估的单元格范围。加载从A1到D的所有内容,以及要评估到数组中的最后一行。

  2. 从数组的底部开始(为清晰起见,称为“arr”),确定值是否为arr(x,4)=“”或arr(x,4)= 0.如果是,则确定删除电子表格中对应于“x”的行。 (注意:如果您使用Option Base 0或未指定基数,则需要删除电子表格中的行(x + 1)。

  3. 请注意,您必须从电子表格底部开始处理删除,而不是从顶部开始。如果从顶部开始,则最终会将其他行偏移1对于每个被删除的行,所以删除第一行后的每一行都是错误的。

    不确定这是否有用。让我知道。