0

重複の可能性:
行を照合して並べるExcelマクロ

同じ列のセットでデータが異なる方法で配置された2枚のシートを含むExcelワークブックがあります。1つ以上のキー列を使用してシート2とシート1を比較し、一致しないレコードを特定する必要があります。

sheet1のデータ:

UserId Name Salary DeptId DeptName Location
1      Loga 2000   1      HR       Chennai
2      Mano 1500   2      PM       Mumbai
3      Raj  2500   5      GM       Delhi

sheet1のデータ:

UserId Name Salary DeptId DeptName Location
2      Mano 1500   2      PM       Mumbai
3      Raj  2500   5      GM       Delhi

最初に、UserIdとDeptIdに基づいてレコードを照合する必要があります。両方のシートで一致する場合は、[給与の比較]->[給与が一致する場合]は、UserIdのレコードをSalaryMatchedとして保存します。同様に、UserIdとDeptIdが両方のシートで一致する場合は、場所を比較します->一致する場合は、特定のUserIDが一致しないと報告しない場合は、場所が一致するようにuseridを使用してレコードを保存します。

比較のためにVBAマクロでHLookUpを使用することを計画していますが、行数が増加してパフォーマンスが低下すると、プロセスに時間がかかるようです。利用可能な提案はありますか?

4

2 に答える 2

0

複数の解決策があります。最も簡単ですが、最もクリーンではないソリューションは、UserIdとDept-Idを使用してキーを作成することです。単純な連結がその役割を果たします。たとえば、G列を追加すると(UserIdがAにあると仮定します。など)、次のことができます。=$A2 & "-" & $D2次に、単純なルックアップ関数を使用して、作成した一意のIDが両方のシートに存在するかどうかを確認します=IF(ISERROR(VLOOKUP($G2, Sheet2!$G$2:$G$3, 1, 0)), 0, 1)。関数名が正しくありません。フランス語から翻訳しています)。次に、このデータを使ってやりたいことを何でもします。

于 2012-07-01T21:28:22.290 に答える
0

私がいつも使用している方法があります。ハードコードされているので、例に従って最適化できます。サブfindMatch()

  Dim i As Integer
  Dim j As Integer
  Dim UserID As Integer
  Dim UserID2 As Integer
  Dim DeptID As Integer
  Dim DeptID2 As Integer
  Dim sal As Integer
  Dim Salary2 As Integer
  Dim Location As String
  Dim Location2 As String

  Dim rows1 as Integer
  Dim rows2 as Integer

  rows1=Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).Row 'rows count in sheet1
  rows2=Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row 'rows count in sheet2

    For i = 1 To rows1
        UserID = Workbooks("yourWorkBook").Worksheets("sheet1").Cells(i, "A").Value)
        'yourWorkBook is the name of the Access document
        DeptID = Workbooks("yourWorkBook").Worksheets("sheet1").Cells(i, "D").Value)
        Salary = Workbooks("yourWorkBook").Worksheets("sheet1").Cells(i, "C").Value)
        Location  = Workbooks("yourWorkBook").Worksheets("sheet1").Cells(i, "F").Value)

        for j= 1 to rows2
            UserID2 = Workbooks("yourWorkBook").Worksheets("sheet2").Cells(j, "A").Value)
            DeptID2 = Workbooks("yourWorkBook").Worksheets("sheet2").Cells(j, "D").Value)
            Salary2 = Workbooks("yourWorkBook").Worksheets("sheet2").Cells(j, "C").Value)
            Location2 = Workbooks("yourWorkBook").Worksheets("sheet2").Cells(j, "F").Value)

            If (UserID=UserID2) and (DeptID=DeptID2) Then

                If Salary=Salary2 then 'userID, DeptID and Salary match
                    'you create manually another sheet (sheet3) in wich you will store the desired data
                    lstSalRow = Worksheets("sheet3").Cells(Rows.Count, "A").End(xlUp).Row 'Getting the count of rows in the sheet
                    'inserting after the last row
                    Worksheets("sheet3").Cells(lstSalRow+1, "A").Value=UserID  'Storing UserID
                    Worksheets("sheet3").Cells(lstSalRow+1, "B").Value=Salary  'Storing salary

                Elseif strcmp(Location, Location2)=0 then  'userID, deptID and Location match

                    'Location matched : you can create another sheet (sheet4) in wich you will store the desired data
                    lstLocRow = Worksheets("sheet4").Cells(Rows.Count, "A").End(xlUp).Row
                    Worksheets("sheet4").Cells(lstLocRow+1, "A").Value=UserID 
                    Worksheets("sheet4").Cells(lstLocRow+1, "B").Value=Location

                Else 'only userID and DeptID match
                    'do other actions
                End If

            End If

        next j

    next i

End Sub

お役に立てば幸いです。

于 2012-07-02T15:35:13.397 に答える