フォームを利用したデータ登録について

このQ&Aのポイント
  • フォームを利用してACCESS2000にデータを登録する方法について説明します。
  • 登録フォームに必要事項を入力し、新規データをテーブルに追加します。品番を生成して登録する手順や連番の場合の処理についても解説します。
  • 質問者がコードを実行しても登録がされない問題が発生しています。コードの修正や確認すべきポイントについてアドバイスが欲しいとのことです。
回答を見る
  • ベストアンサー

フォームを利用したデータ登録について。

フォームを利用したデータ登録について。 環境:ACCESS2000 状況:フォーム(登録フォーム)    フォーム上コントロール     テキストボックス(品番頭、品番start、品番last、サイズ、商品名)     コマンドボタン(登録ボタン)    テーブル(商品マスター)    フィールド(品番  /  サイズ  /  商品名) 仕様: 登録フォームに必要事項を入れ、テーブルに新規データ追加をする。    その際、品番頭と品番startとを合体させ、テーブル品番フィールドに登録。    また連番の場合、品番startから品番lastまでの数字をそれぞれ品番頭と合体させ    サイズと商品名を登録する。    ※品番lastが空白の場合、無視し品番startのみ適用する。 コード: Private Sub 登録ボタン_Click()  Dim db As DAO.Database  Dim rs As DAO.Recordset  Dim i As Long  Set db = CurrentDb  Set rs = db.OpenRecordset("商品マスター", dbOpenDynaset) If Not IsNull(Me!品番last) Then  For i = Val(Me!品番start) To Val(Me!品番last)   rs.AddNew    rs!品番 = Me!品番頭 & CStr(i)    rs!サイズ = Me!サイズ    rs!商品名 = Me!商品名   rs.Update  Next i ElseIf IsNull(Me!品番last) Then   rs.AddNew    rs!品番 = Me!品番頭 & Val(Me!品番start)    rs!サイズ = Me!サイズ    rs!商品名 = Me!商品名   rs.Update End If  rs.Close   Set rs = Nothing  db.Close   Set db = Nothing MsgBox "登録完了" End Sub 今回新規データ追加作業をしていたところ、なぜかエラーは起きず メッセージまででているのですが、テーブルを開けて確認すると 登録されてない事がたびたびあり、原因がわからないため 質問させて頂きました。 コードがおかしい、これが足りない等正確に動かすために 色々教えて頂ければと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

たしか環境はAccess2000でしたね。 私のAccess2000の環境では以下のいずれも正常に 動作します。 If Not IsNull(Me!品番last) Then If Not IsNull(Me![品番last]) Then If Me!品番last = "" Then If Me![品番last] = "" Then これはどうですか、 If Not IsNull(Me!品番last.Value) Then If Not IsNull(Me![品番last].Value) Then 一応環境を述べますと、 WinXP Access2000 SP-3 WinXp Pro Access2000 SP-3 その他のAccessのバージョンも同様です。 IsNullは正常に動作する必要のある関数 ですが、ただIsNullに関し以下のような こともあるらしいのですが。 http://www.accessclub.jp/bbs/0070/beginers26630.html Val関数については性質をつかんでいればいいです。 Val("Access2000")とVal("2000Access")の場合など。 一応デバッグしたときのコード。まだデバッグ する項目が抜けていますが。 Valも入れたり入れなかったりはしています。 少々デバッグ方法も手抜きですが。 Private Sub 登録ボタン_Click() Dim db As Database Dim rs As Recordset Dim i As Long Dim s As String On Error GoTo ER_HA If IsNumeric(Me!品番start) Then MsgBox ("品番startに数値が入っています") Else MsgBox ("品番startに数値以外が入力されています") End If If IsNumeric(Me!品番last) Then MsgBox ("品番lastに数値が入っています") Else MsgBox ("品番lastに数値以外が入力されています") End If Set db = CurrentDb Set rs = db.OpenRecordset("在庫マスター", dbOpenDynaset) If Not IsNull(Me!品番last) Then ' If Not IsNull(Me![品番last]) Then ' If Me!品番last = "" Then ' If Me![品番last] = "" Then ' If Not IsNull(Me!品番last.Value) Then ' If Not IsNull(Me![品番last].Value) Then For i = Me!品番start To 品番last With rs rs.AddNew rs!品番 = Me!品番頭 & CStr(i) rs!商品名 = Me!商品名 rs!サイズ = Me!サイズ MsgBox ("品番 =" & Me!品番頭 & CStr(i) & vbCrLf & "商品名 =" & Me! 商品名 & vbCrLf & "サイズ =" & Me!サイズ) rs.Update End With Next i ElseIf IsNull(Me!品番last.Value) Then rs.AddNew rs!品番 = Me!品番頭 & Me!品番start rs!サイズ = Me!サイズ rs!商品名 = Me!商品名 MsgBox ("品番 =" & Me!品番頭 & Val(Me!品番start) & vbCrLf & "商品 名 =" & Me!商品名 & vbCrLf & "サイズ =" & Me!サイズ) rs.Update End If ER_HA: If Err.Number <> 0 Then MsgBox (Err.Number & vbCrLf & Err.Description) End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub 何か役に立てば。(立つほどのもはありませんが)

taho1999
質問者

お礼

ありがとうございます。 IsNullに関して、ヘルプ等良く確認して見直してみます。 たぶん書き方が上手くなかっただけだと思うので・・・。 また、デバッグまで教えて頂き感動です。 今回のDBは、とりあえず全て組み上げてから デバッグに手をつけようと思っており まだ手が届いてなかったので、上記参考にさせて頂きます。 本当に助かります。

その他の回答 (2)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

ACCESSが使える環境にないので■一般論■ですが。。。。 TEXTBOXは文字列が入力されるところですから 未入力(初期値)がNULL値とは考えられないので 未入力判定にはIsNullは使えない、ということでは? それから質問者のコードでちょと気になったところ、、   If Not IsNull(Me!品番last) Then  ▲ElseIf IsNull(Me!品番last) Then   End If ▲は、単に、Elseのみでいいかと、、 また同じようなコードはひとつに纏めて。。 '-------------------------------------------   Dim LastNo As Long  If Me!品番last = "" Then     LastNo = Val(Me!品番start)  Else     LastNo = Val(Me!品番last)  End If  For i = Val(Me!品番start) To LastNo     rs.AddNew     rs!品番 = Me!品番頭 & CStr(i)     rs!サイズ = Me!サイズ     rs!商品名 = Me!商品名     rs.Update  Next i '---------------------------------- ●実際には、品番startが未入力、0、数値でない文字列とか 品番startが品番lastより大きい、などのエラーチェックが必要になるかと。 ●ISNULLのヘルプをじっくり眺めてみることをお勧めします。 以上です。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

具体的にどのような入力をしたとき、どのような 登録漏れが起こるのかの情報を追加してください。 また、 MsgBox ("品番 =" & Me!品番頭 + CStr(i) & vbCrLf & "サイズ =" & Me!サイズ & vbCrLf & " 商品名 =" & Me!商品名) MsgBox ("品番 =" & Me!品番頭 & Val(Me!品番start) & vbCrLf & "サイズ =" & Me!サイズ & vbCrLf & "商品名 =" & Me!商品名) をそれぞれrs.UpDateの直前に入れてデータを確認してみてください。 ところでVal(Me!品番start) To Val(Me!品番last)のようにValをつけて いるのは何か意味があるのですか。 今のところこのような感じですが。

taho1999
質問者

補足

piroin654さんありがとうございます。 登録漏れは、登録しようとフォームに入れたデータまるまるです。 たぶん If文~ が反応してないのでは・・・と自分では疑ってました。 今回ご提示頂いたメッセージボックスをrs.Updateの前に入れたところ メッセージはでませんでした。 やはりIf文が反応してないと思い、 If IsNull(Me!品番last) Then      ↓ If Me!品番last = "" Then に変更してみたところ、メッセージはでました。 そしてデータも登録されていました。 これは文法等なにがいけなかったのか・・・・。 ご教授願えればと思います。 Val関数は、以前 Me!品番startだけにしていた時、 うまく動作しなく、数値型に指定した方が・・・という事があり 使用しています。 ※品番start & last は数字3~5桁なので。

関連するQ&A

  • 連番入力について。

    連番入力について。 環境:ACCESS2000 状況:フォーム(名称:在庫管理)    フォーム上にテキストボックス(名称:text品番頭)          テキストボックス(名称:text品番start)          テキストボックス(名称:text品番last)          テキストボックス(名称:text商品名)          テキストボックス(名称:text仕入先)          コマンドボタン(名称:command登録)    テーブル(名称:在庫マスター)    フィールド  品番    商品名   仕入先 今回やりたい事:    text品番頭にアルファベット3文字、    text品番startに数字4桁(登録したい番号の開始数字)、    text品番lastに数字4桁(登録したい番号の最後)、    text商品名に商品名、text仕入先に仕入先    を入力し、command登録でテーブルに入れる。 その際、品番はtext品番頭+text品番start~text品番lastでフィールド品番に連続登録、    商品名及び仕入先はtext商品名(text仕入先)に入力されたものを全ての品番に対応した    商品名及び仕入先フィールドに登録。 Private Sub command登録_Click() Dim db As Database Dim rs As Recordset Dim i As Long Dim s As String Set db = CurrentDb Set rs = db.OpenRecordset("在庫マスター", dbOpenDynaset) If IsNull(Me!text品番last) Then With rs rs.AddNew rs!品番 = Me!text品番頭 + text品番start rs!商品名 = Me!text商品名 rs!仕入先 = Me!text仕入先 End If If Not IsNull(text品番last) Then For i = Me!text品番start To text品番last ← ここがエラー(エラー13 型が一致しません) With rs rs.AddNew rs!品番 = Me!text品番頭 + CStr(i) rs!商品名 = Me!text商品名 rs!仕入先 = Me!text仕入先 End If rs.Update End With Next i rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub 上記動作は問題ないのですが、 何故か text品番last が空白の場合 2・3回に1度エラーがでます。 ※成功する時もある。 これを回避するにはどうしたら良いのでしょうか? 何卒ご教授の程宜しくお願い致します。

  • SQLSERVERからデータを取得する方法

    SQLSERVERに商品テーブルを作り ACCESSにローカルテーブル(下記の例では入力テーブル)を 作りました。 ACCESS VBAで ACCESSのローカルテーブルを1件ずつ読み SQLSERVERの商品テーブルを検索したいのですが 下記の例 どちらが処理スピードが速いのですか? なお下記以外にも処理スピードが速い方法が あったら教えてください。 ●例1 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) sql = "SELECT 商品名 FROM 商品テーブル " sql = sql & "where 商品ID = '" & rt![商品ID] & "'" Set rs = db.OpenRecordset(sql) If rs.RecordCount = 0 Then MsgBox "NG" Else MsgBox rs![商品名] End If ●例2 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) Set rs = db.OpenRecordset("商品テーブル", dbOpenDynaset) rs.FindFirst "商品CD = '" & rt![商品CD] & "'" If rs.NoMatch Then MsgBox "NG" Else MsgBox rs![商品名] End If よろしくお願いします。

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • 連続番号のデータ入力について。

    連続番号のデータ入力について。 環境: ACCESS2000     今回在庫管理のデータベースを作成しており、 商品の品番が1度に大量仕入してるため連続いたものになり データ入力が手間がかかるので、簡易に入力できるフォーム作成しております。 状況:フォーム(名称:在庫管理)    フォーム上にテキストボックス(名称:text品番頭)          テキストボックス(名称:text品番start)          テキストボックス(名称:text品番last)          テキストボックス(名称:text商品名)          テキストボックス(名称:text仕入先)          コマンドボタン(名称:command登録)    テーブル(名称:在庫マスター)    フィールド  品番    商品名   仕入先 今回やりたい事:    text品番頭にアルファベット3文字、    text品番startに数字4桁(登録したい番号の開始数字)、    text品番lastに数字4桁(登録したい番号の最後)、    text商品名に商品名、text仕入先に仕入先    を入力し、command登録でテーブルに入れる。    その際、品番はtext品番頭+text品番start~text品番lastでフィールド品番に連続登録、    商品名及び仕入先はtext商品名(text仕入先)に入力されたものを全ての品番に対応した    商品名及び仕入先フィールドに登録。   ex: text品番頭  AAA       text品番start  1111      text品番last  5555      text商品名  いちご      text仕入先  八百屋     と入力した場合、テーブルに     品番      商品名    仕入先    AAA1111     いちご    八百屋    AAA1112     いちご    八百屋    AAA1113     いちご    八百屋    AAA1114     いちご    八百屋      ・      ・      ・      ・      ・      ・    AAA5555     いちご    八百屋    つたない説明でわかりにくいとは思いますが、 ネット等で調べていても連続した数字入力は クエリばかりでてくるため、どのようにコードを組み上げて いいのかわかっておりません。 自分のできる範囲は、フォーム利用によるデータ入力は作成できる程度です。 何卒ご教授の程宜しくお願い致します。

  • Access フォームから複数テーブルの入力は?

    フィールドが300ぐらいあるので項目ごとにテーブルで分けています。 1つにまとめるクエリを作成して、そのクエリを元にフォームを作成しました。 テーブルはフィールド名:品番で1対1のリレーションを組んでいます。 テーブル:商品カラー  ・フィールド:品番  ・フィールド:カラー テーブル:商品サイズ  フィールド:品番  フィールド:サイズ クエリのフィールド  フィールド名:品番 (商品カラーのフィールド:品番を指定)  フィールド名:カラー (商品カラーのフィールド:カラーを指定)  フィールド名:サイズ (商品サイズのフィールド:サイズを指定) この場合、品番をフォームから入力すると商品カラーの品番のみ入力されます。 商品カラーと商品サイズの品番を同時にファームから入力は出来ないでしょうか? 現在は10テーブルありますが1つのテーブルにまとめたほうがいのでしょうか?

  • ACCESS どこがおかしいのか?

    ACCESSで。クエリからフォームを作成し、検索フォームを作成しようとしています。 AND条件とOR条件を作り検索(抽出)を行いたいのですが、何が間違っているのか、 検索をかけるとすべて「登録がありません」になってしまいます。 どこが間違っているのか、もしくは代替案を教えていただけますでしょうか。 以下は記述した、VBAコードです。 Private Sub 検索ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim stFil As String Set db = CurrentDb() Set rs = db.OpenRecordset("Q_Autoweb", dbOpenDynaset) 'オプションボタンで条件を選択 If 検索条件 = 1 Then rs.Filter = "[タイトル]='" & タイトル検索 & "' and [本文]='" & テキスト15 & "'" Else rs.Filter = "[タイトル]='" & タイトル検索 & "' or [本文]='" & テキスト15 & "'" End If Set rs = rs.OpenRecordset Set Me.Recordset = rs If rs.EOF = True Then MsgBox "登録がありません" Else Me.ID = rs!ID Me.案件名 = rs!案件名 Me.タイトル = rs!タイトル Me.本文 = rs!本文 End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub よろしくお願いします。

  • 1つのフォームから複数のテーブルにレコード追加をやってみました。

    1つのフォームから複数のテーブルにレコード追加をやってみました。 そこで疑問があるのですが、Connectionは1つでRecordsetは追加するテーブルの数だけOpenが必要なのですか? 一応下記のコードで2つのテーブルにレコードを追加出来たのですが、素人の推測でやってみたので間違っている所がないか見て頂きたいです。 返答よろしくお願いします。 Dim cn As ADODB.Connection Dim rs1 As New ADODB.Recordset Dim rs2 As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs1 = New ADODB.Recordset Set rs2 = New ADODB.Recordset Beep If MsgBox(Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しますか?", 33, "確認! 登録") = vbOK Then rs1.Open "T車検証", cn, adOpenKeyset, adLockPessimistic rs2.Open "T所有者", cn, adOpenKeyset, adLockPessimistic rs1.AddNew rs1!車両コード = Me.txt車両コード rs1!登録番号 = Me.txt登録番号 rs1!交付年月日 = Me.txt交付年月日 rs1!初度年月 = Me.txt初度年月 rs1.Update rs2.AddNew rs2!車両コード = Me.txt車両コード rs2!所有者 = Me.txt所有者 rs2.Update rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn.Close: Set cn = Nothing MsgBox Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しました。", 64, "確認! 登録" End If End Sub

  • テーブルのデータをフォームに表示したい。

    テーブルのデータをフォームに表示したい。 Access2003で顧客管理のシステムを作成しています、 下記コードで検索フォームより顧客フォームを開き顧客テーブルのデータを渡していますが、 現在では顧客データを渡したいフォームが増えた為、各フォームにtxt顧客コードを設けて 標準モジュールで行った方が良いかと思うのですが、どの様にしたら良いか解りません。 良い方法がありましたらご教授よろしくお願いいたします。 Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T顧客", cn, adOpenKeyset, adLockOptimistic rs.Find "顧客コード=" & Forms!F顧客検索!S顧客.Form.顧客コード Forms!F顧客!txt顧客コード = rs!顧客コード Forms!F顧客!cmb顧客区分 = rs!顧客区分 Forms!F顧客!txt顧客名 = rs!顧客名 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing

  • Access レコードを分割してフォームで表示

    Access 2007です。 下記のような日記テーブルがあり、 その「行動」フィールドの中身を「●」の記号で レコードに分割して、 フォームに表示したいと思っています。 日記テーブル ID 年月日   天気  行動 1 2014/1/10  晴  ●読書。●新聞を読む。●散歩。 2 2014/1/11  曇  ●電車に乗る。●新年会。●庭の手入れ。●カラオケ。 3 2014/1/12  曇  ●昼寝。 4 2014/1/13  雨  ●買い物。●読書。 ・・・・ 結果フォーム(データシートビュー)で表示 年月日    行動 2014/1/10  読書。 2014/1/10  新聞を読む。 2014/1/10  散歩。 2014/1/11  電車に乗る。 2014/1/11  新年会。 2014/1/11  庭の手入れ。 2014/1/11  カラオケ。 2014/1/12  昼寝。 2014/1/13  買い物。 2014/1/13  読書。 もとの日記テーブルのデータは変更しません。 下記のように、VBAのコードの中で、 レコードセットを使えば、上記のようなレコードの分割ができると思うのですが、 うまくいきません。 rs2というレコードセットをどうやって作成すればいいのかわかりません。 (Set rs2 = DB.OpenRecordset ・・・ のような行が必要ではないか、と思うのですが、 そのやり方がわかりません。) やり方を教えていただけたら幸いです。 Dim DB As DAO.Database Set DB = CurrentDb() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = DB.OpenRecordset("日記テーブル", dbOpenForwardOnly) Dim A As Variant Do Until rs1.EOF A = Split(rs1!行動, "●") For i = 1 to UBound(A) rs2.AddNew rs2!年月日 = rs1!年月日 rs2!行動 = rs1!A(i) rs2.Update Next i rs1.MoveNext Loop DoCmd.OpenForm "結果フォーム" Set Forms!結果フォーム.Recordset = rs2

  • VBAでフォーム登録する場合の未入力のエラー

    病院を登録するフォームをつくっています。 名前を入れて登録。その後、入力画面がnullになる。 というのはできたのですが、未入力の場合 (登録した後、クリックしたときに) フィールドに必要なプロパティが True に設定されているため~~ と出てしまいます。 そのエラーメッセージを「"入力してください"」 のメッセージBOXに変えたくて上記のようにしたのですが、 変わりません。どこがおかしいのでしょうか。 どなたか、分かる方ご指導くださいませ。 Private Sub コマンド0_Click() Dim db As Database, rst As Recordset Set db = CurrentDb Set rst = db.OpenRecordset("T_病院", dbOpenTable, dbAppendOnly) With rst .AddNew ![病院名] = Me.病院名 If Me![病院名] = Null Then MsgBox "入力してください" GoTo minyuuryoku End If .Update minyuuryoku: End With Me.病院名 = Null With db End With rst.Close db.Close Set db = Nothing End Sub

専門家に質問してみよう