我有以下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未处理此错误。
答案 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提供了一个看起来像工作解决方案的东西,但他还没有完全解释为什么他以不同的方式实现它。以下是一些原因:
原始函数的参数都定义为Double。这些既不是Null也不是非数字,因此原始代码中IsNumeric()的所有测试都是浪费时间,因为它们永远不会返回FALSE。
“条件表达式中的数据类型不匹配”是一个非常常见的错误消息,来自将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