由于目标是获得部分匹配,因此建议使用Range.Find method (Excel) 而不是WorksheetFunction.Match。
数组列表应该只有我们需要找到的关键字,即Phone而不是Phone Number等。
此解决方案使用Range.Find 方法创建一个包含所有所需字段的Target 范围,然后删除所有不在Target 范围内的列。
Sub Range_Delete_Unwanted_Fields()
Dim aList As Variant
aList = Array("Missing1", "Name", "Missing2", "Phone")
Dim ws As Worksheet
Dim rSrc As Range, rTrg As Range, rCll As Range
Dim vItem As Variant, sAdrs As String
Set ws = ThisWorkbook.Worksheets("DATA")
Rem Set Source Range (Header)
With ws
Set rSrc = .Cells(1).Resize(1, .Cells(1, .Columns.Count).End(xlToLeft).Column)
rSrc.EntireColumn.Hidden = False
End With
Rem Set Target Range (Fields in Array List)
For Each vItem In aList
With rSrc
Rem Clear 1st Found Cell Address
sAdrs = vbNullString
Rem Set 1st Found Cell
Set rCll = .Cells.Find( _
What:=vItem, After:=.Cells(.Cells.Count), _
LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
Rem Validate 1st Found Cell
If Not (rCll Is Nothing) Then
Rem Get 1st Found Cell Address
sAdrs = rCll.Address
Rem Add Found Cell To Target Range
If rTrg Is Nothing Then
Set rTrg = rCll
Else
Set rTrg = Union(rTrg, rCll)
End If
Rem Find Other Cells
Do
Set rCll = .Cells.FindNext(After:=rCll)
Rem Validate Next Cell against 1st Cell
If rCll.Address = sAdrs Then Exit Do
Rem Add Next Cell To Target Range
Set rTrg = Union(rTrg, rCll)
Loop Until rCll.Address = sAdrs
End If: End With: Next
Rem Validate Target Range
If Not rTrg Is Nothing Then
Rem Delete Columns Not in Target Range Only if Headers were found!
rTrg.EntireColumn.Hidden = True
rSrc.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
rTrg.EntireColumn.Hidden = False
End If
Application.Goto ws.Cells(1), 1
End Sub