質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

4回答

3958閲覧

Access データの重複なし

misima

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/07/01 23:48

顧客フォームと顧客登録フォームというフォームを作成しました。顧客フォームには登録画面ボタンを作成しボタンクリック時に顧客登録フォームに移動するようになっています。

顧客登録フォームには、顧客番号、顧客名を入力します。

顧客登録フォームで入力したデータは顧客フォームに新規レコードとして追加されるようにしました。

そこで質問なのですが、顧客登録フォームで入力した内容が登録済みの 顧客番号、顧客名、2つとも重複している場合に「そのデータはすでに登録済みです」というメッセージを出したいのですがどのようなVBAを組めばいいのかご教示願います。

環境は以下の通りです。

OS:win7
ver:2003

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/07/02 02:05

顧客登録フォームは連結フォームですか?
misima

2018/07/02 02:07

はい!連結フォームです
guest

回答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

sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misima

2018/07/02 04:07

回答ありがとうございます!試してみます
misima

2018/07/04 01:47

今回はsaziさんのご回答でVBAを組ませていただきました。ご回答ありがとうございました。
guest

0

せっかくのAccess(データベース)なので、データを格納するテーブル側で主キーかユニーク制約をかけておいて、INSERTしてみてエラーになったらメッセージ表示ではだめでしょうか。

参考) http://tsware.jp/tips/tips_593.htm

投稿2018/07/02 02:59

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misima

2018/07/02 04:07

回答ありがとうございます!試してみます
guest

0

DAOを用いてレコード検索を行う方法 : VBAのTips解説

顧客データを格納するテーブルをOpenRecordsetメソッドで開いて、
FindFirstメソッドで顧客番号、顧客名を条件に合致するレコードを検索。
NoMatchで既存データがないことを確認してからデータ追加のためにAddNewする流れです。

投稿2018/07/02 02:33

編集2018/07/02 02:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misima

2018/07/02 04:06

回答ありがとうございます!試してみます
退会済みユーザー

退会済みユーザー

2018/07/02 04:22

よく考えたら、フォームのデータソースで既に顧客マスターテーブルと連結しちゃっているんですね、 私の書いた方法は非連結が前提のものだったので、saziさん案が良いかもです。
misima

2018/07/02 04:42

なるほど。 ですが m6u様のご回答も今後に生かせるとおもうので、ご回答に感謝です。
guest

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

tera_taro

総合スコア46

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misima

2018/07/02 02:08

回答ありがとうございます!試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問