2012-04-21 87 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