Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 是否使用其他工作表中某列的值从excel中删除行?_Vba_Excel_Excel 2010_Autofilter - Fatal编程技术网

Vba 是否使用其他工作表中某列的值从excel中删除行?

Vba 是否使用其他工作表中某列的值从excel中删除行?,vba,excel,excel-2010,autofilter,Vba,Excel,Excel 2010,Autofilter,我正在处理一个excel工作表,它有多列和大约6000行。表1将包含主要信息。(将6000行和列添加到R)。Sheet2是我需要用于筛选/删除这些行的例外列表 现在这就是我正在使用的,它只找到精确的匹配项。我需要这个来查找sheet2中的异常,即使它们是另一个单词的一部分 例如:当我运行此命令时,它将查找并删除仅包含单词hello的每一行。但不是hello world或hello foo。我需要这个来删除包含hello world和hello foo的行 我正试图这样设置,这样我就可以简单地将更

我正在处理一个excel工作表,它有多列和大约6000行。表1将包含主要信息。(将6000行和列添加到R)。Sheet2是我需要用于筛选/删除这些行的例外列表

现在这就是我正在使用的,它只找到精确的匹配项。我需要这个来查找sheet2中的异常,即使它们是另一个单词的一部分

例如:当我运行此命令时,它将查找并删除仅包含单词hello的每一行。但不是hello world或hello foo。我需要这个来删除包含hello world和hello foo的行

我正试图这样设置,这样我就可以简单地将更多的项目添加到我的异常列表中,并根据需要删除更多的行

Sub CheckA()
Dim LR As Long, i As Long
With Sheets("IR Temp")
    LR = .Range("A" & Rows.Count).End(xlUp).Row
    For i = LR To 1 Step -1
        If IsNumeric(Application.Match(.Range("A" & i).Value, Sheets("Exceptions").Columns("A"), 0)) Then .Rows(i).Delete
    Next i
End With
End Sub
我怎样才能让它不那么具体?我理解它是如何工作的,并且正在查找精确的匹配项,但是如果发现该值与其他字符的任何组合,我需要它来查找和删除该行。

可以接受通配符匹配,但您需要颠倒标识要删除的行的方式。只需在标准rtem的前缀和后缀加上星号即可(例如
Chr(42)

您的代码只删除了一次条件值。可能最好循环它,直到没有更多的匹配。由于MATCH在不匹配时返回错误,因此最好依靠返回大于零的值

Sub CheckA()
    Dim str As String, a As Long, vSTRs As Variant

    With Worksheets("Exceptions")
        vSTRs = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Value2
    End With

    With Sheets("IR Temp")
        For a = LBound(vSTRs, 1) To UBound(vSTRs, 1)
            If CBool(Len(Trim(CStr(vSTRs(a, 1))))) Then
                str = Chr(42) & vSTRs(a, 1) & Chr(42)
                Do While CBool(Application.CountIf(.Columns(1), str))
                    .Rows(Application.Match(str, .Columns(1), 0)).EntireRow.Delete
                Loop
            End If
        Next a
    End With
End Sub

这将比标识要删除的非连续行的块或并集稍微费时,但它将完成任务。关闭环境变量,如屏幕更新和计算,以在运行到您满意的程度后加快速度。

以下假设您要搜索的单词列表位于Sheet2列A中,而要将其签入的列表位于Sheet1列A的第2行。可能有一种比嵌套循环更好的方法,但我们这里的方法是将单词列表放入一个数组中,遍历所有我们想要查看的单元格,看看它们是否包含一个单词,并对每个单元格进行遍历,以检查列出的单词中是否有一个

Public Sub testing()

Dim x As Integer
Dim i As Integer
Dim ws As Worksheet
Dim listws As Worksheet
Dim endList As Integer
Dim endR As Integer
Dim arr() As Variant

Set ws = ThisWorkbook.Worksheets("Sheet1")
endR = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set listws = ThisWorkbook.Worksheets("Sheet2")
endList = listws.Cells(ws.Rows.Count, "A").End(xlUp).Row
arr = listws.Range("A1:A" & endList)

x = 2
While x <= endR
    For i = 1 To UBound(arr, 1)
        If InStr(ThisWorkbook.Worksheets("Sheet1").Cells(x, 1).Value, arr(i, 1)) > 0 Then
            ThisWorkbook.Worksheets("Sheet1").Cells(x, 1).EntireRow.Delete
        End If
    Next i
    x = x + 1
Wend

End Sub
公共子测试()
作为整数的Dim x
作为整数的Dim i
将ws设置为工作表
将listws设置为工作表
作为整数的Dim endList
作为整数的dimendr
Dim arr()作为变量
设置ws=ThisWorkbook.Worksheets(“Sheet1”)
endR=ws.Cells(ws.Rows.Count,“A”).End(xlUp).Row
设置listws=ThisWorkbook.Worksheets(“Sheet2”)
endList=listws.Cells(ws.Rows.Count,“A”).End(xlUp).Row
arr=listws.Range(“A1:A”和endList)
x=2
那么x 0呢
此工作簿。工作表(“Sheet1”)。单元格(x,1)。EntireRow.Delete
如果结束
接下来我
x=x+1
温德
端接头

我不打算投票结束这个问题,但我已经在至少六个其他问题中谈到了这一点。看见Q还有一些从通配符匹配中排除某些值的链接。我看到了使用多个通配符进行自动筛选的方向,我想这是让我一次一个地放置每个异常或筛选项,而不是从第二张工作表的第一列中提取它。我需要这个来查看该工作表并获得要筛选的项目列表,因为我不是唯一更新此例外列表的人,它可能会在以后由另一个程序更新。工作表上的任何内容都可以读入数组并循环。这比单次删除更有效(也可能不包括所有发生的情况)。Holy cow@Jeeped我刚刚通读了你链接的答案,并使用
脚本编写了我的大脑。字典
的键作为
标准
。所以solid@DanWagner-谢谢!有一个进化的答案建立了这种方法,但我很高兴的结果。在大数据块上测试速度非常快。我现在遇到了“Excel VBA运行时错误'13'类型不匹配”我知道了原因,我正在阅读更多内容。我知道之前没有提到过这一点,但在表格(“IR Temp”)A列中也有数字和%:%?$。()也在工作表(“例外”)筛选列表中。在这种情况下,我从Q的评论中得到的原始建议更合适。你是对的,这确实有效,但不是我需要的。我仍然需要这个来使用第二张纸作为我可以添加到的工作列表。我不想在VBA中添加我需要从列表中筛选出来的所有项目,因为需要轻松更新的项目越来越多。如果我理解正确的话,Jeeped已经为我指明了使用数组的方向。也许我现在开始的时候更困惑了。我确实知道的是,由于我对编程如此陌生,我还有很多阅读要做。这对我来说是一种工作!谢谢这个:现在我唯一的问题是,我必须运行宏几次才能删除所有的行。它有时会错过其中一些。除此之外,我的例外情况列表运行得很好,一切都进展顺利。不过我需要对它进行一些修改。现在我的列表大约是原来的三分之一,我发现我有(几乎)重复的项目,我需要研究如何去除它们。例如,我的sdf_left.top.var.status和sdf_left.top.var.value是两个独立的行,但我只需要其中一行。我不能只将.status或.value添加到我的异常列表中,因为我还有其他项目不希望在末尾使用.value或.status进行筛选。需要删除sdf_left.top.var.status~。sdf_left.top.var.value~需要保持sdf_left.top.bit.value~需要保持sdf_left.right.var.status~需要保持sdf_left.right.var.status~你不可以把整个sdf_left.top.var.status都放在你的删除单词列表中吗?如果只有sdf_left.top.bit.value~需要保持sdf_left.right.var.status~我知道每个组合的名称,那就行了。在这个6k行的小数据库中,这是可能的。我的列表中有一些超过15-25k行。如果我加上