0

そのため、他の誰かからいくつかのコード (以下) を継承し、それがどのように機能するかを理解しようとしています。私はコードの msot を理解しています (私は Access VBA にはかなり慣れていません) が、このコードが 1 つのポリシーのすべての情報をグループ化する方法がわかりません。

状況は以下の通りです。当社のデータベースから特定のポリシーのプレミアム データを取得するには、1 行につき 1 つのカバレッジを取得する必要があります。しかし、私はすべての保険料を、補償範囲ごとに 1 つずつ、すべて同じ行に入れたいと思っています。したがって、このコードは、多くの行を 1 行にまとめています。簡単にするために、合計 3 つのカバレッジに絞り込みましたが、さらに多くのカバレッジがあります。コードを読むと、特定のポリシーの 1、2、または 3 行が順番に並べられているように、1 つのポリシーのすべての情報がまとめられていると想定しているようです。しかし、たとえば、表を保険料 (金額) 列で並べ替えても、1 行で 1 つのポリシーのすべての保険料が得られます。これを機能させるコードのどこにもありません。コードは、ある行のポリシー番号を次の行のポリシー番号と比較しています。それらが同じである場合は、保険料をまとめます。それらが異なる場合は、しないでください。繰り返しますが、1 つのポリシーのレコードが一緒にならないようにテーブルを並べ替えることができますが、それでも最終結果は正しくなります。何か不足していますか?それは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
4

1 に答える 1

1

コードは、ある行のポリシー番号を次の行のポリシー番号と比較しています。それらが同じである場合は、保険料をまとめます。それらが異なる場合は、しないでください。

ほとんど。

ここには 2 つのループがあります。入力ファイルの各行を 1 つずつ見ていきます。入力ファイルの各行で、2 番目のループが (場合によってはすべての) PolicyNumArray を調べて、入力ファイルから取得した番号と一致するポリシー番号を探します。

私があなたなら、デバッガーでこれをステップ実行します。期待どおりの動作をしていることを確認してください。この部分をよく見てみたいと思います(いくつかの行は切り取られています)。

UniqueCount = 0
For i = 1 To NumRecords
    k = 0
    Do Until k = UniqueCount
于 2012-08-06T01:52:45.243 に答える