如果A列中的数据在两个excel文件中相似,请保存类似数据并删除第二个文件中的所有其他数据

时间:2018-04-10 21:36:37

标签: excel vba excel-vba delete-row similarity

我有一个父excel文件,其中一个永久改变的点位置范围被手动输入到A列。对于这个例子,我们说11。

Point
    P1
    P13
    P20
    P5
    P17
    P8
    P10
    P11
    P3
    P7
    P4

我有一个第二个excel文件,其中包含每个位置的另一个点位置和列的永久变化范围。此文件包含第一个文件中的点和(x)列中的其他数据。

   Point Data1 Data2 Data3 Data4 Data5
   P1       a      b     c     d     e
   P2       a      b     c     d     e
   P3       a      b     c     d     e
   P4       a      b     c     d     e
   P5       a      b     c     d     e
   P6       a      b     c     d     e
   P7       a      b     c     d     e
   P8       a      b     c     d     e
   P9       a      b     c     d     e
   P10      a      b     c     d     e
   P11      a      b     c     d     e
   P12      a      b     c     d     e
   P13      a      b     c     d     e
   P14      a      b     c     d     e
   P15      a      b     c     d     e
   P16      a      b     c     d     e
   P17      a      b     c     d     e
   P18      a      b     c     d     e
   P19      a      b     c     d     e
   P20      a      b     c     d     e

我希望第一个文件上的按钮清除第一个文件中不存在的所有点的第二个文件,同时保留第一行中的标题。输出看起来像:

Point Data1 Data2 Data3 Data4 Data5
P1       a      b     c     d     e
P3       a      b     c     d     e
P4       a      b     c     d     e
P5       a      b     c     d     e
P7       a      b     c     d     e
P8       a      b     c     d     e
P10      a      b     c     d     e
P11      a      b     c     d     e
P13      a      b     c     d     e
P17      a      b     c     d     e
P20      a      b     c     d     e

文件将在同一目录中,但我希望用户能够选择第二个文件来执行搜索和删除。

提取每个点和相应的行并保存到新工作表而不是删除所有其他点和数据可能更简单。那也是合适的。我知道如何使用VLOOKUP手动执行此操作,但我想在其他用户的VBA中自动执行此操作。

谢谢。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

Sub mysub()
    Dim parentWb As Workbook, secondWb As Workbook

    Set parentWb = Workbooks.Open("parentWbPath\parentWbName.xlsx") ' adjust 'parent' workbook path and name to suit your needs
    Set secondWb = Workbooks.Open("secondWbPath\secondWbName.xlsx")' adjust 'secondWB' workbook path and name to suit your needs

    Dim filters As Variant
    With parentWb.Worksheets(1) 'assuming 'parent' workbook data are in its 1st worksheet
        filters = Application.Transpose(.Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Value)
    End With

    Dim iRow As Long        
    With secondWb.Worksheets(1) 'assuming 'secodnWb' workbook data to be processed are in its 1st worksheet
        With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
            .AutoFilter Field:=1, Criteria1:=filters, Operator:=xlFilterValues
            For iRow = .Rows(.Rows.Count).Row To 2 Step -1
                .Rows(iRow).Hidden = Not .Rows(iRow).Hidden
            Next
            .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With
End Sub

答案 1 :(得分:0)

您可以使用 Power Query 。它是Excel 2010+的加载项(默认情况下在2016年称为Get& Transform),您可以轻松下载激活。在那里,您可以直接连接数据源,并且您将拥有许多工具来转换数据。

在您的情况下,您可以将第一个表格转换为List,并将其用作数据的过滤器。

查询编辑器>中主页> 高级编辑您可以粘贴此代码(非官方称为M代码)

let
    Source = Excel.CurrentWorkbook(){[Name="Main"]}[Content], //Main Table
    Source2 = Excel.CurrentWorkbook(){[Name="Filter"]}[Content], //Filter Table
    Filter = Source2[Point], //Covert Filter table in a List
    #"Filtered Rows" = Table.SelectRows(Source, each List.Contains(Filter, [Point])) //Use the list as a filter
in
    #"Filtered Rows"

或按照以下步骤操作:

即使您可以将数据取消存储以供将来分析: