如果条目复制另一个表,则从表中删除行 [英] Delete rows from table if entries duplicate another table

查看:93
本文介绍了如果条目复制另一个表,则从表中删除行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有2张桌子,因为我和VBA一起工作了一段时间。一个是我所谓的删除列表,其中有几列,另一个是更详细的列表,其中包含所有详细信息。我想做的是在删除列表中查找项目(见表1),如果一行中的所有项目与主列表中的相关项目相匹配(请参见表2),然后删除该行。



表1(已删除)

  + ------------------- + --------- + --------------- + ----------------------- + ---------- + 
|名称|来源|电话号码|地址1 |邮政编码|
+ ------------------- + --------- + --------------- - + ----------------------- + ---------- +
| A N其他| MySrc | 01234 123456 | 18 FAKE STREET | XXX XXXX |
| A N其他| MySrc2 | 01234 567890 | 29 FAKE STREET | XXX XXXX |
+ ------------------- + --------- + --------------- - + ----------------------- + ---------- +

表2(主)

  + -------- + ------- + ----------- ---------- + -  + --------------- + ------------- + ------------------ -  + ---------------- + ---------------- -------------- + -  + ---------- + ------------- ------------- + -------- + + -------- + -------- + -------- + -------- + -------- + ---- -------- + -------- + 
|名称|标题|全名|职位|电话号码|电话号码2 |地址第1行|地址第2行|地址第3行|地址第4行|邮政编码|数据1 |数据2 |数据3 |数据4 |数据5 |数据6 |数据7 |数据8 |添加日期|来源|
+ --------------- + ------- + ----------- + --------- - + --------------- + ------------- + ----------------- - + ---------------- + ---------------- + ------------- --- + ---------- + ------------- ------------- + ------- + - + -------- + -------- + -------- + -------- + -------- + --- --------- + -------- +
|其他| |人A | | 01234 123456 | | 18 FAKE STREET | | | | XXX XXXX | | | | | | | | | | MySrc |
|其他| |人B | | 01234 999999 | | 18 FAKE STREET | | | | XXX XXXX | | | | | | | | | | MySrc |
| ...关于另外5000行...
+ --------------- + ------- + ------ ----- + ----------- + -------- + ------------- + - ----------------- + ---------------- + --------------- - + ---------------- + ---------- + ------------- + ------ ------- -------- + -------- + -------- + -------- + ------ + - + -------- + ------------ + -------- +

从这里可以看出,它应该删除第1行,但是留下第2行。



我有以下VBA我写的代码,目前根据一列现在找到重复存在的行

  Sub createFinalList()
Dim rng As Range,Dim r As Range
Dim wsFinal As Worksheet,wsOriginal As Worksheet,wsDelete As Worksheet

设置wsFinal = ThisWorkbook.Sheets finalList)
设置wsOriginal = ThisWorkbook.Sheets(List)
设置wsDelete = ThisWorkbook.Sheets(PermaDelete)

对于i = wsDelete.UsedRange.Rows .Count To 2 Step -1
设置r = wsOriginal.Columns(1) find(wsDelete.Cells(i,1).Value,,xlValues,xlWhole,xlByRows,xlNext)
如果不是r是没有然后
firstA = r.Address
设置rng =没有
Do
如果rng不是,然后
设置rng = wsOriginal.Rows(r.Row)
Else
设置rng = Union(r,rng)
结束如果
设置r = wsOriginal.Columns(1).Find(wsDelete.Cells(i,1).Value,r,xlValues,xlWhole,xlByRows,xlNext)
Debug.Print r.Address
循环直到firstA = r.Address
结束如果
下一个i
结束Sub

我正在想的是在每个后​​续的 rng 中使用 .Find 在删除最终结果之前,列,但似乎应该有一个更简单的方法。我错过了一个技巧吗?是否有更简单的方法?

解决方案

如果您的已删除数据与主数据完全相符,使用 AdvancedFilter 。请阅读有关高级过滤器的更多信息: http://www.excel-easy.com/ examples / advanced-filter.html HTH

  Sub createFinalList()
Dim mainSheet As Worksheet
Dim criteriaSheet As Worksheet

设置mainSheet = ThisWorkbook.Worksheets(Main)
设置criteriaSheet = ThisWorkbook.Sheets(Deleted)

Dim mainRange作为范围
Dim criteriaRng As Range

设置mainRange = mainSheet.Range(A2:U3)
设置criteriaRng = criteriaSheet.Range(A1:E3)

mainRange.AdvancedFilter _
动作:= xlFilterInPlace,_
criteriaRange:= criteriaRng,_
唯一:= False

'删除行隐藏通过高级过滤器
Dim myRow As Range
Dim toDelete As Range

对于每个myRow在mainRange.Rows
如果myRow.EntireRow.Hidden然后
如果toDel ete Is Nothing Then
Set toDelete = myRow
Else
设置为Delete = Union(toDelete,myRow)
如果
结束If
Next

如果不是删除没有,那么_
toDelete.Delete
End Sub


Been a while since I worked with VBA so bear with me as I may be a little bit rusty.

I have 2 tables. One is what I call a "Deleted" list with a few columns and the other is a more detailed list with all details. What I want to do is look up items on the "Deleted" list (see Table 1) and if all the items in a row match the relevant items in the main list (see Table 2), then delete the row. I cannot just do the first column, as data is not very well structured.

Table 1 (Deleted)

+-------------------+---------+-----------------+-----------------------+----------+
|       Name        | Source  |     Tel No      |       Address 1       | Postcode |
+-------------------+---------+-----------------+-----------------------+----------+
| A N OTHER         | MySrc   | 01234 123456    | 18 FAKE STREET        | XXX XXXX |
| A N OTHER         | MySrc2  | 01234 567890    | 29 FAKE STREET        | XXX XXXX |
+-------------------+---------+-----------------+-----------------------+----------+

Table 2 (Main)

+---------------+-------+-----------+-----------+---------------+-------------+-------------------+----------------+----------------+----------------+----------+-------------+-------------+--------+--------+--------+--------+--------+--------+------------+--------+
| Name          | Title | Full Name | Job Title |  Tel No       | Tel No 2    |  Address Line 1   | Address Line 2 | Address Line 3 | Address Line 4 | Postcode |   Data 1    |   Data 2    | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 | Data 8 | Date Added | Source |
+---------------+-------+-----------+-----------+---------------+-------------+-------------------+----------------+----------------+----------------+----------+-------------+-------------+--------+--------+--------+--------+--------+--------+------------+--------+
|  AN OTHER     |       | Person A  |           | 01234 123456  |             | 18 FAKE STREET    |                |                |                | XXX XXXX |             |             |        |        |        |        |        |        |            | MySrc  |
|  AN OTHER     |       | Person B  |           | 01234 999999  |             | 18 FAKE STREET    |                |                |                | XXX XXXX |             |             |        |        |        |        |        |        |            | MySrc  |
|... about another 5000 rows...
+---------------+-------+-----------+-----------+---------------+-------------+-------------------+----------------+----------------+----------------+----------+-------------+-------------+--------+--------+--------+--------+--------+--------+------------+--------+

As you can see from this, it should delete line 1 but leave line 2.

I have the following VBA code that I have written, which currently finds the rows where the duplicates exist based on one column only.

Sub createFinalList()
Dim rng As Range, Dim r As Range
Dim wsFinal As Worksheet, wsOriginal As Worksheet, wsDelete As Worksheet

Set wsFinal = ThisWorkbook.Sheets("FinalList")
Set wsOriginal = ThisWorkbook.Sheets("List")
Set wsDelete = ThisWorkbook.Sheets("PermaDelete")

For i = wsDelete.UsedRange.Rows.Count To 2 Step -1
    Set r = wsOriginal.Columns(1).Find(wsDelete.Cells(i, 1).Value, , xlValues, xlWhole, xlByRows, xlNext)
    If Not r Is Nothing Then
        firstA = r.Address
        Set rng = Nothing
        Do
            If rng Is Nothing Then
                Set rng = wsOriginal.Rows(r.Row)
            Else
                Set rng = Union(r, rng)
            End If
            Set r = wsOriginal.Columns(1).Find(wsDelete.Cells(i, 1).Value, r, xlValues, xlWhole, xlByRows, xlNext)
            Debug.Print r.Address
        Loop Until firstA = r.Address
    End If
Next i
End Sub

What I was thinking of doing was then using .Find on rngfor each subsequent column before deleting the final result, however it does seem like there should be an easier way. Am I missing a trick? Is there an easier way to do this?

解决方案

If your 'Deleted' data exactly correspond with the 'Main' data you could use AdvancedFilter. Read more about advanced filter here: http://www.excel-easy.com/examples/advanced-filter.html HTH

Sub createFinalList()
    Dim mainSheet As Worksheet
    Dim criteriaSheet As Worksheet

    Set mainSheet = ThisWorkbook.Worksheets("Main")
    Set criteriaSheet = ThisWorkbook.Sheets("Deleted")

    Dim mainRange As Range
    Dim criteriaRng As Range

    Set mainRange = mainSheet.Range("A2:U3")
    Set criteriaRng = criteriaSheet.Range("A1:E3")

    mainRange.AdvancedFilter _
        Action:=xlFilterInPlace, _
        criteriaRange:=criteriaRng, _
        Unique:=False

    ' Delete rows hidden by advanced filter
    Dim myRow As Range
    Dim toDelete As Range

    For Each myRow In mainRange.Rows
        If myRow.EntireRow.Hidden Then
            If toDelete Is Nothing Then
                Set toDelete = myRow
            Else
                Set toDelete = Union(toDelete, myRow)
            End If
        End If
    Next

    If Not toDelete Is Nothing Then _
        toDelete.Delete
End Sub

这篇关于如果条目复制另一个表,则从表中删除行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆