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

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

ただいまの
回答率

90.50%

  • VBA

    1803questions

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

  • Access

    432questions

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

Access データの重複なし

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 327

misima

score 7

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

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

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

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

環境は以下の通りです。 

OS:win7 
ver:2003

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sazi

    2018/07/02 11:05

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

    キャンセル

  • misima

    2018/07/02 11:07

    はい!連結フォームです

    キャンセル

回答 4

checkベストアンサー

+1

連結フォームということなので、フォームの「挿入前処理」イベントでチェックすれば、Cancelによって挿入を中止することができます。

Private Sub Form_BeforeInsert(Cancel As Integer)
If DCount("テーブルの主キー", "テーブル名", "顧客番号=" & Me.顧客番号のコントロール名 & " and 顧客名=" & Me.顧客名のコントロール名) > 0 Then
    MsgBox "そのデータはすでに登録済みです"
    Cancel = True
End If
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 13:07

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

    キャンセル

  • 2018/07/04 10:47

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

    キャンセル

+1

標準モジュールに

'処理モード(コード)
Public Const COM_SHORI_CODE_INSERT            As Integer = 0
Public Const COM_SHORI_CODE_UPDATE            As Integer = 1
'処理モード(文言)
Public Const COM_SHORI_MONGON_INSERT          As String = "新規登録"
Public Const COM_SHORI_MONGON_UPDATE          As String = "更新登録"

'//////////////////////////////////////////////////////////
'
' 件数取得
'
'//////////////////////////////////////////////////////////
Public Function GetRowCnt(ByVal tblName As String, _
                            Optional strWhere As String) As Long

On Error GoTo Err_Proc

    Dim strSQL      As String
    Dim rs          As Recordset
    Dim cnt         As Long

    '初期化
    cnt = 0

    'SQL文字列生成
    strSQL = "SELECT COUNT(*) AS rowcnt FROM " & tblName & " "
    '抽出条件生成
    If IsNull(strWhere) = False Then
        strSQL = strSQL & strWhere
    End If

    'データ取得
    Set rs = CurrentDb.OpenRecordset(strSQL)

    '最大値取得
    If Not rs Is Nothing Then
        If (IsNull(rs![RowCnt]) = False) Then
            cnt = rs![RowCnt]
        Else
            cnt = 0
        End If
    Else
        cnt = 0
    End If

   '戻りセット
   GetRowCnt = cnt

Exit_Proc:

   'オブジェクト破棄
   If Not rs Is Nothing Then
    Set rs = Nothing
   End If

    Exit Function

Err_Proc:

    Resume Exit_Proc

End 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 11:08

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

    キャンセル

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 13:06

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

    キャンセル

  • 2018/07/02 13:22

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

    キャンセル

  • 2018/07/02 13:42

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 13:07

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1803questions

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

  • Access

    432questions

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