Ms Access比较两个记录集

时间:2009-09-09 10:59:00

标签: ms-access vba

我想比较两个记录集。第一个rs1有随机记录。第二个rs2具有这些记录的标准值。最初,我希望获取每个记录,看看它们是否与第二个记录集中的标准值集匹配。每个记录集中有四个字段需要进行比较,并且所有四个字段必须匹配。

我只需要循环中的一些帮助。我正在尝试将不匹配的记录写入excel文件。 这是我到目前为止所拥有的

While Not rs1.EOF                                       
    With rs1
        .MoveFirst
        With rs2
            .MoveFirst
            While Not rs2.EOF
                counter = counter + 1
                a = 0
                If rs1!Kk = rs2!Kk Then a = a + 1
                If rs1!CC = rs2!CC Then a = a + 1
                If rs1!HN = rs2!HN Then a = a + 1
                If rs3!TN = rs2!TN Then a = a + 1

                If a > 3 Then GoTo correct
                .MoveNext

                If rs2.EOF Then
                    If rs!Table_Name <> "table1" Then
                        i = i + 1
                        j = 1
                        counter = counter + 1
                        objSht.Cells(i, j).Value = "casenum" & rs1.Fields(1)
                        j = j + 1
                        stat_counter = stat_counter + 1
                    End If

                    If i = 65500 Then
                        Set wbexcel = objexcel.ActiveWorkbook
                        ''//Set objSht = wbexcel.Worksheets("Sheet2")
                        Set objSht = wbexcel.Worksheets.Add
                        i = 2
                    End If
                End If                                        
correct:
                rs1.MoveNext
            Wend
        End With
    End With

关于如何根据与标准匹配的2个字段以及与标准值匹配的3个字段进行隔离的任何想法

2 个答案:

答案 0 :(得分:2)

记录集是否已经排序?我猜这是因为你在非匹配时移动到下一个rs2。就个人而言,我会指定一种100%确定的排序。

另外,我会使用一个带有一些边缘情况的小型测试数据集对此进行彻底的测试,以确保您得到您期望的结果。

考虑到上述情况,您的代码看起来很有效,但我有一些小建议,以便于阅读。

首先我建议放弃嵌套的With rs1With rs2。只需明确引用每个记录集,这样您就可以清楚地看到每个记录集发生了什么。例如:

If a > 3 Then GoTo correct
                .MoveNext

变为

If a > 3 Then GoTo correct
               rs2.MoveNext

接下来,使用a = a + 1的if语句可以进行一些整理。例如:

If rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN and rs3!TN = rs2!TN then
  ''// Do Nothing or maybe increase a count or whatever :)
else
  WriteToExcel(objSht , rs1.fields)
end if

您需要编写一个名为WriteToExcel()的函数,但这将使下一步更容易。我想你想根据比赛写到不同的表?

If rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN and rs3!TN = rs2!TN then
  ''// Do Nothing
else if rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN then
  WriteToExcel(objSht2 , rs1.fields)
else
  WriteToExcel(objSht , rs1.fields)
end if

您可能还希望在需要任何两个匹配的情况下查看开关,而不是上面的特定匹配...哦和variable j似乎有点多余。

答案 1 :(得分:0)

我的直觉说你正在做一些次优的事情;但是,在if语句If rs2.EOF Then中,为什么不向a添加比较,然后重定向到不同的Excel文件0,1,2和3

Bruit Force和Ignorance,但绝对是隔离的。