2010-01-12 146 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