【问题标题】:Excel - efficient way to find data across sheetsExcel - 跨工作表查找数据的有效方法
【发布时间】:2016-09-04 21:18:26
【问题描述】:

我目前有一个包含两个工作表的电子表格。第一个工作表是姓名和地址列表,第二个工作表是姓名和地址加上电子邮件地址的列表(工作表名为“EmailList”)

我正在尝试在第一个工作表中添加一个新列,如果电子邮件位于第二个工作表中,则通过匹配名字、姓氏、门牌号和街道地址来显示电子邮件地址。更好的办法是在新工作表上显示列表,其中只有匹配的整行。

我收到的电子邮件显示使用:

=INDEX(EmailList!P:P, MATCH(A9&B9&C9&E9, EmailList!A:A&EmailList!B:B&EmailList!C:C&EmailList!E:E, 0))

但是它太慢了。第一张有 1000 行,第二张有 1500 行。

如何轻松地从 EmailList 工作表中选择两个工作表中 Firstname、Lastname、Number、Street name 列匹配的行?

【问题讨论】:

  • 如果您使用 Excel for PC,请考虑使用 SQL 解决方案。事实上,你的最后一句话真的用 SelectWhere 用列的列表写了你的 SQL 语句!
  • 将搜索范围限制为有数据的行。例如EmailList!P1:P1000
  • 或 .. 您可以创建一个包含两个范围 google.com/search?q=pivot+table+multiple+ranges&tbm=vid 的数据透视表

标签: excel excel-formula vba


【解决方案1】:

pnuts 和 Parfait 的 cmets 都是很好的建议,值得考虑。

我只是想知道您的结构逻辑是否正确。根据您在问题中所写的内容,而不是查找 Sheet1 的电子邮件地址,您实际上是不是从 Sheet2 中删除了 Sheet1 上不存在的任何地址?如果是这种情况,那么 VBA 解决方案将非常简短。如果您从您的姓名、门牌号、地址单元格创建了一个字符串键,您可以填充一个 Collection 并简单地在每个 Sheet2 条目中查找该键。供您开发的一些骨架代码如下:

Option Explicit

Sub RunMe()
    Dim data As Variant
    Dim r As Long, c As Long, i As Long
    Dim key As String
    Dim addrs As Collection
    Dim emails As Collection
    Dim hit As Boolean
    Dim vRow As Variant
    Dim output As Variant

    'Read addresses from Sheet1 into collection
    data = Sheet1.UsedRange.Value2
    Set addrs = New Collection
    For r = 1 To UBound(data, 1)
        key = BuildKey(data, r)
        addrs.Add True, key
    Next

    'Interrogate email list
    data = Sheet2.UsedRange.Value2
    Set emails = New Collection
    On Error Resume Next
    For r = 1 To UBound(data, 1)
        key = BuildKey(data, r)
        hit = False
        hit = addrs(key)
        If hit Then emails.Add r
    Next
    On Error GoTo 0

    'Write your results to the new sheet
    ReDim output(1 To emails.Count, 1 To 5)
    i = 1
    For Each vRow In emails
        For c = 1 To 5
            output(i, c) = data(vRow, c)
        Next
        i = i + 1
    Next
    Sheet3.Range("A1").Resize(UBound(output, 1), UBound(output, 2)).Value = output

End Sub
Private Function BuildKey(data As Variant, r As Long) As String
    Dim c As Long

    For c = 1 To 4
        BuildKey = BuildKey & CStr(data(r, c)) & "|"
    Next
End Function

【讨论】:

    【解决方案2】:

    如前所述,如果使用 PC 版 Excel,请考虑使用 SQL。 Excel 可以连接到 Jet/ACE SQL 引擎(Window .dll 文件)以在工作表上运行查询,就像它们是数据库表一样。是的,您可以查询运行宏的工作簿,因为您将使用上次保存文件的只读实例。

    具体来说,下面的查询在两个工作表之间运行INNER JOINMainListEmailList 在您指定输出到现有工作表的列上,结果

    Sub RunSQL()    
        Dim conn As Object, rst As Object
        Dim strConnection As String, strSQL As String
        Dim i As Integer
    
        Set conn = CreateObject("ADODB.Connection")
        Set rst = CreateObject("ADODB.Recordset")
    
        ' CONNECTION STRINGS (DRIVER VERSION COMMENTED OUT)
    '    strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
    '                      & "DBQ=C:\Path\To\Workbook.xlsm;"
        strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                           & "Data Source='C:\Path\To\Workbook.xlsm';" _
                           & "Extended Properties=""Excel 12.0;HDR=YES;"";"
    
        strSQL = " SELECT t1.*, t2.[EmailAddress]" _
                    & " FROM [MainList$] t1" _
                    & " INNER JOIN [EmailList$] t2" _
                    & " ON t1.FirstName = t2.FirstName" _
                    & " AND t1.LastName = t2.LastName" _
                    & " AND t1.HouseNumber = t2.HouseNumber" _
                    & " AND t1.StreeAddress = t2.StreetAddress;"            
        ' OPEN CONNECTION
        conn.Open strConnection
        rst.Open strSQL, conn
    
        ' COLUMN HEADERS
        For i = 1 To rst.Fields.Count - 1
            Worksheets("Results").Cells(1, i) = rst.Fields(i).Name
        Next i        
        ' DATA ROWS
        Worksheets("Results").Range("A2").CopyFromRecordset rst
    
        rst.Close: conn.Close    
    End Sub
    

    【讨论】:

      【解决方案3】:

      我知道这是一个开发网站,但如果您想要一个超级简单且无需任何代码的操作,您可以使用 PowerPivot,它是一个免费的插件。

      您可以从这里获取插件。

      https://support.office.com/en-us/article/Power-Pivot-Add-in-a9c2c6e2-cc49-4976-a7d7-40896795d045

      同样,这只是您的另一种选择。我喜欢芭菲的建议!非常优雅,先生!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        • 2016-12-23
        • 2013-04-02
        • 2017-04-21
        • 2014-09-02
        相关资源
        最近更新 更多