2016-09-04 5 views
0

現在2つのワークシートを含むスプレッドシートがあります。最初のワークシートは名前と住所のリスト、2番目は名前と住所、電子メールアドレスのリストです(シート名は "EmailList")Excel - シート間でデータを検索する効率的な方法

最初のワークシートに新しい列を追加しようとしていますファーストネーム、ラストネーム、ハウスナンバー、番地を照合して、電子メールが2番目のシートにある場合の電子メールアドレス。新しいシートにリスト全体を表示するだけでも良いでしょう。

私が使用して示す電子メールを得た:

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

それはSOOOOOO遅いですが。最初のシートは1000行、2番目のシートは1500です。

両方のシートのFirstname、Lastname、Number、Street名の列が一致するEmailListシートから行を簡単に選択するにはどうすればよいですか?

+1

EmailListシートのキー(A9&B9&C9&E9に似ています)を作成します(一度作成すると式ではなく値に変換できます)。 – pnuts

+2

Excel for PCを使用する場合は、SQLソリューションを検討してください。実際には、あなたの最後の文章は、文字列であなたのSQLステートメントを書いています* Select *と* Where *列のリストで! – Parfait

+0

検索範囲をデータのある行だけに限定します。例えば ​​'EmailList!P1:P1000' – Slai

答えて

0

pnutsとParfaitのコメントはどちらも優れた提案であり、検討する価値があります。

あなたの構造論理が正しいかどうかは疑問です。 Sheet1の電子メールアドレスを見つけるのではなく、あなたの質問に書いたものから、実際にSheet1に存在しないアドレスをSheet2から削除していませんか?これが当てはまる場合、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 
0

述べたように、PC用のExcelを使用した場合はSQLを考えます。 ExcelはJet/ACE SQLエンジン(ウィンドウ.dllファイル)に接続して、データベーステーブルのようにワークシートでクエリを実行できます。そして、はい、最後に保存されたファイルの読み取り専用のインスタンスを使用するので、マクロを実行する非常にブックを照会することができます。

具体的には、以下のクエリでは、既存のワークシート、結果への出力で指定された非常に列に2枚、MainListEmailListINNER JOINを実行します:私は、これは知っている

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 
0

デベロッパーサイトですが、コードなしでこれを簡単に実行できるようにするには、無料のAddInであるPowerPivotを使用できます。

enter image description here

enter image description here

ここからアドインを得ることができます。

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

ここでも、それはあなたのためのちょうど別のオプションです。私はパフェの提案が好きです!非常に優雅な、サー!

関連する問題