Ms access Access VBA-此代码如何将一个策略的所有信息分组在一起?

Ms access Access VBA-此代码如何将一个策略的所有信息分组在一起?,ms-access,ms-access-2007,vba,Ms Access,Ms Access 2007,Vba,所以,我从其他人那里继承了一些代码(如下),我试图理解它是如何工作的。我了解代码的msot(虽然我对访问VBA还很陌生),但我不了解的一部分是该代码如何将一个策略的所有信息组合在一起 情况如下。要从我们公司的数据库中获取特定保单的保费数据,我们必须每行获取一个保险范围。但是,我要所有的保险费,每个险别一份,都在同一条线上。因此,这段代码将所有内容从多行放到一行中。为了简单起见,我把它降到了3个总覆盖率,虽然还有更多。当我阅读代码时,似乎假设一个策略的所有信息都在一起,就像特定策略的1、2或3行是

所以,我从其他人那里继承了一些代码(如下),我试图理解它是如何工作的。我了解代码的msot(虽然我对访问VBA还很陌生),但我不了解的一部分是该代码如何将一个策略的所有信息组合在一起

情况如下。要从我们公司的数据库中获取特定保单的保费数据,我们必须每行获取一个保险范围。但是,我要所有的保险费,每个险别一份,都在同一条线上。因此,这段代码将所有内容从多行放到一行中。为了简单起见,我把它降到了3个总覆盖率,虽然还有更多。当我阅读代码时,似乎假设一个策略的所有信息都在一起,就像特定策略的1、2或3行是按顺序排列的。但是,即使我(例如)按保费(金额)列对表进行排序,它仍然可以在一行上获得一份保单的所有保费。我在代码中看不到任何地方可以实现这一点。代码将一行上的保单编号与下一行上的保单编号进行比较。如果它们相同,则将保费分组在一起。如果他们不一样,不要。同样,我可以对表进行排序,使一个策略的记录不在一起,但最终结果仍然正确。我错过什么了吗?是Access中的什么东西在做吗?谢谢你的帮助

Option Compare Database
Option Explicit

' Premium is imported with one row for each coverage per policy, so possibly several rows per policy.
' This procedure takes several rows per policy and makes them into one row.
Sub ScrubPremium()

Dim i As Long, j As Long, k As Long
Dim NumRecords As Long, found As Long, UniqueCount As Long
Dim tempPolicyNum As String, tempCoverage As String, tempPremium As Single
Dim PolicyNumArray() As String, PremiumArray() As Single, TotalPremiumArray() As Single

Dim db As DAO.Database
Set db = CurrentDb

Dim infile As Variant, outfile As Variant

Set infile = db.OpenRecordset("Imported Premium")
CurrentDb.Execute "DELETE * FROM [Finalized Premium]"
Set outfile = db.OpenRecordset("Finalized Premium")

NumRecords = infile.RecordCount
ReDim PolicyNumArray(NumRecords)
ReDim PremiumArray(NumRecords, 3)
ReDim TotalPremiumArray(NumRecords)

infile.MoveFirst

'initialize PremiumArray
For i = 1 To NumRecords
    For j = 1 To NumPremiums
        PremiumArray(i, j) = 0
    Next j
Next i

'populate arrays
UniqueCount = 0
For i = 1 To NumRecords
    tempPolicyNum = infile![Policy_Number]
    tempCoverage = infile![Coverage]
    tempPremium = infile![Premium]

    k = 0
    found = 0

    Do Until k = UniqueCount Or found = 1 'check for unique policy
        If tempPolicyNum = PolicyNumArray(k + 1) Then
            found = 1
        Else
            k = k + 1
        End If
    Loop

    If found = 0 Then
        UniqueCount = UniqueCount + 1
        PolicyNumArray(k + 1) = tempPolicyNum
    End If

    Select Case tempCoverage
    Case "Comprehensive"
        j = 1
    Case "Collision"
        j = 2
    Case Else
        j = 3
    End Select
    PremiumArray(k + 1, j) = PremiumArray(k + 1, j) + tempPremium
    TotalPremiumArray(k + 1) = TotalPremiumArray(k + 1) + tempPremium
    infile.MoveNext
Next i

'Populate table
For i = 1 To UniqueCount
    outfile.AddNew
        outfile![Full Policy Number] = PolicyNumArray(i)

        outfile![Comp Premium] = PremiumArray(i, 1)
        outfile![Coll Premium] = PremiumArray(i, 2)
        outfile![Other Premium] = PremiumArray(i, 3)
        outfile![Total Premium] = TotalPremiumArray(i)
    outfile.Update
Next i

infile.Close
outfile.Close

End Sub
代码正在将一行上的策略编号与策略进行比较 下一页的号码。如果它们相同,则将保费分组在一起。 如果他们不一样,不要

差不多

这里有两个循环。其中一个遍历输入文件的每一行。在输入文件的每一行上,第二个循环遍历(可能是全部)PolicyNumArray,查找与从输入文件中获取的编号匹配的策略编号

如果我是你,我会用调试器一步一步地解决这个问题。确保它正在做你期望它做的事情。我想仔细看看这部分(有些线条被剪掉了)


我对此不太了解,但是当你点桌子的时候,你是否只是在改变你查看它的顺序?表可能自然地按策略编号(或类似的顺序键)排序,您执行的任何排序实际上只影响您的透视图,而不影响数据的读取顺序。是的,我现在看到了。谢谢你的帮助!如果到目前为止已经有100个唯一的保单编号,那么k的范围从0到99(如果需要),因此当前的保单编号将根据到目前为止记录的所有100个进行检查。谢谢。这很有帮助。
UniqueCount = 0
For i = 1 To NumRecords
    k = 0
    Do Until k = UniqueCount