VBA *通配符* Vlookup - 或替代

VBA *Wildcard* Vlookup - or alternative

我想使用 Vlookup 函数编写一些代码,以 return 相邻列的值。但是我希望查找与通配符一起工作,即不需要完全匹配。

下面的代码将逐行向下查找 D 列,然后使用该值从数据 table 和 return 中查找相应的值到 E 列。这种工作但是无法很好地处理缺失值或不正确的值。

D列的数据会是全文格式的句子,所以我只需要找关键词,然后return一个数据处理的设定参考值

    Sub LookUpComments() 'exact match only ???

On Error Resume Next
Application.ScreenUpdating = False

    Dim DataRow As Long
    Dim DataClm As Long
    Dim Result As Variant

DataTable = Sheet3.Range("D5:D35")
LookUpTable = Sheet3.Range("AA10:AB20")
Sheet3.Range("E5:E10000").ClearContents

DataRow = Sheet3.Range("E5").Row
DataClm = Sheet3.Range("E5").Column

For Each cl In DataTable

        If cl = "" Then GoTo E
        Result = Application.WorksheetFunction.VLookup(cl, LookUpTable, 2, blnLookupType)
        If Result = Error Then GoTo E
        Sheet3.Cells(DataRow, DataClm) = Result

E:            DataRow = DataRow + 1
Next cl

Application.ScreenUpdating = True
MsgBox "Data LookUp is complete"

End Sub

希望我说得够清楚了吧?如果这个功能不可行,你认为我可以使用某种循环查找和替换功能吗?

提前致谢

如果像将 blnLookupType 设置为 true 那样使用 Vlookup 没有得到您想要的结果,您可以使用 Range.Find,然后 return 您想要的偏移值。它支持通配符,您可以搜索字符串的一部分或整个字符串。请参阅下面的示例。

Sub FindingPart()

Dim rng As Range, found As Range
Set rng = Sheet2.Range("A:A")

Set found = rng.Find(What:="as", LookAt:=xlPart) 'Will find for example "bass"
If Not found Is Nothing Then returnValue = found.Offset(0, 1)

End Sub



Sub FindingWildCards()

Dim rng As Range, found As Range
Set rng = Sheet2.Range("A:A")

Set found = rng.Find(What:="as*", LookAt:=xlWhole) 'Would find for example "ashes" but not "bass"
If Not found Is Nothing Then returnValue = found.Offset(0, 1)

End Sub

感谢您的建议,看来我只使用 VLookup 走错了路。

我现在已经编写了一个代码,它可以完美地满足我的需要,尽管我确信它可以写得更好。我使用 vlookup 为每个搜索条件获取一个 return 值,然后为每个搜索条件循环一个 find/replace。

Sub FilterComments()

On Error Resume Next

Dim Rng As Range, found As Range
Dim Rtn As String

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

    LookUpValue = ActiveWorkbook.Sheets("LOOKUP").Range("I10:I108")
    LookUpTable = ActiveWorkbook.Sheets("LOOKUP").Range("I10:J108")

ActiveWorkbook.Sheets("IEOutput").Range("W:W").Value = ActiveWorkbook.Sheets("IEOutput").Range("T:T").Value
ActiveWorkbook.Sheets("IEOutput").Range("W1").Value = "LOOKUP COMMENT"

Set Rng = ActiveWorkbook.Sheets("IEOutput").Range("W:W")

        For Each cl In LookUpValue
        If cl = "" Then GoTo E

            Rtn = Application.VLookup(cl, LookUpTable, 2, False)


            Rng.Replace What:="*" & cl & "*", Replacement:=Rtn, LookAt:=xlPart, _
                SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
E:
        Next cl


Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Data LookUp is complete", vbInformation, "GM PMS Data Filter"

End Sub

希望这可以帮助其他正在尝试做类似事情的人