在vba 代码中有如下的内容需要进行一个比较。Dim rs as dao.recordsetset rs = CurrentDB.OpenRecordset("table1", dbopentable, dbinconsistent)rs.movefirstdo until rs.eof
  if rs.[ID TB1] = Nz(Me.myEditBox1.value) then
  msgbox "发现一个重复项目"
  end if
  rs.movenext
loop
... ... ...
我希望在myEditBox这个textbox里面输入一个值后,
用do until循环到table1之中寻找[ID TB1]项是否有同样的值在重复。
(table1中的[ID TB1]字段在table1中是长整数型)可是却发现,这个比较if rs.[ID TB1] = Nz(Me.myEditBox1.value) 在
rs.[ID TB1] 和 Nz(Me.myEditBox1.value)的值同为一个整数
  (比如591)的时候,
无法被视为相等,msgbox 无法被执行到。并且在调试中发现
如果把等式 if rs.[ID TB1] = Nz(Me.myEditBox1.value)
无论换成: if 591 = Nz(Me.myEditBox1.value) 
或者换成: if 591 = rs.[ID TB1]
都能够被正确的执行请问这个比较有什么问题?
正确的写法应该是怎样?

解决方案 »

  1.   

    if rs.[ID TB1] = Nz(Me.myEditBox1.value,0)
      

  2.   

    使用 Nz 函数可以返回 0,或一个空字符串(" ") ,或者当一个 Variant 为 Null 时,该函数返回其他的指定值。例如,您可以使用该函数将 Null 值转换为其他值并防止它通过表达式扩散。语法Nz(variant[, valueifnull])Nz 函数具有如下参数:参数 说明 
    variant 各种数据类型的 Variant。 
    Valueifnull 可选参数(除非在查询中使用)。一个 Variant,提供当 variant 参数为 Null 时的返回值。该参数使您能够返回一个值(除了 0 或空字符串以外的其他值)。
    注意   如果在查询的表达式中使用了不带 ValueIfNull 参数的 Nz 函数,则对包含 Null 值的字段,其返回结果为空字符串。
     
      

  3.   

    谢谢,教导,
    目前出问题还不是Nz(Me.myEditBox1.value)为空值的情况,
    目前的问题是Nz(Me.myEditBox1.value)和rs.[ID TB1]均同时为有效数值,
    比如591, 9002235之类的数值时,无法被检出相等。
      

  4.   

    msgbox Me.myEditBox1.value & rs.[ID TB1]
    结果是什么 
    如果可以的话,
    上传你的MDB到www.access911.net/csdn
    只要有问题的表、查询,用WINRAR压缩
      

  5.   

    测过了
    msgbox Me.myEditBox1.value & rs.[ID TB1]
    的显示值是591591
    (当我输入591到text box 时)可是下面的
    if rs.[ID TB1] = Nz(Me.myEditBox1.value,0)
    却无法被检出相等
      

  6.   

    如果可以的话,
    上传你的MDB到www.access911.net/csdn
    只要有问题的表、查询,用WINRAR压缩
      

  7.   

    你的这个rs.[ID TB1] 是不是字符型啊? 591后有没有空格?改成这个先试一下
    if rs.[ID TB1]+0 = Nz(Me.myEditBox1.value,0)+0
      

  8.   

    我做了一个测试程序,上传到了如下地址
    看来是有普遍性的现象 http://access911.net/csdn/FileDescription.asp?mdb=2011-5-26&id=30
      

  9.   

    http://access911.net/csdn/FileDescription.asp?mdb=2011-5-26&id=32对不起了,我压缩后上传了
      

  10.   

    If rs![ID MOLT] = Val(Nz(Me.test0, 0)) Then
    类型不匹配
      

  11.   

    请问,一般的textbox上输入的值
    都需要这样的变换才能够比较么?
      

  12.   

    多谢了,我发现
    如果用typename函数测rs![ID MOLT]的时候,得到的结果是field,而且 If Val(rs![ID MOLT]) = Nz(Me.test0, 0) Then
    也可以得到正确的结果。那么说用dao得到的字段值也和 textbox 的输入值一样
    如果要进行比较的时候最好 进行型变换。
      

  13.   

    Val(Me.myEditBox1.value,0)
    行不?
      

  14.   

    效率低在于你根本没有用好数据连接对象的方法,而是靠循环加手工代码来做. 
    比如你可以直接在SELCET在打开数据记录的时候就加上WHERE条件直接得到包含目标条件的记录.
    即使已经全部打开数据记录的情况下,也可以使用resordset的filter属性来筛选记录.
    以上两种方法只要你看一下recordcount是否为0就知道是否有符合条件的记录存在了.
    其次,如果当你的数据库内没有记录,或者记录中这个"ID TB1"字段内容有空值,你的代码就很杯具.
    不管怎么说,使用循环再逐条记录比较的方法去找某条特定记录是很不靠谱的做法.
    VB里面的数组什么可以这么用,但是数据库其实是有自己的一套方法的,你最好还是按数据库的方法来办.