Microsoft Access 掲示板

クエリが複雑すぎます / 16

18 コメント
views
4 フォロー
16

メインのVBAコード

Sub 月次移動平均計算()
    Const c_開始月 = 7

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Dim 月順(11) As String
    Dim i As Long
    Dim 前月数量 As Long
    Dim 前月金額 As Double
    Dim 仕入数量 As Long
    Dim 仕入金額 As Double
    Dim 払出数量 As Long
    Dim 払出金額 As Double
    
    'ループ処理したいので月の並びを配列に確保'
    For i = 0 To 11
        月順(i) = (c_開始月 + i - 1) Mod 12 + 1 & "月"
    Next
    '--(ここまで)--'

    Set db = CurrentDb
    
    '下処理クエリ実行'
    db.Execute "Q月次移動平均表Clear"
    db.Execute "Q月次移動平均基礎データ作成"
    '--(ここまで)--'
    
    Set rs = db.OpenRecordset("T月次移動平均表")
    
    Do Until rs.EOF
        rs.Edit
        
        '移動平均計算'
        前月数量 = Nz(rs!期首数量, 0)
        前月金額 = Nz(rs!期首金額, 0)
        For i = 0 To 11
            仕入金額 = Nz(rs(月順(i) & "仕入金額"), 0)
            仕入数量 = Nz(rs(月順(i) & "仕入数量"), 0)
            払出数量 = Nz(rs(月順(i) & "売上数量"), 0)
            
            If 前月数量 + 仕入数量 = 0 Then
                払出金額 = 0
            Else
                払出金額 = (前月金額 + 仕入金額) / (前月数量 + 仕入数量) * 払出数量
            End If
            前月金額 = 前月数量 + 仕入金額 - 払出金額
            
            rs(月順(i) & "払出金額") = 払出金額
            rs(月順(i) & "金額") = 前月金額
            
            前月数量 = Nz(rs(月順(i) & "数量"), 0)
        Next
        '--(ここまで)--'
        
        rs.Update
        rs.MoveNext
    Loop
    
    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

変数の型(平均計算で小数点以下がでる)のと/ (前月数量 + 仕入数量)があるのでそこの条件判断をしてあげないといけないかなぁという感じ
計算部分はちょっと自信ないので出力結果が正しいかは十分にテストしてください

テーブル、クエリ、VBAと使うものが多いのでフィールド名を変えたりする場合はよく見てください

ワークテーブルを使う方法は実行する度にACCESSファイルが肥大化するので適宜、最適化が必要になると思います。大本のデータとはファイルを分けてリンクテーブルで拾うようにするといいかな?

いろいろ手間な部分もあるのでhatenaさんの方法でうまくいけばそれでいいんじゃないかな。とも

通報 ...