Access2007のフォーム入力について

このQ&Aのポイント
  • Access2007のフォーム入力についての質問です。テキストボックスに名前を入力し、ボタンを押すと、レコードに名前が追加されるようにする方法を教えてください。
  • Access2007でフォーム入力を行う場合、名前を入力するテキストボックスと追加ボタンを作成し、名前が入力されたらレコードに追加するコマンドを作成します。
  • Access2007でフォーム入力を行う際に、名前を入力するテキストボックスと追加ボタンを作成し、テキストボックスに入力された名前をレコードに追加する方法をご教示ください。
回答を見る
  • ベストアンサー

Access2007の、フォーム入力について

下記のようなコマンドを、ボタンに追加しました。 名前の欄に入力して、ボタンを押すと、レコードの名前フィールドに入力されます。 Private Sub コマンド10_Click() If Nz(Me.名前1, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前1 & "'" End If If Nz(Me.名前2, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前2 & "'" End If If Nz(Me.名前3, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前3 & "'" End If If Nz(Me.名前4, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前4 & "'" End If If Nz(Me.名前5, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前5 & "'" End If DoCmd.Close acForm, "フォーム1" End Sub テキストボックスには、それぞれ名前1~5、という名前がつけられています。レコードが追加されるテーブルは「氏名」です。 そこで、さらにテーブルに部署フィールドを追加して、フォームに上から、部署1~5のテキストボックスを追加し、 名前と部署のテキストボックスの、それぞれ対応しているものが、同じレコードに追加されるようにするには どうすればよいでしょうか? 有識者の皆さま、どうぞよろしくお願いいたします。

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

  • ベストアンサー
回答No.4

追加クエリを使う場合、 Private Sub コマンド10_Click()   Dim i As Long   For i = 1 to 5     If Nz(Me("名前" & i))<>"" Then       CurrentDb.Execute "INSERT INTO 氏名 (名前, 部署) " & _       "VALUES ('" & Me("名前" & i) & "','" & Me("部署" & i) & "')"     End If   Next DoCmd.Close acForm, "フォーム1" End Sub DAOを使う場合、 Private Sub コマンド10_Click()   Dim ra As DAO.Reocrdset   Dim i As Long   Set rs = CurrentDb.OpenRecordset("氏名", , dbAppendOnly)   For i = 1 to 5     If Nz(Me("名前" & i))<>"" Then       rs.AddNew       rs!名前 = Me("名前" & i)       rs!名前 = Me("所属" & i)       rs.update     End If   Next   rs.Close: Set rs = Nothing   DoCmd.Close acForm, "フォーム1" End Sub でどうでしょうか。 重複チェック処理はしてませんので、必用に応じて追加してください。

その他の回答 (3)

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

No2の説明をもう少し。 質問の内容に沿ったNo1では名前を探しましたが、 この方法では、もし同姓同名の 人物が登録されていたら、その人物の 部署を変更することになります。 No2の場合は、No1とは違い、 名前1と部署1、 名前2と部署2 ・ ・ 名前5と部署5 をそれぞれ一つのレコードとして テーブルに追加します。 したがって、万が一にも他の部署に 同姓同名の人物がある場合にも 対応できます。 あるいは、同姓同名の人物が同じ 部署にいる場合も登録します。 もちろん、このような新規追加の場合 同一人物を間違って他の部署にも登録 するということが起こりかねないこと は十分注意をすることが必要です。 そのためにも、個人を特定する電話番号 などをテーブルに追加する前に確認すること も必要かと思いますが。

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

No1です。 もう一つの方法。 DAOを使っているので、コード表のツールから 参照設定を選択して、 Microsoft DAO xx Object Library にチェックを入れて、OKとします。xxは3.6のような数字です。 このとき、 Microsoft ActiveX Data Objects xx Library にチェックが入っていたらはずしてください。 Private Sub コマンド10_Click() Dim db As Database Dim rs As Recordset Dim ctl1 As Control Dim ctl2 As Control Dim i As Long Dim strName As String Dim strSection As String Set db = CurrentDb Set rs = db.OpenRecordset("氏名", dbOpenDynaset) For i = 1 To 5 '各名前のテキストボックスのデータの取り出し For Each ctl1 In Me.Controls If TypeOf ctl1 Is TextBox Then If ctl1.Name = "名前" & i Then 'If ctl1.Value <> "" Then strName = Nz(ctl1.Value) 'End If End If End If Next ctl1 '各部署のテキストボックスのデータの取り出し For Each ctl2 In Me.Controls If TypeOf ctl2 Is TextBox Then If ctl2.Name = "部署" & i Then 'If ctl2.Value <> "" Then strSection = Nz(ctl2.Value) 'End If End If End If Next ctl2 'テーブルへ追加 If strName <> "" Then If strSection <> "" Then rs.AddNew rs!名前 = strName rs!部署 = strSection rs.Update End If End If '変数の初期化 strName = "" strSection = "" Next i rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub コードの中でコメントアウトしているところが あります。この部分はテーブルへの追加の ところでデータが無い場合のフィルターをかけて いるのでコメントアウトしています。 For i = 1 To 5 で、名前1~名前5、部署1~部署5 のデータを検索します。

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

必ず名前が重複しない、 かつ、名前と部署が両方入力されている、 ということならば、 Private Sub コマンド10_Click() If Nz(Me.名前1, "") <> "" Then If Nz(Me.部署1, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前1 & "'" CurrentDb.Execute "UPDATE 氏名 SET 部署 = '" & Me.部署1 & "' WHERE 名前 = '" & Me.名前1 & "'" End If End If If Nz(Me.名前2, "") <> "" Then If Nz(Me.部署2, "") <> "" Then CurrentDb.Execute "INSERT INTO 氏名 (名前) SELECT '" & Me.名前2 & "'" CurrentDb.Execute "UPDATE 氏名 SET 部署 = '" & Me.部署2 & "' WHERE 名前 = '" & Me.名前2 & "'" End If End If '以下省略 End Sub どちらかが未入力ならば、という場合もありますが。 その場合、データベースとして成り立つかどうか 質問内容からはわからないので、省略します。

ein-zwei
質問者

お礼

試してみます、貴重なご回答をありがとうございます!

関連するQ&A

  • フォーム上のフィルタで抽出されたデータをテーブルに格納したい

    フォーム上のフィルタで抽出されたデータをテーブルに格納したい 度々お世話になります。 フォーム上で3つのキーワードを使って抽出したデータを テーブルに格納したいと思っています。 以下のコードを書いたところ、矢印の部分でエラーが起こります。 お知恵を拝借できませんでしょうか? よろしくお願いいたします。 Private Sub cmd04_Click() Dim db As DAO.Database Set db = CurrentDb() Dim mySQL As String mySQL = "INSERT INTO 04_パソコン機器管理台帳 select * FROM T05_使用者一覧抽出結果 WHERE " & Me.Filter & ";" If MsgBox("該当レコードを追加します。", vbYesNo) = vbYes Then ' SQLを実行します。 db.Execute mySQL   ←エラーが発生します。 MsgBox "該当レコードを追加しました。" End If End Sub

  • ACCESS 処理の件数を取得したい

    どうやっていいのか困っています。 DAOで処理をしています。 下記のような処理があり、それぞれの更新、検索、追加の件数を とりたいのですがどなたか教えていただけないでしょうか? もしくはサンプル、どこかいいサイトはありませんか? よろしくおねがいします。 UPDATEの場合 CurrentDb.Execute "UPDATE T_A SET WHERE Flag = '0'", dbFailOnError SELECTの場合 strSQL = "SELECT * FROM T_N " CurrentDb.Execute strSQL, dbFailOnError INSERTの場合 strSQL = "INSERT INTO FROM T_Y " CurrentDb.Execute strSQL, dbFailOnError

  • アクセス検索用フォームでの完全一致検索

    いつも大変お世話になっております。ACCESS初心者ですが,宜しくお願いします。 テーブルAを元にクエリAを作成し,クエリAをレコードソースとしてフォームAを作成しています。フォームAのレコードを検索するのに検索用フォームBを作成しました。検索用フォームBは,フォームAと全く同じデザインで,レコードソースのみ空にしてあります。項目は,氏名,住所,金額,契約締結日,業種分類等20個ほどあり,それぞれ検索するために20個分の非連結のテキストボックスを配置しています。また,検索条件を表示させるためのコマンドボタンを一つ配置しています。コマンドボタンには,以下のVBAを記述しています。 Private Sub 検索実行_Click() On Error GoTo エラー処理 Dim StrWhr As String 'Where条件式 Dim StrMsg As String '表示メッセージ Dim StrSrc As String 'レコードソース Dim stDocName As String '表示用フォームの名前 If Nz(Me!氏名, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "氏名 Like '*" & Me!氏名 & "*'" End If If Nz(Me!住所, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "所在地 Like '*" & Me!所在地 & "*'" End If    If Nz(Me!金額, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "金額 = " & Me!金額   End If If Nz(Me!契約締結日, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "契約締結日 Like '*" & Me!契約締結日 & "*'" End If If Nz(Me!業種分類, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "業種分類 = " & Me!業種分類 End If If StrWhr = "" Then StrSrc = "Select * From [qry_○○] Order By ○○;" Else StrSrc = "Select * From [qry_○○] Where " & StrWhr & " Order By ○○;" End If If MsgBox(StrMsg, vbOKCancel, "確認") = vbOK Then DoCmd.OpenForm "frm_○○", , , StrWhr Forms("frm_○○").RecordSource = StrSrc End If 終了処理: Exit Sub エラー処理: MsgBox Err & Error$, , Me.Name & " 検索実行" Resume 終了処理 End Sub このうち,氏名,住所,金額に関しては,問題なく検索できますが,契約締結日及び業種分類について検索することができません。 (1)契約締結日に関しては,契約締結日その日のみではなく,指定した契約締結日以前のレコード全てや,期間を指定してレコードを抽出したいのですが,可能でしょうか。 例えば,契約締結日のテキストボックスに >2008.8.1と入力した場合に,2008.8.1以前に契約を締結した全部のレコードを抽出したり, 2008と入力した場合に,2008(年)に契約締結した全レコードを抽出できることが希望です。 (2)業種分類については,コンボボックスからデータを選択して検索するようになっていますが,検索実行をクリックすると,パラメーターの入力画面が表示され,適当な値を入力しても正しい抽出結果が表示されません。 おそらく,以前に教えていただいた StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "○○ = " & Me!○○ の構文が数値型の完全一致検索の構文のためだと思われます。テキスト型の完全一致検索の構文を教えて下さい。 拙い質問で恐縮ですが,補足等いたしますので,宜しくお願いいたします。

  • アクセスのフォームで数値型の複数検索のについて

    アクセスのフォームで検索ボタンを設置して複数検索をしています。 下記の状態でうまくいってたのですが、依頼でまた一つ検索項目が追加になりました。 追加になった項目は数値型で”を抜いたりしたのですがうまく検索できません。 どうすればうまくいくか教えて下さい。 今のコードは以下の通りです。 Private Sub 検索ボタン_Click() Dim L1 As String If Nz(Me.品名検索, "") <> "" Then L1 = L1 & " AND 品名 Like '*" & Me.品名検索 & "*'" End If If Nz(Me.採取日検索, "") <> "" Then L1 = L1 & " AND 採取日 = #" & Me.採取日検索 & "#" If Nz(Me.数値検索, "") <> "" Then L1 = L1 & " AND 数値 = " & Me.数値検索 End If End If If L1 <> "" Then L1 = Mid(L1, 6) Me.Filter = L1 Me.FilterOn = True Else Me.Filter = L1 Me.FilterOn = False End If End Sub 数値の部分が数値型の新たな検索です。 宜しくお願い致します。

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • アクセスのフォームからレコード入力空欄回避のVBA

    アクセス初心者です。 帳票式フォームからテーブルへのレコード入力において、次のレコード入力ボタンで空欄を防止するためのVBAを作っていますが、うまく行きません。空欄があれば警告は出ますがそのままテーブルへ記録されてしまいます。 テーブルに記録されずに空欄が入力できるようにするにはどうすればよいのでしょうか? また、次を入力するときにフォームの製品名の内容だけ消えずに残したいのですが、そのプログラムについても教えていただきたいです。 なかなかうまく行かずに大変困っています。 どなたかVBAの達人の方、初心者にわかりやすくお教え下さい。 「入力内容を登録して次を入力」ボタンで作ったVBAは次の通りです。 つぎはぎなので、不要なプログラムもあるかもしれません。 Private Sub コマンド9次のレコードに_Click() On Error GoTo Err_コマンド9次のレコードに_Click DoCmd.GoToRecord , , acNext Exit_コマンド9次のレコードに_Click: Exit Sub Dim Rst As DAO.Recordset Set Rst = CurrentDb.OpenRecordset("T_指定材料表", dbOpenTable) With Rst .AddNew .Fields("製品名") = Me!製品名 .Fields("回路記号") = Me!回路記号 .Fields("部品名") = Me!部品名 .Fields("員数") = Me!員数 .Update If IsNull(Me!製品名) Then MsgBox ("製品名が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If If IsNull(Me!回路記号) Then MsgBox ("回路記号が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If If IsNull(Me!部品名) Then MsgBox ("部品名が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If If IsNull(Me!員数) Then MsgBox ("員数が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If End With On Error Resume Next DoCmd.GoToRecord DataForm, "T_指定材料表", acNew Rst.Close Set Rst = Nothing Call ClearControls End Sub

  • Accessの検索フォーム(CLng)で。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 (項目1-5は数値データなのであいまい検索はしたくありません。) 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If If Me!項目1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 = " & CLng(Me!項目1.Value) & ")" condKoumoku2 = "(T_マスタ.項目2 = " & CLng(Me!項目1.Value) & ")" condKoumoku3 = "(T_マスタ.項目3 = " & CLng(Me!項目1.Value) & ")" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempCond = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '((OR OR))' の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? Access2000です。

  • 以下のアクセスの検索フォームで。。。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If '項目 If Me!Koumoku1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 like '*" & Me!Koumoku1.Value & "*')" condKoumoku2 = "(T_マスタ.項目2 like '*" & Me!Koumoku1.Value & "*')" condSKoumoku3 = "(T_マスタ.項目3 like '*" & Me!Koumoku1.Value & "*')" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempComd = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '(OR((T_マスタ.項目1 like …')の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? (項目を含まない状態ではうまく検索できてました。) Access2000です。

  • 動的に生成したカラムを使ったFUNCTION

    レコード型の使用方法がわからないので、悪戦苦闘しております。。。 【やりたいこと】 ・あるテーブルのある項目でGROUP BYし、別の項目事に集計した結果を  カラムとして出力 クロス集計と呼ぶのでしょうか? 上記の結果表を取得出来るFUNCTIONを作成したいのです。 【サンプルデータ】 CREATE TABLE t1 ( col1 integer ,col2 integer ,val integer ); INSERT INTO t1 VALUES( 1, 1, 1, ); INSERT INTO t1 VALUES( 1, 1, 1, ); INSERT INTO t1 VALUES( 2, 1, 1, ); INSERT INTO t1 VALUES( 2, 1, 1, ); INSERT INTO t1 VALUES( 3, 2, 1, ); INSERT INTO t1 VALUES( 3, 2, 1, ); INSERT INTO t1 VALUES( 4, 2, 1, ); INSERT INTO t1 VALUES( 4, 2, 1, ); ※ここでcol1、col2ともどんなデータが入っているか、わからないとします。 なので、まずcol2をDISTINCTしたものを求めました。 SELECT DISTINCT col2 FROM t1; この結果をカーソルを使ってループし、動的にカラムを作成するSQLを 作りました。 DECLARE cu refcursor; rec record; str text := 'SELECT col1 '; str2 text := ' FROM t1 GROUP BY col1 ORDER BY col1'; BEGIN OPEN cu FOR EXECUTE SELECT DISTINCT col2 FROM t1; LOOP FETCH cu INTO rec; IF NOT FOUND THEN EXIT; END IF; str := str || ', SUM( CASE WHEN col2 = rec.col2 THEN val END ) AS col_name' || rec.col2; END LOOP; CLOSE cu; RAISE INFO 'key = %', str || str2;  動的に生成されたSQLを実行したい ------------------------------------------------------- ※ちなみに動的に生成されたSQLはこんな感じになります。 SELECT col1 ,SUM( CASE WHEN col2 = 1 THEN val END ) AS col_name1 ,SUM( CASE WHEN col2 = 2 THEN val END ) AS col_name2 FROM t1 GROUP BY col1 ORDER BY col1; ------------------------------------------------------- あとがわかりません。。動的なカラムなので、どうやって取得すれば 良いのでしょうか? レコード型を使うと上手くいくのでしょうか? 試しにFUNCTION( func1 )の戻り値をRETURNS SETOF record として 内部で rec1 record; : :  FOR rec1 IN EXECUTE str || str2 LOOP RETURN NEXT rec1; END LOOP; RETURN; SELECT * FROM func1(); とやってみたら、 ERROR: a column definition list is required for functions returning "record" となります。。。 カラムの定義が必要だと言われているんだと思いますが、カラムは 動的になっているので、どうすれば良いのでしょうか??

  • フォームから削除をしたいです

    ACCESSで、VBAを使用し、レコードを削除しようとしています。 自分の書いたコードは以下の通りです。 --------------------------------------------------------------- Private Sub cmd削除_Click() If vbYes = MsgBox("現在表示中のレコードを削除してもよろしいですか?", _ vbYesNo + vbInformation + vbDefaultButton2) Then Set DB = CurrentDb  Set RS = DB.OpenRecordset("SELECT * FROM メール _ WHERE ID=ID") RS.Delete          Me.コード.SetFocus Call 画面クリア ボタン使用不可 Set RS = Nothing Set DB = Nothing End If End Sub -------------------------------------------------------------- コレを実行すると、開いたフォームのIDのレコードではなく、上から順番に消えてしまいます。どこが間違っているのでしょうか。 恐れ入りますが、ご教授願えますでしょうか。