我需要这段代码来删除包含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
答案 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)
我想我会稍微改变一下这个问题,如下所示:
确定要评估的单元格范围。加载从A1到D的所有内容,以及要评估到数组中的最后一行。
从数组的底部开始(为清晰起见,称为“arr”),确定值是否为arr(x,4)=“”或arr(x,4)= 0.如果是,则确定删除电子表格中对应于“x”的行。 (注意:如果您使用Option Base 0或未指定基数,则需要删除电子表格中的行(x + 1)。
请注意,您必须从电子表格底部开始处理删除,而不是从顶部开始。如果从顶部开始,则最终会将其他行偏移1对于每个被删除的行,所以删除第一行后的每一行都是错误的。
不确定这是否有用。让我知道。