インターフェイスをどれだけ使いやすくしたいかによって、2 つのことが必要になると思います。
ユニークなインデックス
値の組み合わせが別の行に重複したくない設定テーブルの列に、複数列の一意のインデックスを追加します。元の投稿へのコメントで KFleschner によって提供されたリンクで方法を読むか、手順に沿ったスクリーンショットを含むこの質問の 2 番目の回答を確認してください: MS アクセス データベースで複数列の一意のインデックスを作成できますか? . これにより、設定テーブルでの重複が禁止されます。
たとえば、設定と実験がコンピューター リグ用で、次の列を含む [設定] テーブルがあるとします。
設定ID、RAM_GB、CPU_GHz
次に、プライマリ キーは (SettingID) になり、複数列の一意のインデックスは (RAM_GB, CPU_GHz) になります。これは、RAM 容量と CPU 速度が同じレコードが 1 つだけ必要なためです。
データベース言語では、主キーである SettingID は代理キーと呼ばれるものになります。そして、新しい複数列の一意のインデックスは、自然キーと呼ばれるものになります。どちらも一意の行を識別するために使用できますが、主キー (代理キー) は、Experiments テーブルの SettingID などの外部キー関係で使用されるものです。
これは、データベース レベルで適用されるため、重複の問題を防ぐことができます。ただし、一致する自然キーを持つレコードにフォームが自動的にジャンプすることはありません。代わりに、Access は、インデックスに違反するレコードを入力したという行に沿ったメッセージでユーザーに警告します。しかし、それ以上はありません。ユーザーは、新しいレコードをキャンセルして、自分で一致するレコードを探す必要があります。
更新イベント前
Before Insert イベントは、新しいレコードの入力の最初の文字でトリガーされます。詳細については、 http://msdn.microsoft.com/en-us/library/office/ff835397.aspxを参照してください。これは早すぎます。Before Update イベントが必要です。そして、次のようにコードをイベントに追加します。
Private Sub Form_BeforeUpdate(Cancel As Integer)
Set rst = Me.RecordsetClone
rst.FindFirst "[SettingID] <> " & Me.SettingID & " AND [RAM_GB] = " & Me.RAM_GB & " AND [CPU_GHz] = " & Me.CPU_GHz
If Not rst.NoMatch Then
Cancel = True
If MsgBox("Setting already exist; goto existing record?", vbYesNo) = vbYes Then
Me.Undo
DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID")
End If
End If
rst.Close
End Sub
このコードは、いくつかのことを前提としています。
[RAM_GB]
および[CPU_GHz]
は、複数列の一意のインデックスの列です。
[SettingID]
主キーの列です。
必要に応じて列名などを微調整すると、プロンプトを表示して既存のレコードに自動ナビゲートする方法も得られます。