用数组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))。 但是你不想迭代两次。
试试这个代码(顺便说一句,避免使用Select
和ActiveSth
语句,它会让你的代码变慢):
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