Excel公式/ VBA用于搜索其他工作表中的部分字符串

时间:2015-08-06 05:17:12

标签: excel vba excel-vba formula

我在sheet1的两个单元格中有名字(例如:B1(Gina Williams)和B2(Patrick Rafter)),相应的银行对账单叙述见表2(C栏),例如:"存款来自吉娜朝着康诺特的地方出租"。

现在我需要搜索单元格B1和amp;中可用的所有四个部分文本。第1页的B2(即#34; Gina"," Williams"," Patrick"," Rafter"在表2的整个B栏中如果匹配,我需要捕获匹配行的相应列B& D值。

SHEET1

Column A      Column B            Column C                         Column D
   1        GINA WILLIAMS     OUTPUT (matching col b of sheet2)  OUTPUT (matching col D of sheet2)
   2        PATRICK RAFTER    OUTPUT (matching col b of sheet2)  OUTPUT (matching col D of sheet2) 

SHEET2

Column A   Column B     Column C                                              Column D
    1     12/7/2015   Deposit from Gina towards rent for connaught place apt        320 

    2     13/7/2015   Deposit from Rafter towards rent for connaught place apt          720

我尝试过使用vlookup,查找,匹配(以及左,右,中功能)功能。

2 个答案:

答案 0 :(得分:0)

你可以使用VBA实现这一目标,但如果你之前没有做过VBA,这可能不是一个好主意。

当您手动将表单1中的名称输入每个单元格时,我倾向于在表单2中添加另一列。在此新列的每个单元格中,您可以使用excel功能区>数据>数据工具> DataValidation选项为用户提供可以输入的所有名称的下拉列表。

此解决方案可行 - 只要您的银行对帐单不是很大!如果是,那么你可能想要以不同的方式做到这一点。它还解决了sheet1上具有相同姓氏或姓氏的两个人的问题,并且可能是你能够很快完成的事情。

完成上述操作后,您只需使用表1中的VLOOKUP即可完成第2页上的数据。

KISS。

哈维

答案 1 :(得分:0)

我有一个给你。我已经测试了代码。它对我来说很完美。

但是,不是重复命名的受让人,意味着,它不能为重复的名称和重复存款提供正确的结果。

这里是代码:

Sub findAndGet()

    Dim sh1, sh2 As Worksheet
    Dim tempRow1, tempRow2 As Integer
    Dim strList() As String
    Dim name As String
    Dim index As Integer

    'Set sheets
    Set sh1 = Sheets("list")
    Set sh2 = Sheets("search")

    'Set the start row of Sheet1
    tempRow1 = 1

    'Loop all row from starRow until blank of column A in Sheet1
    Do While sh1.Range("A" & tempRow1) <> ""

        'Get name
        name = sh1.Range("B" & tempRow1)

        'Split by space
        strList = Split(Trim(name), " ")

        'Set the start row of Sheet2
        tempRow2 = 1

        'Reset flag
        isFound = False

        'Loop all row from startRow until blank of column A in Sheet2
        Do While sh2.Range("A" & tempRow2) <> ""

            For index = LBound(strList) To UBound(strList)

                'If part of name is found.
                If InStr(UCase(sh2.Range("C" & tempRow2)), UCase(strList(index))) > 0 Then

                    'Set true to search flag
                    isFound = True

                    'exit do loop
                    Exit Do

                End If

            Next index

            'Increase row
            tempRow2 = tempRow2 + 1

        Loop

        'If record is found, set output
        If isFound Then

            'set date
            sh1.Range("C" & tempRow1) = sh2.Range("B" & tempRow2)

            'set amount
            sh1.Range("D" & tempRow1) = sh2.Range("D" & tempRow2)

        End If

        'Increase row
        tempRow1 = tempRow1 + 1

    Loop

End Sub