顧客フォームと顧客登録フォームというフォームを作成しました。顧客フォームには登録画面ボタンを作成しボタンクリック時に顧客登録フォームに移動するようになっています。
顧客登録フォームには、顧客番号、顧客名を入力します。
顧客登録フォームで入力したデータは顧客フォームに新規レコードとして追加されるようにしました。
そこで質問なのですが、顧客登録フォームで入力した内容が登録済みの 顧客番号、顧客名、2つとも重複している場合に「そのデータはすでに登録済みです」というメッセージを出したいのですがどのようなVBAを組めばいいのかご教示願います。
環境は以下の通りです。
OS:win7
ver:2003
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/02 02:07
回答4件
0
ベストアンサー
連結フォームということなので、フォームの「挿入前処理」イベントでチェックすれば、Cancelによって挿入を中止することができます。
VBA
1Private Sub Form_BeforeInsert(Cancel As Integer) 2If DCount("テーブルの主キー", "テーブル名", "顧客番号=" & Me.顧客番号のコントロール名 & " and 顧客名=" & Me.顧客名のコントロール名) > 0 Then 3 MsgBox "そのデータはすでに登録済みです" 4 Cancel = True 5End If 6End Sub
投稿2018/07/02 03:38
総合スコア25206
0
せっかくのAccess(データベース)なので、データを格納するテーブル側で主キーかユニーク制約をかけておいて、INSERTしてみてエラーになったらメッセージ表示ではだめでしょうか。
投稿2018/07/02 02:59
総合スコア2037
0
DAOを用いてレコード検索を行う方法 : VBAのTips解説
顧客データを格納するテーブルをOpenRecordsetメソッドで開いて、
FindFirstメソッドで顧客番号、顧客名を条件に合致するレコードを検索。
NoMatchで既存データがないことを確認してからデータ追加のためにAddNewする流れです。
投稿2018/07/02 02:33
編集2018/07/02 02:35退会済みユーザー
総合スコア0
0
標準モジュールに
VBA
1 2'処理モード(コード) 3Public Const COM_SHORI_CODE_INSERT As Integer = 0 4Public Const COM_SHORI_CODE_UPDATE As Integer = 1 5'処理モード(文言) 6Public Const COM_SHORI_MONGON_INSERT As String = "新規登録" 7Public Const COM_SHORI_MONGON_UPDATE As String = "更新登録" 8 9'////////////////////////////////////////////////////////// 10' 11' 件数取得 12' 13'////////////////////////////////////////////////////////// 14Public Function GetRowCnt(ByVal tblName As String, _ 15 Optional strWhere As String) As Long 16 17On Error GoTo Err_Proc 18 19 Dim strSQL As String 20 Dim rs As Recordset 21 Dim cnt As Long 22 23 '初期化 24 cnt = 0 25 26 'SQL文字列生成 27 strSQL = "SELECT COUNT(*) AS rowcnt FROM " & tblName & " " 28 '抽出条件生成 29 If IsNull(strWhere) = False Then 30 strSQL = strSQL & strWhere 31 End If 32 33 'データ取得 34 Set rs = CurrentDb.OpenRecordset(strSQL) 35 36 '最大値取得 37 If Not rs Is Nothing Then 38 If (IsNull(rs![RowCnt]) = False) Then 39 cnt = rs![RowCnt] 40 Else 41 cnt = 0 42 End If 43 Else 44 cnt = 0 45 End If 46 47 '戻りセット 48 GetRowCnt = cnt 49 50Exit_Proc: 51 52 'オブジェクト破棄 53 If Not rs Is Nothing Then 54 Set rs = Nothing 55 End If 56 57 Exit Function 58 59Err_Proc: 60 61 Resume Exit_Proc 62 63End Function
顧客登録フォームに
'////////////////////////////////////////////////////////// ' ' プライベート変数 ' '////////////////////////////////////////////////////////// Dim m_shori_mode As String '処理モード Dim m_顧客番号 As String '顧客番号 '////////////////////////////////////////////////////////// ' ' チェック処理 ' '////////////////////////////////////////////////////////// Private Function CheckInput() As Boolean On Error GoTo Err_Proc '================================================= ' 重複登録チェック '================================================= Dim strWhere As String If (m_shori_mode = COM_SHORI_CODE_INSERT) Then ' 抽出条件生成 strWhere = " WHERE 顧客テーブル.顧客番号 = '" & Me.顧客番号 & "'" ' 件数チェック If (GetRowCnt("顧客テーブル", strWhere) > 0) Then MsgBox "入力された「顧客番号」は既に登録されています。", vbExclamation, "コード重複エラー" Me.顧客番号.SetFocus CheckInput = False GoTo Exit_Proc End If ' 戻り値設定 CheckInput = True Exit_Proc: Exit Function Err_Proc: Err.Number) MsgBox (Err.Number & ", " & Err.Description) '戻りセット CheckInput = False Resume Exit_Proc End Function '////////////////////////////////////////////////////////// ' ' 登録ボタン:クリック時処理 ' '////////////////////////////////////////////////////////// Private Sub cmd_sign_Click() On Error GoTo Err_Proc ' 確認MSG If (vbYes = MsgBox("登録処理を実行します。" & vbCrLf & "宜しいですか?", vbYesNo, "登録確認")) Then '入力項目チェック If (CheckInput = True) Then '登録処理 ' '処理指定 ' Select Case m_shori_mode ' Case COM_SHORI_CODE_INSERT ' ' 新規登録処理 ' If (InsertData = False) Then ' MsgBox "新規登録処理でエラーが発生しました。", vbCritical, "エラー発生" ' Exit Sub ' Else ' MsgBox "登録処理が完了しました。", vbInformation, "処理完了" ' '画面を閉じる ' DoCmd.Close ' End If ' Case COM_SHORI_CODE_UPDATE ' ' 更新登録処理 ' If (UpdateData(m_顧客番号) = False) Then ' MsgBox "更新登録処理でエラーが発生しました。", vbCritical, "エラー発生" ' Exit Sub ' Else ' MsgBox "登録処理が完了しました。", vbInformation, "処理完了" ' '画面を閉じる ' DoCmd.Close ' End If ' End Select End If End If Exit_Proc: Exit Sub Err_Proc: MsgBox (Err.Number & ", " & Err.Description) Resume Exit_Proc End Sub
というような感じで私はやってます。
投稿2018/07/02 01:49
総合スコア46
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。