2010-01-12 115 views
2

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

任何人都可以帮助我吗?

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 

SQL查询在MS Access

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

反正是有赶上我用VBA得到错误?

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

回答

3

以上函数是一个有些奇怪,因为haarrrgh说。

它应该看起来更像下面的代码。您不需要检查每个参数(TotaalPrijs,ByVal AantalArtiklesPerOrder等)是否是一个数字,因为您将它们传递为Double。如果您通过除数字之外的任何内容(例如字母或Null),则会发生错误。如果这不是你想要的,考虑将参数传递为变体,然后你可以检查它们是数字。然而,正如你在查询中使用它,我建议你不要使用消息框,如果参数为空,则使其为零,如果这是它应该是。

还要注意GezaagdeOmzet =,而不是结果=

编辑评论重新

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 
+0

感谢Remou,但是在查询中运行时,我被这个函数返回的一些字段中的奇怪'#Error'卡住了? – 2010-01-12 14:21:01

+0

如果您将空值传递给您的函数,那么您将得到一个错误,我认为您是错误的。 – Fionnuala 2010-01-12 14:25:31

+0

那么如何解决这些空值?有没有办法避开? – 2010-01-12 14:30:26

0

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

如果直接运行函数而不是查询,会发生什么?
它也会抛出错误吗?

最后但并非最不重要 - 似乎有在功能两个错误,因为它现在是:

1)如果TotaalArtiklesPerOrder或AantalArtiklesVerwijderedUitZaaglijst为0,它抛出一个错误(这被逮住,但无论如何。 ..),因为那时你零在这条线划分:

result = TotaalPrijs/(AantalArtiklesPerOrder * TotaalArtiklesPerOrder) * AantalArtiklesVerwijderedUitZaaglijst 

检查,如果TotaalPrijs是0,但你全面检查了错误的方式:它可以通过什么来划分为零,但不可能将除以零

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

GezaagdeOmzet = result 
+0

我调整了代码,以照顾可能的除以零错误,并确保它实际上返回一些东西。我仍然得到错误。我如何在同一个表上自行运行它? – 2010-01-12 12:40:12

+0

好吧,刚刚运行它本身,没有它运行的总和功能。现在,在一些行中有'#Error',所以这可能导致Sum函数给出错误? – 2010-01-12 12:46:46

+0

所以,你的意思是你运行相同的查询,只是没有sum()和你的GezaagteOmzet()函数,直接显示像[tbl_ArtikelsPerOrder]![Aantal]这样的列,然后一些字段显示“#Error”?如果是的话,我想这个函数可以正常工作,并且你的查询一定有问题。 – 2010-01-12 12:55:41

2

@Remou提供什么在我看来就像一个可行的解决方案,但他并没有真正完全解释他为什么以不同方式实施。以下是一些原因:

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

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

+0

@D W芬顿,你可能希望查看@Tony以前的帖子,因为在查询中使用CDbl&Nz已经很困难。我希望上述功能可以帮助@Tony清楚地看到纠正查询的方法,并且该功能将变得多余。 – Fionnuala 2010-01-12 23:07:34