如果两个电子邮件(列)值匹配,需要宏/函数/公式来替换一个Excel工作表的值

时间:2012-04-09 23:10:25

标签: excel excel-vba excel-formula excel-2007 vba

我有2个Excel 2007工作表。

Excel工作表1 :(如下所示)3列在工作表1中很重要

userid   name   email

100      sam    sam@sam.com
200      pete   pete@pete.com
300      Bum    Bum@Bum.com 
400      Harry  Harry@Harry.com

工作表2 :(如下所示)(user_id列为空)

userid   name   email

         sam    sam@sam.com
         Harry  Harry@Harry.com 
         pete   pete@pete.com
         Bum    Bum@Bum.com 

我需要一个带宏的函数/ forumla,我可以在表2中填写userid的值 sheet2 email = sheet1 email

的位置

将在工作表2中得到以下结果

userid   name   email

100      sam    sam@sam.com
400      Harry  Harry@Harry.com 
200      pete   pete@pete.com
300      Bum    Bum@Bum.com 

我知道SQL,但查询需要很长时间才能获得结果...... 无论如何,下面是我在数据库中使用的SQL查询。

UPDATE  `j_A` 
SET user_id =   ( SELECT j_B.id
FROM j_B
WHERE j_B.email =  j_A.email)
WHERE EXISTS
  ( SELECT j_B.id
    FROM j_B
    WHERE j_B.email =  j_A.email);

如果两个电子邮件(列)值都匹配,需要宏/函数/公式来替换一个Excel工作表的值,如果有人cud帮助我创建宏/公式/功能等... 没有太多知识在Excel宏中创建公式..

提前致谢。

1 个答案:

答案 0 :(得分:0)

根据您的示例,请尝试:

Sub HTH
    With Sheet2.Range("A2:A" & Sheet2.Cells(Rows.Count, 2).End(xlUp).Row)
        .Formula = Replace("=LOOKUP(2,1/(Sheet1!C$2:C$x=C2)/(Sheet1!B$2:B$x=B2),Sheet1!A$2:A$x)", _
            "x", (Sheet1.UsedRange.Rows.Count - 1))
        .Value = .Value
    End With
End Sub

更新SQL查询可能会更有效。

要打开VBA编辑器,请按Alt-F11。

下面是VBA编辑器中代码示例的截图,点击绿色播放按钮运行代码:

enter image description here

根据您可能想要尝试此替代程序的附加信息:

Sub HTH2()
    Dim vSource As Variant
    Dim vOutput As Variant
    Dim sKey As String

    vSource = Sheet1.UsedRange.Resize(, 3).Value
    vOutput = Sheet2.UsedRange.Resize(, 3).Value

    With CreateObject("Scripting.Dictionary")
        For lloop = 1 To UBound(vSource, 1)
            .Add vSource(lloop, 2) & ":" & vSource(lloop, 3), vSource(lloop, 1)
        Next lloop

        For lloop = 1 To UBound(vOutput, 1)
            sKey = vOutput(lloop, 2) & ":" & vOutput(lloop, 3)
            If .exists(sKey) Then
                vOutput(lloop, 1) = .Item(sKey)
            Else
                vOutput(lloop, 1) = ""
            End If
        Next lloop
    End With

    Sheet2.Range("A1").Resize(UBound(vOutput, 1), 1).Value = vOutput

End Sub