2012-04-21 23 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 –

+2

使用・(個人的な好み、無視して自由に感じます) + VBAで連結すると、null文字列を返すときに問題が発生する可能性があります。あなたはMedalComboのバインドされたフィールドが数値ではないと確信していますか? – Fionnuala

+0

ありがとうございます。それはトリックでした! – Imran

答えて

2

Accessでコンボボックスを使用する場合、.valueが本当に必要なものであることを確認する必要があります。しばしば最初の列が.valueで隠され、ドロップダウンボックスに表示されるのは.valueではありません。コンボボックスを使用して混乱を取り除くときは、.columnsプロパティを使用します。

また、コンボボックスの結果がテキストではなく数値であることを確認するために、val()関数を使用してコンボボックスデータを数値に変換しました。それがすでに数字である場合、これは効果がありません。それ以外の場合は、文字列として格納されている数字の場合は数値に変換します。これは厳密には必要ではないかもしれないが、別の可能性のある問題を取り除く。コンボボックスの列に数値に変換できないテキストがある場合は、0を返します。これをコード内でテストできます。私はRemouは

  • 言ったように私は&で+を置き換えビット以下

    • でコードをクリーンアップ

      は.columns(0)に.VALUEを変更しました。探している列が最初の列でない場合は、0を適切な値に変更してください。

    • value()function
    • 行を削除してください。

    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

    関連する問題