我有一个父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中自动执行此操作。
谢谢。
答案 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"
或按照以下步骤操作:
即使您可以将数据取消存储以供将来分析: