MS Access - 数据类型不匹配

时间:2010-01-12 12:10:52

标签: ms-access access-vba

我有以下VBA代码,并在执行时返回标准表达式中的“数据类型不匹配”。我似乎无法找出它为什么会给我这个错误。

有人能帮助我吗?

VBA:

Public Function GezaagdeOmzet(ByVal TotaalPrijs As Double, ByVal AantalArtiklesPerOrder As Double, ByVal TotaalArtiklesPerOrder As Double, ByVal AantalArtiklesVerwijderedUitZaaglijst As Double) As Double

    Dim result As Double

    On Error GoTo ErrHandler

    If IsNumeric(TotaalPrijs) = False Then
        MsgBox ("TotaalPrijs not a number")
        MsgBox (TotaalPrijs)
    End If

    If IsNumeric(AantalArtiklesPerOrder) = False Then
        MsgBox ("AantalArtiklesPerOrder not a number")
        MsgBox (AantalArtiklesPerOrder)
    End If

    If IsNumeric(TotaalArtiklesPerOrder) = False Then
        MsgBox ("TotaalArtiklesPerOrder not a number")
        MsgBox (TotaalArtiklesPerOrder)
    End If

    If IsNumeric(AantalArtiklesVerwijderedUitZaaglijst) = False Then
        MsgBox ("AantalArtiklesVerwijderedUitZaaglijst not a number")
        MsgBox (AantalArtiklesVerwijderedUitZaaglijst)
    End If

    If Not TotaalPrijs = 0 Then
        If AantalArtiklesPerOrder > 0 Then
            result = TotaalPrijs / (AantalArtiklesPerOrder * TotaalArtiklesPerOrder) * AantalArtiklesVerwijderedUitZaaglijst
            On Error GoTo ErrHandler
        Else
            MsgBox ("AantalArtiklesPerOrder is null, Cannot do calculation")
        End If
    Else
        MsgBox ("TotaalPrijs is null, cannot do division")
    End If

Exit Function
ErrHandler:
    MsgBox ("TotaalPrijs: " & TotaalPrijs & " TotaalArtiklesPerOrder: " & TotaalArtiklesPerOrder & " AantalArtiklesPerOrder: " & AantalArtiklesPerOrder & " AantalArtiklesVerwijderedUitZaaglijst: " & AantalArtiklesVerwijderedUitZaaglijst)
End Function

MS Access中的SQL查询

GezaagdeOmzet: Sum(GezaagdeOmzet([TotaalPrijs],[tbl_ArtikelsPerOrder]![Aantal],[Totaal],[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal]))

无论如何都要抓住我在VBA中遇到的错误?

Cstr或CDec或CDbl未处理此错误。

3 个答案:

答案 0 :(得分:3)

正如haarrrgh所说,上述功能有点奇怪。

它应该看起来更像下面的代码。您不需要检查每个参数(TotaalPrijs,ByVal AantalArtiklesPerOrder等)是否为数字,因为您将它们作为Double传递。如果您传递除数字之外的任何内容,例如字母或Null,则会出现错误。如果这不是您想要的,请考虑传递参数As Variant,然后检查它们是否为数字。但是,正如您在查询中使用它一样,我建议您不要使用消息框,如果参数为null,则将其设为零,如果它是应该的那样。

还要注意GezaagdeOmzet =,而不是result =

编辑评论

Public Function GezaagdeOmzet(ByVal TotaalPrijs As Variant, _
    ByVal AantalArtiklesPerOrder As Variant, _
    ByVal TotaalArtiklesPerOrder As Variant, _
    ByVal AantalArtiklesVerwijderedUitZaaglijst As Variant) As Double

    On Error GoTo ErrHandler

    If (Nz(AantalArtiklesPerOrder,0) * Nz(TotaalArtiklesPerOrder,0)) * _
       Nz(AantalArtiklesVerwijderedUitZaaglijst,0) = 0 Then
       GezaagdeOmzet = 0
    Else
        GezaagdeOmzet = Nz(TotaalPrijs,0) / _
        (Nz(AantalArtiklesPerOrder,0) * Nz(TotaalArtiklesPerOrder,0)) * _
       Nz(AantalArtiklesVerwijderedUitZaaglijst,0)
    End If

Exit Function

ErrHandler:
   ' MsgBox ("TotaalPrijs: " & TotaalPrijs & " TotaalArtiklesPerOrder: " _
    & TotaalArtiklesPerOrder & " AantalArtiklesPerOrder: " & AantalArtiklesPerOrder _
    & " AantalArtiklesVerwijderedUitZaaglijst: " _
    & AantalArtiklesVerwijderedUitZaaglijst)
End Function

答案 1 :(得分:2)

@Remou提供了一个看起来像工作解决方案的东西,但他还没有完全解释为什么他以不同的方式实现它。以下是一些原因:

  1. 原始函数的参数都定义为Double。这些既不是Null也不是非数字,因此原始代码中IsNumeric()的所有测试都是浪费时间,因为它们永远不会返回FALSE。

  2. “条件表达式中的数据类型不匹配”是一个非常常见的错误消息,来自将Null传递给用户定义函数的查询,这些函数无法在其参数中接受Null。将参数声明为变体是一种方法,但变体可能会导致各种问题,并且您会丢失强大的数据类型。我建议保留Double数据类型,并从原始查询中传递CDbl(Nz([TotaalPrijs],0))。

答案 2 :(得分:0)

为什么要运行一个返回 double 的函数,只将它转换为字符串并加总(即使它只是一个值)?
我不明白。

如果直接运行该功能,而不是在查询中,会发生什么? 它也会引发错误吗?

最后但并非最不重要的是 - 函数中似乎有两个错误,就像现在一样:

1)如果TotaalArtiklesPerOrder或AantalArtiklesVerwijderedUitZaaglijst为0,则会抛出一个错误(会被捕获,但无论如何......),因为那时你在这一行中除以零:

result = TotaalPrijs / (AantalArtiklesPerOrder * TotaalArtiklesPerOrder) * AantalArtiklesVerwijderedUitZaaglijst

检查TotaalPrijs是否为0,但你是以错误的方式检查它:可以将零除以任何东西,但是不可能将任何除以零< / em>的

2)该函数将始终返回0,因为您计算结果(在变量“result”中),但您不返回它。 你必须明确地这样做:

GezaagdeOmzet = result