我遇到的最大问题是在传达我做了什么、如何做以及为什么做的沟通方面。没必要,所以删了。
所以,选择表格的任何部分、部分或范围并运行代码。
如果您不需要删除找到的数据并希望保留在您的工作表中,您可以删除下面的代码部分“清除任何现有的过滤器”,但仍为其他目的标记(例如您可以将这些位复制到另一个文件如果你愿意,等等)。
下面的代码应该满足您在问题中提出的要求,并只留下表格中您选择的任何条款中不包含的部分。即它将根据您的标准删除并向上移动表格中的行。
& 是的,Python 和 R 也可以简单地为您执行此操作,使用 python 中的数据帧,代码更少。但是这个 VBA 代码适用于我的许多示例。不知道 50000 行和 X 列的情况如何,但应该没问题{编辑后: 效果很好}。
Sub SearchTableorSelectionDeletetermsFound5()
Dim corresspondingpartner() As Variant
Dim rng As Range: Set rng = Selection
Dim col As Range
For Each col In rng.Columns
Dim r As Range
Dim rn As Variant
Dim Rownum As Long
Rownum = Selection.Rows.Count
ReDim rm(0 To Rownum) As Variant 'size of this array needs to equal or bigger than your selection
'With Sheet2
terms = Sheets("Sheet2").Cells(1, 1).CurrentRegion
k = 1
For rw = 0 To UBound(terms)
ReDim Preserve corresspondingpartner(rw)
corresspondingpartner(rw) = (k / k) 'gives each correspondong partner element an id of 1.
k = k + 1
Next
'End With
For Each r In Selection
n = 0
m = n
For Each c In terms
' Checks for each term in turn in the terms column.
' If it finds one, it inserts the corresponding corresspondingpartner name in the column cell/corresponding row column O (*post edit: now, column ADU)*
If r.Offset(0, 0).Value Like "*" & c & "*" Then
rm(n) = corresspondingpartner(n) 'corresspondingpartner(n) and in the end, you dont even need this, you can replace with any value which the auto fiter section looks for to delete
'so you can remove any instances and classees of corresspondingpartner, including the making of this corresponding second array
'turns out it could have been just if =1
Cells(r.Row, 801).Value = rm(n) / rm(n) 'Sheets("HXY2").
'##### YOU DONT EVEN NEED A HLOOKUP! :)
'#### BUT I STILL WANT TO GET RID OF THE OFFSET COLUMS, DO IT WITHOUT THEM. DONE!! :)
'''###''' same here , turns out could have just been =1
End If
n = n + 1
Next
Next
Next col
'Clear any existing filters
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
'1. Apply Filter
ActiveSheet.Range("A1:ADU5000").AutoFilter Field:=801, Criteria1:=corresspondingpartner(n) / corresspondingpartner(n)
'2. Delete Rows
Application.DisplayAlerts = False
ActiveSheet.Range("A1:ADU5000").SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'3. Clear Filter
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
End Sub
您可能会看到,一开始我正在使用从表/选择中打印偏移列结果 - 这占用了不必要的空间,并且还在代码中使用了 VBA Application.WorksheetFunction.Hlookup 来给出最终结果结果列,标记要删除的行,但这最终是不必要的。那些较早的版本/宏也可以工作,但速度较慢,所以我在不需要辅助列的情况下使用数组。
我求助于我的朋友,[excel 校园 - 根据条件删除行][1] 在末尾嵌入和调整自动过滤器代码,删除您不想要的行,因此您不必这样做自己动手)
它现在是对您选择(或数据)中数组匹配项的“虚拟”hlookup,通过删除符合您的规范/要求的所有行,为您留下所需的数据。
我知道并且有一种强烈的预感,它可以进一步改进,进一步扩展精简(从我制作数组的方式开始),但我对它的功能和潜在范围目前感到满意。
[1]:https://www.youtube.com/watch?v=UwNcSZrzd_w&t=6s)