ACCESSのフォームでのデータ入力とコードの自動化について

このQ&Aのポイント
  • ACCESSのフォームを使用して個人データの管理を行っています。フォームを開く際に入力者の氏名を一度だけ入力し、その氏名が反映される仕組みになっています。同様に、商品コードもフォームでの入力を可能にしてコードの種別タイトルを自動で出力する仕組みを構築したいです。
  • 私たちはACCESSのフォームを使って名簿入力を行っています。入力者の氏名を一度だけ入力するだけで、その氏名がフォームを閉じるまで反映されるようにしています。同様の仕組みを使って、商品コードもフォームで入力し、自動的にコードの種別タイトルを出力する方法はありませんか?
  • ACCESSのフォームを使用して個人データの管理をしています。入力者の氏名を一度だけ入力すると、その氏名がフォームを閉じるまで反映される仕組みです。同様に、商品コードもフォームでの入力を可能にして、コードの種別タイトルを自動で出力する方法を知りたいです。
回答を見る
  • ベストアンサー

ACCESSのフォーム

はじめまして。 個人データの管理でACCESSで名簿入力をしています。 入力のフォームを開く際に、 Private Sub Form_Open(Cancel As Integer) Dim Textname As TextBox Dim strmsg As String Dim varname As Variant Set Textname = Me.入力者表示 strmsg = "入力者氏名を入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname End Sub として、入力者の氏名を入力しています。 詳細は作成者でないので分かりかねますが、 フォームで非連結のテキストボックスを作成して、 なにかしら表示ができるようになっているみたいです。 これはフォームを開く際に出てきた小さい窓に一度だけ入力者氏名を 入力したら、そのままフォームを閉じるまでその氏名が反映されます。 現在、入力するものにコードというものがあるのですが、これも同じようにできないかと思っています。一日のデータ入力作業では 基本同じコードを使用し、一回一回コードを入力していました。 やはり人間の手によるものですから間違いがあり、 違うコードを入力してしまうと行方不明になってしまうのです。 コードも上記の入力者氏名と同じように、 フォームを開く際に出てくる小窓での入力は可能でしょうか? ちなみに現在商品コードを入力したら、コードの種別タイトルという ものが自動で出力される仕組みになっています。 それも反映されないといけないのです。 なにかお知恵を拝借させていただければと思います。 足りない情報があればご指摘ください。 宜しくお願いいたします。

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

  • ベストアンサー
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.2

実際にどの様に、作ってあるのか?ですので 当てはまるかどうか疑問ですが 簡単なサンプルを書きます。 該当フォームのモジュールです。 Option Compare Database Option Explicit Dim stok_cd As Integer '最終書き出しデータのCDをキープするエリア Private Sub Form_AfterUpdate() 'データが登録されたとき、CDが有効であれば フォーム上のCDから 'stok_cdに値を退避する If Not IsNull(Me!CD.Value) Then stok_cd = Me!CD.Value End If End Sub Private Sub Form_BeforeInsert(Cancel As Integer) '新規データ入力状態になった時、Stok_cdに退避した値があれば、 'フォームのCDにセットする If stok_cd <> 0 Then Me!CD.Value = stok_cd End If End Sub Private Sub Form_Open(Cancel As Integer) 'フォームオープン時、退避エリアをクリアしておく stok_cd = 0 End Sub ・メモリ上に、stok_cdを用意します。 ・フォームオープン時、0でクリアしておきます。 ・データが挿入状態になったとき、stok_cdが有効であれば  フォームのCD(実際にはコンボボックスでしょうか)にstok_cdをセ ットします。  (都度入力しなくても、自動でセットされる要件を満たします) ・データ登録時、CDが有効であれば stok_cdに退避させる。 例えば最初 CDに10を入力すれば 以降ずっと新規入力時10がCDに入ります。 途中CDの10を20に訂正しそのデータを登録したら、以降は CDには20がセットされるようになります。

Armadillo5
質問者

お礼

親切に対応頂いて本当に恐縮なのですが、 Dim stok_cd As Integer '最終書き出しデータのCDをキープするエリア とかはどこに入れればいいのでしょうか? stok_cdとは、格納するテキストボックスを一つ作るんですよね? フォームの更新後処理とか、挿入前処理だとかで選んでVB入れてたのですが、また違うのでしょうか? 初心者過ぎて申し訳ありません。。。

その他の回答 (2)

  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.3

>Dim stok_cd As Integer '最終書き出しデータのCDをキープするエリア >とかはどこに入れればいいのでしょうか? >stok_cdとは、格納するテキストボックスを一つ作るんですよね? いいえ、そうではありません。 格納するテキストボックスをフォームに置くことも可能ですが 別に、フォームのテキストボックスとして存在している必要はないので このような形にしています。 これは、各イベントのモジュールの外側に書きます。 先の回答を 今一度見てください。 フォームのOPENや、その他のイベントの中ではなく 一番上に定義していますよね。 同じように、VBAで書いてください。 各イベント内で、定義した変数は そのイベント内でしか存在しません 他からは、参照もできないと言うことです。 しかし stok_cdのように モジュールのトップ(イベントの外側)に書いた変数は、そのフォーム内のどこからでも参照可能なのです。 ですから、OPEN時の クリア、書き出し時の退避、インサート時の初期値設定がstok_cdを使って可能になります。 今回のサンプルでは、フォーム上にテキストボックス等追加するものはありません。 ただ、Me!CDと書いていますが 実際のフォームのコードの名称とはたぶん違うでしょうから、実際の名称に置き換えてください。

Armadillo5
質問者

お礼

そういうことでしたか^^; 理解できました。 手間かけてすみません。。 基礎もなくいきなり会社でやらされたもので T_T また結果報告させてもらいます。

  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.1

回答が無い様なので、ちょっと書き込みます。 文面からの予想ですので、参考までに。 >これはフォームを開く際に出てきた小さい窓に一度だけ入力者氏名を >入力したら、そのままフォームを閉じるまでその氏名が反映されます。 これは、登録するデータに 入力者氏名を格納しているのでしょうね その為、最初に設定しているのでしょう。 この仮定通りであれば、新しいレコードの入力状態になった時 または 書き出す直前で、該当項目に入力者氏名をセットしているものと考えられます。 >コードも上記の入力者氏名と同じように、 >フォームを開く際に出てくる小窓での入力は可能でしょうか? >ちなみに現在商品コードを入力したら、コードの種別タイトルという >ものが自動で出力される仕組みになっています。 >それも反映されないといけないのです。 最初に書かれている、コードと途中で出てくる商品コードは同じものを 指しているのでしょうか? 取りあえず、同じものとします。 質問の可能かどうかについては、コードも入力者氏名のように 入力させ、その値をフォーム上に(不可視で)保持しておき 新規データの入力時、フォーム上の現在存在する商品コードに 保持しておいたコードをセットすれば、入力したのと同じように 以降の処理は流れるでしょうから、「種別タイトル」等も同様に 動作すると思います。 (実際に、フォームを見ているわけではなく、文面からの想像ですので 全く、勘違いの可能性もあります。) >一日のデータ入力作業では基本同じコードを使用し 異なることもあり得るのであれば、最初に入力ではなく データの登録時に コードをフォーム上でも メモリ上でもどこでもよいですが、その値を保持しておき 新しいデータの入力状態になった時、保持しているコードがあれば その値を、セットするようにすれば利便性が増すかもしれないですね。 (直前に登録した内容が、出てくる扱い) >詳細は作成者でないので分かりかねますが 何れにしても、元々作成された人であれば コードの扱いを 組み込む事は、そう手間ではないでしょうから ご相談されてはと思います。

Armadillo5
質問者

お礼

返答ありがとうございます! まさにご推測の通りです。 すみません、説明不足で。。 >異なることもあり得るのであれば、最初に入力ではなく データの登録時に コードをフォーム上でも メモリ上でもどこでもよいですが、その値を保持しておき 新しいデータの入力状態になった時、保持しているコードがあれば その値を、セットするようにすれば利便性が増すかもしれないですね。 この部分もう少しご説明いただけると助かります。 お時間がある時で結構ですので、お願いいたします。

関連するQ&A

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

  • 入力の簡略化

    前回の質問させていただいたものですが、今だに完成できて いないので、もう一度書き込みさせていただきます。 kurodai2様にご丁寧に返答いただいたのですが、 いかんせん小さい脳みそで。。質問も閉じてしまいましたので今一度。 ツアーNo.、ツアータイトル、ツアー情報、入力者氏名 があります。 現在、フォームを開く際に小さなフォームが出てきて、 「入力者の氏名」を入力します。格納する不可視の テキストBOX「非入力者」があり、「入力者氏名」は そこを見に行き、新しいレコードを開くたびに自動で氏名が 反映されます。のはずです。説明難しいですが。。 フォームで「ツアーNo.」を入力し、更新したら、「ツアータイトル」 と「ツアー情報」が自動で出てきます。これは前もって ツアー情報テーブルで登録しています。 そこで、毎回同じ「ツアーNo.」、「ツアータイトル」、「ツアー情報」 の場合、入力の際ミスが出ますので、入力者氏名と同じ方法で 格納して反映しようと思っています。 まぁkurodai2様の教えなんですけど^^; メモリーに格納ってのは難しかったのでこちらの方法でいこうと 思います。 自分なりにいじってみたんですけど、 Dim Textname As TextBox Dim strmsg As String Dim varname As Variant Set Textname = Me.入力者表示 strmsg = "入力者氏名を入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname Set Textname = Me.ツアーNo strmsg = "ツアーNoを入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname では、ツアーNo.に値は入れれませんとエラーがでます。 非連結のテキストボックス「非ツアーNo.」を作り、それを指定したら 入りました。 非連結のテキストボックス「非ツアーNo.」にツアーNo.を入れ、 保存ボタン押したら「非ツアーNo.」から「ツアーNo.」へ値を 反映させるようにしたのですが、ボタンを押した時点では反映 されているのに、レコードが切り替わったらブランクに なってしまいます。たぶんそういう設定にしているのでしょうけど、 どこをいじっていいのか。。 しかもツアーNo.へ値を反映させても値のみが反映され、 「ツアータイトル」と「ツアー情報」が空白のままになって しまいます。 もうなにがなんだか。。 知識と文章力のなさで、暗号を解くみたいになりましたが、、、。 ご理解いただける方、宜しくお願いいたします。

  • ACCESSのフォーム

    ACCESSのフォームでデータを入力しています。 既に入力したデータを誤って上書きしないように、更新前処理で下記のコードを入れました。 Private Sub 単価_BeforeUpdate(Cancel As Integer) If MsgBox("変更を保存しますか?", vbYesNo) = vbNo Then Me.Undo End If End Sub 入力済のデータを上書きする時はこの方法で良いのですが、新規に入力する時にも同じように確認メッセージが出てしまいます。 新規入力の時には確認メッセージを出さない方法があったら教えて下さい。 よろしくお願いします。

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

  • フォームを作成すると同時にイベントを作成する方法は

    フォームを作成すると同時にイベントを作成する方法は? アクセスなのですが 標準モジュールで Sub フォームを作成() Dim myForm As Form Set myForm = CreateForm DoCmd.Close acForm, myForm.Name, acSaveYes End Sub をしたと同時に、 そのフォーム内に Private Sub Form_Open(Cancel As Integer) MsgBox "開きました" End Sub のようなイベントを同時に生成するにはどうすればいいでしょうか? クラスモジュールを使うのですか? クラスモジュールの使い方がまったくわからないのですが サンプルコードを頂けないですか?

  • アクセスvba if文の記述方法

    検索フォームを作成しました。 入力項目は「氏名」「カナ」で入力チェックをおこなっております。 (未入力)メッセージを表示「未入力です」 (入力有)結果一覧のフォームを表示 未入力チェックは正常に処理されておりメッセージが表示されます。 項目に値を入力した場合フォームが起動しません。 if文から外した場合は正常に実行されます。 この条件の場合if文でどのように記述したらよいのでしょうか。 宜しくお願いします。 Private Sub 検索_Click() Dim mct As Control Dim flg As Boolean flg = False For Each mct In Me.Controls  If mct.ControlType = acTextBox Then   If mct.Tag = "Check" Then    If Not IsNull(mct) Then     flg = True     Exit Sub    End If   End If  End If Next mct If flg = True Then  Dim str As String  str = "[氏名] Like ""*" & Me!氏名 & "*"" And [カナ] Like ""*" & Me!カナ & "*"""  DoCmd.OpenForm "結果一覧", , , str Else  MsgBox ("未入力です") 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

  • アクセスのフォームで

    アクセスのフォームで、品番一覧というテーブルを基にした、F品番一覧というフォームがあります。 ヘッダー部に検索するコンボボックスがあり、品番一覧テーブルの品番を参照しています。 検索ボタンを押すと、コンボボックスの内容に当てはまるものが、フォームの詳細部に一覧として表示させる様にしたのですが、品番に"50#1"や"50#2"という#を使い、1と2を分けている物があるのですが、コンボボックスで、この#が付いた物で検索すると検索結果がなにも表示されません。#が付いていない物はちゃんと一覧が表示されます。 #が付いている場合でもちゃんと表示するにはどの様にしたら良いですか?テーブル側の#を取り除く事はできません。 検索ボタンのコードは Private Sub 検索_Click() Dim strFilter As String, strExp As String, aryOpe As Variant If Not IsNull(Me.txt氏名) Then strFilter = strFilter & " AND 品番 Like *" & Me.品番一覧 & "*" End If Me.Filter = Mid(strFilter, 5) If strFilter = "" Then Me.FilterOn = False Else Me.FilterOn = True End If となっています。 うまく説明できなくてすいませんが、誰か教えて頂けませんか? よろしくお願いします。 End Sub

  • アクセス初心者です。プログラムの書き方について。

    アクセス初心者です。 Private Sub cmd_キャンセル_Click() Dim CT1 As Control For Each CT1 In Me.Controls If CT1.ControlType = acTextBox Or CT1.ControlType = acComboBox Then CT1.Value = Null ElseIf CT1.ControlType = acCheckBox Then CT1.Value = False End If Next Dim strmsg As String If MsgBox("基本情報登録画面を閉じますか?", vbOKCancel) = vbOK Then DoCmd.Close 'フォームを閉じる DoCmd.OpenForm "Mainmenu" Else 'OK以外の場合 Exit Sub 'そのままプロシージャーから抜け出す Me.コード.SetFocus End If End Sub キャンセルのコマンドボタンを作成しました。キャンセルを押すと、入力していた情報がクリアされ、「基本情報登録画面を閉じますか」と言うメッセージボックスがでてきて、OKかキャンセルの選択をします。OKの場合は基本情報登録画面が閉じて、MainMenuが開きます。キャンセルのときは、基本情報登録画面のままで、コードのところにカーソルが着ててほしいのです。上記プログラムではキャンセルからの動きができません。基本情報登録画面のままというのはできているのですが、カーソル指定ができません。どの書き方がまずいのでしょうか?わかる方がいましたらご教示ください。よろしくお願い致します。

  • アクセス フォームが存在するかを一発で取得したい

    フォームが50個くらいあるのですが 該当のフォームが存在するかvbaで取得したいのですが If CurrentProject.AllForms("フォーム1").IsLoaded Then のように、一発で取得する方法はありますか? 今は Sub Sample1() Dim DB As DAO.Database Dim f As DAO.Document Set DB = CurrentDb Dim strForm As String Dim flg As Boolean strForm = "Fメインメニュー" For Each f In DB.Containers!Forms.Documents If strForm = f.Name Then flg = True Exit For End If Next If flg = False Then MsgBox strForm & "は存在しません" End If End Sub のような感じで、すべてのフォームをループしているのですが 無駄が多い気がします。 改善策があればお願いします。