プロが教える店舗&オフィスのセキュリティ対策術

アクセス初級者です。
会員登録を管理するシステムを作りたいです。
例えば、「会員登録フォーム」(会員番号(主キー)、名前、性別、生年月日)をテーブル1に格納。
データを修正をする時「検索フォーム」より名前で検索して、「修正フォーム」へ飛び修正フォームから修正をしたいです。
updateメソッドを使ってやってみましたが、会員番号を修正する場合はテーブル1に更新後のレコードが格納できるのですが、それ以外の項目を修正しようとすると(修正のコマンドボタンを押した際)「会員番号の重複」で先へ進めません。
VBAのお詳しい何方か助けて頂けませんでしょうか。

質問者からの補足コメント

  • 文字数がオーバーしてしまうので画像を3枚、順に添付させていただきました。

    「アクセスのレコードをフォームで修正したい」の補足画像1
      補足日時:2022/03/14 22:49
  • 2枚目です。

    「アクセスのレコードをフォームで修正したい」の補足画像2
      補足日時:2022/03/14 22:50
  • 3枚目です。

    *上記3枚のコードで入力しますと質問時と異なり、
      ID変更もID以外の変更も格納されますが重複したIDも格納されてしまいます。
     ・IDを変更した時に重複格納できないようにするにはどのようにすればよろしいでしょうか?

      補足日時:2022/03/14 22:55
  • 3枚目の画像が抜けていました。

    「アクセスのレコードをフォームで修正したい」の補足画像4
      補足日時:2022/03/14 22:56
  • Private Sub 修正_Click()
    Dim cn As ADODB.Connectiont
    Dim rs As ADODB.Recordset
    Dim nret As Long
    frg1 = 0

    If Dcount("会員番号", "Q会員番号修正") > 0 Then
    nret = Msgbox("会員番号が重複しています")
    Cancel = True
    会員番号.SetFocus
    frg1 = 1
    End If

    If frg1 = 1 Then
    会員番号.SetFocus
    Exit sub
    End If

      補足日時:2022/03/16 00:00
  • IF Msgbox("この会員番号で修正しますか?yes/no", vbYesNO, "修正確認") = vbYes Then
    Set cn = CurrentProject.Connection
    Set rs = New ADODB.Recordset

    rs.open "テーブル1", cn, adOpenKeyset, adLockOptimistic

    rs.moveFirst
    Do Until rs.EOF
    rs.Find "会員番号 = " & Forms!検索!会員番号
    If rs.EOF Then
    Exit Do
    Else
    rs.Delete

    rs.AddNew
    rs![会員番号] = me.会員番号
    rs![カナ氏名] = me.カナ氏名
    rs![生年月日] = me.生年月日
    rs.update

    rs.MoveNext

      補足日時:2022/03/16 00:03
  • Q会員番号修正のSQLは、[Forms]![修正]![会員番号]
    修正フォームのレコードソースは、テーブル1 です。

      補足日時:2022/03/16 22:48
  • 上記の方法を試してみましたが修正ボタンを押してもテーブルに格納されませんでした。
    検索フォーム経由で修正フォームを呼び出さず、直接修正フォームに入力するとレコードは格納されるのですが・・・。
    登録フォームに入力しテーブル1へ格納
    検索フォームの登録ボタンで対象レコードを検索して修正ボタンで修正フォームを開く。
    修正フォームで修正→テーブル1へ格納
    としたいのですがうまくいきません。
    検索フォームに問題があるのでしょうか?
     検索フォームから修正フォームを開くコマンドボタンは、
      Docmd.Openform "修正"
    Forms!修正!会員番号 = Forms!検索!会員番号
      Forms!修正!カナ氏名 = Forms!検索!カナ氏名
      Forms!修正!生年月日 = Forms!検索!生年月日
     レコードソースはテーブル1です。

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/03/20 00:07
  • 検索フォームの修正ボタンを押すと、
      実行時エラー2465
       指定した式で参照されている'テーブル          
       1'フィールドが見つかりません。
    というエラーが出てしまい進めません。なぜでしょうか…

    No.5の回答に寄せられた補足コメントです。 補足日時:2022/03/22 10:56
  • うーん・・・

    ![会員番号]

    コンパイルエラー:
    対象はコレクションでなければなりません。

    で進めません…。

    No.6の回答に寄せられた補足コメントです。 補足日時:2022/03/22 11:45

A 回答 (10件)

Option Compare Database


Option Explicit
Private Sub 修正_Click()
    On Error Resume Next
    DoCmd.RunCommand acCmdSaveRecord
    Select Case Err.Number
        Case 0
            DoCmd.RunCommand acCmdClose
        Case 3022
            MsgBox "会員番号は使用されています"
        Case Else
            MsgBox Err.Number & vbCrLf & Err.Description
    End Select
End Sub
    • good
    • 2
この回答へのお礼

出来ました!
お忙しい中何度もご教示いただき本当にありがとうございました。
何週間も悩んでいたの事が一瞬にして解決してしまい感動しています^^

お礼日時:2022/03/22 18:55

>「会員番号は使用されています」というエラー表示をさせたいのですが



普通に修正を掛ければエラーになるはずですが...
エラーメッセージを変えたい?

ってか、「会員番号の変更あり」なんですか?
    • good
    • 1
この回答へのお礼

はい。エラーメッセージを変えたいです。

会員登録をする際に、会員番号や誕生日の入力ミスをして修正フォームから再登録という設定です。

お礼日時:2022/03/22 15:18

修正フォームのレコードソースを正しく設定してください。


また、各項目はレコードソースの各項目を参照するようにしてください。
    • good
    • 1
この回答へのお礼

出来ました!
修正フォームの修正ボタンを押した時に、会員番号がタブっていた場合に「会員番号は使用されています」というエラー表示をさせたいのですが、どうしたら良いでしょうか?

お礼日時:2022/03/22 14:55

Option Compare Database


Option Explicit
Private Sub 修正_Click()
    DoCmd.OpenForm "修正"
    Forms![修正].Filter = "会員番号=" & Me.Recordset.Fields![会員番号]
    Forms![修正].FilterOn = True
End Sub
    • good
    • 1
この回答へのお礼

今度は、検索フォームから修正フォームは開きますが修正フォームの各テキストボックスが空欄になってしまいます。

お礼日時:2022/03/22 14:11

Private Sub 修正_Click()


    DoCmd.OpenForm "修正"
    Forms![修正].Filter = "会員番号=" & Me.RecordSource![会員番号]
    Forms![修正].FilterOn = True
End Sub
この回答への補足あり
    • good
    • 1

なんか根本的に、難しく難しく考えているようですね。



Access はテーブルをそのまま開けば、追加変更削除検索すべて出来るようになっています。

なんでも出来すぎて操作ミスが怖いというときにプログラムを作ります。

例えば、検索したいだけなのにチョット触るとデータが変わってしまう、というようなときに検索フォームを作るわけです。

ですから、プログラムでやるべきことは、ああやってこうやってということではなく、この機能を使えなくしてこれも殺してというマイナスの作業です。

検索フォームから修正フォームを開くコマンドボタンは、検索したデータ以外はさわれないようにするということです。

Private Sub 修正_Click()
    DoCmd.OpenForm "修正"
    Forms![修正].Filter = "会員番号=" & Me![テーブル1]![会員番号]
    Forms![修正].FilterOn = True
End Sub

修正フォーム上の[修正]ボタンを使いたいなら、

Private Sub 修正_Click()
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.RunCommand acCmdClose
End Sub

これだけ。
この回答への補足あり
    • good
    • 1

>修正フォームのレコードソースは、テーブル1 です。



であれば、VBAで何もしなくても追加、更新、削除ができるはず。

[修正]ボタンを使いたいなら、
Docmd.RunCommand acCmdSaveRecord
これだけ。
この回答への補足あり
    • good
    • 2

"Q会員番号修正"クエリを開示してください。


クエリの中身はSQL文です。
SQLビューで開いて、SQL文を開示してください。

あと、"修正"フォームのプロパティ画面を開いて、レコードソースを開示してください。
    • good
    • 1

画像ではコピペで検証できない。

(-_-;)
    • good
    • 1

あなたの書いたVBAを開示すると回答が付きやすくなります。

    • good
    • 1
この回答へのお礼

ありがとうございます。
後日出勤したときに転記させていただきます。

お礼日時:2022/03/11 23:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A