2012-04-21 110 views
4

我試圖在我的VBA中創建一個函數,如果他們試圖插入的記錄已經存在,但是它返回一個類型不匹配。檢查記錄是否存在使用DLookup(有多個標準)

EventCombo是一個整數 MedalCombo是字符串

Private Sub MyCombo_BeforeUpdate(Cancel As Integer) 

If Not IsNull(DLookup("RacerID", "Medals", "RaceID = " + EventCombo.Value _ 
+ " AND Medal = '" + MedalCombo.Value + "'")) Then 
MsgBox "Record Exists" 
End If. 

End Sub 

這樣做什麼(或者是應該做)是確保沒有其他人在同一種族相同的獎章。

我在做什麼錯?

+0

http://msdn.microsoft.com/en-us/library/bb148913%28v=office.12%29.aspx – 2012-04-21 08:32:08

+2

使用&在VBA中連接時,+會導致返回空字符串的問題。您確定MedalCombo的綁定字段不是數字嗎? – Fionnuala 2012-04-21 09:08:51

+0

謝謝。這就是訣竅! – Imran 2012-04-21 11:23:31

回答

2

使用Access中的組合框,您需要確保.value真的是您想要的。通常第一列是隱藏的.value,而下拉框中可見的不是.value。當使用組合框來消除混淆時,我使用.columns屬性。

此外,爲了確保組合框的結果是一個數字而不是文本(因爲您沒有在您的示例中使用引號),我使用val()函數將組合框數據轉換爲數字。如果它已經是一個數字,這將不起作用。否則,如果它是以字符串形式存儲的數字,則會將其轉換爲數字。這可能不是絕對必要的,但它消除了另一個可能的問題。如果組合框列的值是某些不能轉換爲數字的文本,它將返回0,您可以在代碼中進行測試。

我清理你的代碼位有

  • 像Remou說
  • 改變。價值以.columns我更換+與&(0)。如果您正在查找的列不是第一個,請將0更改爲相應的值
  • value()函數
  • 刪除了行延續_。 (個人喜好,隨意忽略)

Private Sub MyCombo_BeforeUpdate(Cancel As Integer) 

    If Not IsNull(DLookup("RacerID", "Medals", "RaceID = " & Val(EventCombo.Columns(0)) & " AND Medal = '" & MedalCombo.Columns(0) & "'")) Then 
     MsgBox "Record Exists" 
    End If 

End Sub 
+1

在我看來,你最好使用綁定列值,而不是引用列,除非有特殊原因需要該列。如果您引用了綁定列,那麼可以更容易地更改sql,而無需更改所有代碼以進行匹配。而且,Val完全沒有必要。 – Fionnuala 2012-04-23 10:04:41