VBA中每月累积的固定金额

时间:2015-01-06 05:36:32

标签: sql vba ms-access access-vba

我需要一个能够自动汇总列会计年度至今月份值的函数。

查询的SQL如下:

SELECT "TBD" AS CATEGORY, tbl_SP.SYSTEM, tbl_SP.T3_UNIT AS ORG, tbl_SP.T1_UNIT AS Tier1_Unit, tbl_SP.UNIT_STAFF AS Tier2_Unit, tbl_SP.T3_UNIT AS Tier3_Unit, tbl_SP.OCT_O AS OCT, tbl_SP.NOV_O AS NOV, tbl_SP.DEC_O AS [DEC], tbl_SP.JAN_O AS JAN, tbl_SP.FEB_O AS FEB, tbl_SP.MAR_O AS MAR, tbl_SP.APR_O AS APR, tbl_SP.MAY_O AS MAY, tbl_SP.JUN_O AS JUN, tbl_SP.JUL_O AS JUL, tbl_SP.AUG_O AS AUG, tbl_SP.SEP_C AS SEP, Current_M([OCT_O],[NOV_O],[DEC_O],[JAN_O],[FEB_O],[MAR_O],[APR_O],[MAY_O],[JUN_O],[JUL_O],[AUG_O],[SEP_O]) AS Current_Month_SP, AcctType([MDEP],[T3_UNIT]) AS Acct_Type
FROM tbl_SP;

例如,它是1月,所以我想要SUM这些列

[OCT] + [NOV] + [DEC] + [JAN]

为了测试它,我尝试用别名

粘贴它
Current_YTD_value: [OCT] + [NOV] + [DEC] + [JAN]

有效。

那么,当我在函数中使用它时,为什么以下工作不起作用? (我每个月都尝试使用 'currency' 类型,但我得到#Error!)

我已经评论了其他尝试,但是让相关的人尝试了。

Public Function Current_M(  lJan As Long, lFeb As Long, lMar As Long, _
                            lApr As Long, lMay As Long, lJun As Long, _
                            lJul As Long, lAug As Long, lSep As Long, _
                            lOct As Long, lNov As Long, lDec As Long) As Currency

    Dim dtToday As Date

    dtToday = Now()

    Select Case Month(dtToday)
        Case 1
            Current_M = Nz(lOct, 0) + Nz(lNov, 0) + Nz(lDec, 0) + Nz(lJan, 0)
        Case 2
            Current_M = Nz(lOct, 0) + Nz(lNov, 0) + Nz(lDec, 0) + Nz(lJan, 0) + Nz(lJan, 0)

    End Select

End Function

1 个答案:

答案 0 :(得分:0)

我不明白为什么该功能包含Nz(),例如......

Case 1
    Current_M = Nz(lOct, 0) + Nz(lNov, 0) + Nz(lDec, 0) + Nz(lJan, 0)

这可能是您所面临的问题的线索。

由于 lOct,lNov,lDec,lJan 都被声明为As Long,因此无法接受Null。换句话说,当 lOct 永远不能为空时,Nz(lOct, 0)是无用的。

如果你在立即窗口中调用你的功能......

? Current_M(Null, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

...访问将抱怨错误#94,"无效使用Null"

但是,当您从查询中调用该函数时,您将看不到该错误消息。相反,当您在数据表视图中显示查询时,Access会显示 #Error!

如果希望函数接受Null值,请将参数声明为 Variant 而不是 Long

这是我对你问题原因的最好猜测。但是,如果您正在为其提供文本值,例如" NA" ,该函数也会生成错误,而这些文本值无法转换为长整数。