VBA Excel VLookup

时间:2015-09-09 10:13:19

标签: excel vba excel-vba

我有第一个工作表,其中包含以下一组值

Column A
**Sender Name**
SAAD MAJID S R AL SAAD
IBRAHIM BIN SABTU ATAU ZULKIFLEE BIN ABDUL RAHMAN
PUSPA LAL JONES
RENJA BAHADUR NEPAL
RENJA BAHADUR RANGER
RENJA BAHADUR HAMAL
PARSHU RAM KARKI

第二个工作表具有以下值

Column A
**Sir Names**
Jones
Ranger
Brown
Hamal
Karki

如果第二张表中提到的姓氏显示为全名的一部分,我想在VBA中使用VLookup来查找和删除第一张工作表中的数据行。

基本上它会留下以下记录。

SAAD MAJID S R AL SAAD
IBRAHIM BIN SABTU ATAU ZULKIFLEE BIN ABDUL RAHMAN
RENJA BAHADUR NEPAL 

我在VBA中编写了以下代码,但是我收到了一个错误。

Dim NameArray() As String
Dim result

Sub vlookupcode()
'Find last row with data in Column A
lastrow = Range("A" & Rows.Count).End(xlUp).row
'Start at bottom and delete rows with errors
For myNA = lastrow To 1 Step -1
    'If IsError(Cells(myNA, 1)) Then

  tmp = Cells(myNA, 1).Value
  'MsgBox tmp
  NameArray() = Split(tmp, " ")
  For i = LBound(NameArray) To UBound(NameArray)

    'MsgBox i & " " & NameArray(i)

    result = Application.VLookup(NameArray(i), Sheet2.Range("A2:A6"), 1, False)

    If IsError(result) Then
        MsgBox "Error"
        Cells(myNA, 1).EntireRow.Delete
    End If
  Next

 Next
End Sub

请你帮我解决一下。

1 个答案:

答案 0 :(得分:1)

部分匹配的最有效查找可能是通过工作表自己的带有通配符的MATCH function

Sub del_surname()
    Dim rw As Long, ws1 As Worksheet

    Set ws1 = Worksheets("Sheet1")

    With Worksheets("Sheet2")
        For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            If Not IsError(Application.Match(Chr(42) & .Cells(rw, 1) & Chr(42), ws1.Columns(1), 0)) Then
                ws1.Rows(Application.Match(Chr(42) & .Cells(rw, 1) & Chr(42), ws1.Columns(1), 0)).EntireRow.Delete
            End If
        Next rw
    End With

End Sub

匹配函数将检索通配符查找找到其目标的行号。如果姓氏始终是字符串中的最后一个单词,则Chr(42) & .Cells(rw, 1) & Chr(42)可以更改为Chr(42) & .Cells(rw, 1)

如果可能存在多个潜在匹配,则需要重复循环或使用Range.Find methodRange.FindNext method的替代方法。