用数组replace“如果Activecell.value = X”的长列表?

我写了一个macros来search一列文本,并删除与下面的macros中的文本相匹配的值(当文本匹配整行时被删除)。 要删除的值列表大约有140个唯一的数字,下面列出了5个数字作为示例。

什么是写这部分代码的简化方式,而不是写'Activecell.Value = XXXX或_'140次?

我正在研究如何使用数组来存储所有我想删除的值,但是我无法正确实现它。

谢谢您的帮助!

Sub DeleteClosedStores() Range("F7").Select While ActiveCell.Value <> "" If ActiveCell.Value = 25401 Or _ ActiveCell.Value = 8587 Or _ ActiveCell.Value = 8275 Or _ ActiveCell.Value = 8518 Or _ ActiveCell.Value = 8522 Or Then Selection.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End If Wend 

像这样写你的macros:

 Sub DeleteClosedStores() Range("F7").Select Dim KillArray KillArray = Array(25401, 8587, 8275,8518,8522) Dim f As Variant While ActiveCell.value <> "" f = Filter(KillArray, ActiveCell.value) If UBound(f) <> -1 Then Selection.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End If Wend End Sub 

当然@sarvesh是对的。 你需要在某处input你的值。

将所有这些值存储在VB整数数组中,并使用For...Next循环比较所有值。 但是仍然必须至lessinput一次这140个值才能存储到一个数组中。

我至less会使用工作表的“单元格”属性。 此方法遍历单元格,而不是移动ActiveCell。 这比移动活动单元要快得多。

 Private Sub deleteRows() Dim i As Integer i = 7 While Cells(i, "F").value <> "" If checkCondition(Cells(i, "F").value) Then Cells(i, "F").EntireRow.Delete End If i = i + 1 Wend End Sub Private Function checkCondition(value As String) As Boolean ' assuming everything is a number num = CLng(value) checkconditionmet = IIf(num = 25401 Or _ num = 8587 Or _ num = 8275 Or _ num = 8518 Or _ num = 8522, True, False) End Function 

这是O(n),但是如果你想把单元预加载到一个variables中,那么遍历这个variables,也就是O(n)(O(n)+ O(n))。 但是你不想迭代两次。

试试这个代码(顺便说一句,避免使用SelectActiveSth语句,它会让你的代码变慢):

 Sub DeleteClosedStores() Dim str1 As String Dim rng As Range str1 = "|25401|8587|8275|8518|8522|" Set rng = Range("F7") While rng.Value <> "" Set rng = rng.Offset(1) If InStr(1, str1, "|" & rng.Offset(-1) & "|") > 0 Then rng.Offset(-1).EntireRow.Delete End If Wend End Sub 

主要想法是使用例如“|”来分割你的值 像这样: str1 = "|25401|8587|8275|8518|8522|" ,然后用“|”夹住你的rng.Value 像这样"|" & rng.Offset(-1) & "|" "|" & rng.Offset(-1) & "|" (例如,如果rng.Offset(-1)值是8587 ,则代码将尝试查找|8587| in |25401|8587|8275|8518|8522| )。

非循环的答案会更快

这个使用带有testing的工作列来删除与AutoFilter匹配的行(除了行1中的标题)

 Sub KillEm() Dim rng1 As Range, rng2 As Range, rng3 As Range Set rng1 = Cells.Find("*", , xlValues, , xlByColumns, xlPrevious) Set rng2 = Cells.Find("*", , xlValues, , xlByRows, xlPrevious) Set rng3 = Range(Cells(rng2.Row, rng1.Column), Cells(1, rng1.Column)) Application.ScreenUpdating = False With rng3.Offset(0, 1) .FormulaR1C1 = "=SUM(COUNTIF(RC1,{25401,8587,8275,8518,8522}))=1" .AutoFilter Field:=1, Criteria1:="TRUE" .Offset(1, 0).Resize(rng3.Rows.Count - 1, 1).EntireRow.Delete .EntireColumn.Delete End With Application.ScreenUpdating = True End Sub