0

2 つの Excel 2007 ワークシートがあります。

Excel ワークシート 1 : (以下のように) シート 1 では 3 つの列が重要です

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 

sheet2 email = sheet1 email であるシート 2 の userid の値を入力できるマクロを含む関数/フォーラムが必要です

これは、ワークシート 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を知っていますが、クエリはMySQL DBで結果を得るのに長い時間がかかります...とにかく、以下はDBで使用していた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);

両方の電子メール(列)の値が一致する場合、1つのExcelシートの値を置き換えるマクロ/関数/式が必要です。マクロ/式/関数などの作成に関して誰かが助けてくれれば...式を作成する知識があまりないためエクセルマクロ..

前もって感謝します。

4

1 に答える 1

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 エディターのコードのスクリーンショットを次に示します。緑色の再生ボタンをクリックしてコードを実行します。

ここに画像の説明を入力

追加情報に基づいて、次の代替手順を試してください。

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
于 2012-04-10T00:39:03.343 に答える