• ベストアンサー

入力の簡略化

前回の質問させていただいたものですが、今だに完成できて いないので、もう一度書き込みさせていただきます。 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.へ値を反映させても値のみが反映され、 「ツアータイトル」と「ツアー情報」が空白のままになって しまいます。 もうなにがなんだか。。 知識と文章力のなさで、暗号を解くみたいになりましたが、、、。 ご理解いただける方、宜しくお願いいたします。

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

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

いろいろとやり方はありますが、 保存ボタンクリックのソースが出てますので その中だけで、現在の値を保存、新レコードにして画面上の部品に 退避した値をセットするように書いてみました。 Private Sub 新規データ保存_Click() Dim 保存ツアーNo As Integer Dim 保存ツアータイトル As String Dim 保存ツアー情報 As String 保存ツアーNo = Me!ツアーNo 保存ツアータイトル = Me!ツアータイトル 保存ツアー情報 = Me!ツアー情報 Me.入力者書込み.Value = Me.入力者表示.Value Dim strmsg As String strmsg = "データの保存が完了しました。" CkPoint = False 'CKPointをFalseに変更します。 MsgBox strmsg, vbInformation DoCmd.GoToRecord , , acNewRec Me!ツアーNo = 保存ツアーNo Me!ツアータイトル = 保存ツアータイトル Me!ツアー情報 = 保存ツアー情報 DoCmd.GoToControl "自宅電話番号" End Sub 登録と同時に、新規レコード上に該当項目がセットされます (無条件に、入力状態になります それが不味ければ、保存用の変数をフォームモジュールの 上部へもって行き、 Private Sub Form_BeforeInsert(Cancel As Integer) 内で、部品上にセットする。 このときは、どれかの項目を入力した瞬間に、セットされる。 しかしながら、この処理があります Private Sub ツアーNo_AfterUpdate() If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If 招待者IDの扱いがわかりませんが、自動でセットすると、この部分は処理しないと思います。 意味合いが見えませんが、適時必要な箇所へ同等の処理を記載する必要があるかもしれません。

Armadillo5
質問者

補足

回答ありがとうございます! これはこのままコピペでいけるんですかね? 保存ツアーNo = Me!ツアーNoの場所で型が一致しませんって出ました。 ツアーNoって名前はあってるんですけど。。

すると、全ての回答が全文表示されます。

その他の回答 (6)

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

もともと >If Me![招待者ID] = 0 Then >Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 >End If は、ツアーNOを入力した時に、処理されているのです。 今回、自動でセットした関係でこの処理を通らないのが問題だったのですが・・ もしかしたら、別なところで同様の処理があるのかもしれないですね。 >あっても問題ないなら残しておいたほうがいいのでしょうか。 ツアーNoを入力し直した時には、処理されます。 現在ある処理ですので 置いておいた方が無難ですね。 私には、システムそのものが見えませんので、正確な判断は付きませんので 最終的には 色々テストされ 登録されるデータでご判断ください。

Armadillo5
質問者

お礼

了解しました! なんか、ほんまにありがとうございます。 わからないなりにもできた時の感動はすごいですね。 またいろいろと質問させていただくことがあるかと思いますが、その節は宜しくお願いいたします。 ありがとうございました!

すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.6

空白で、エラーにかからないようにしても問題ないとは思います。 なぜならば、現に空白でも ボタンが押せてその処理を通るわけですから たぶん、テーブルの必須項目かなにかで、登録できないのではないかと考えます。 もともとそうだったので、追加した部分で発生するエラーは、 対応した書き方でも、よいと思います。 それよりも、本来ツアーNOを入力をした時の If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If この処理ですね・・ ツアーNOを入れたときに、招待者IDが0であれば、旅行招待者管理テーブルの招待者ID+1の値を 採番して画面上にセットしていますね。 以降、招待者IDを触ることが無いのであれば、同じく Private Sub 新規データ保存_Click() の最初に持って行ってもよいでしょうが・・ (クリックするまで、招待者IDは自動採番されないので0のままですが) 全体がわからないので、こうあるべきと言う判断は付きませんが 何れにしても、この3行を無視するわけにはいかないと思いますので 対応は必要ですね。

Armadillo5
質問者

お礼

f Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If ためしにこれを削除してやってみたのですが、とくに問題がなさそうなんです。。団体IDはちゃんと連番になりますし。 あっても問題ないなら残しておいたほうがいいのでしょうか。

Armadillo5
質問者

補足

なんなんでしょうか。。。 一応招待者IDはオートナンバーで連番になっているんです。 今回の改造をした後も普通に連番でいけているのですが。 実はこれいらないとかいうオチでしょうか。。。

すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.5

>一番最初にタイトルが空白の状態で保存ボタンを押すとNullが不正だとでます。これの対処の仕方をお願いいたします! ツアーIDを入力すると、タイトル・情報が参照表示される。 (でたらめなツアーIDを入力すると”該当データがありません。確認してください”) とメッセージが、表示されるようになっていたので 必ず正しいツアーIDを入力するものと思いましたが? また、本来最初に入力しようとしたのも その意味では無かったのでしょうか? よくわかりませんが、タイトル・情報が空白の場合もあるとして 保存ツアータイトル = iif(isnull(Me!ツアータイトル),"",Me!ツアータイトル) 保存ツアー情報 = iif(isnull(Me!ツアー情報),"",Me!ツアー情報) もしかして、一番最初に このボタンを押して入力状態ですかね・・

Armadillo5
質問者

お礼

いや、おっしゃるとおりです^^; よくわからんこと言いました。。 フォームを開いた最初の画面では、タイトルと情報はブランクとなっています。普通ならちゃんとしたNo.を入力して保存するのですが、バイトが大勢で入力をするので、誤ってエラー出してコードの画面を見せたくないって思ったのです。 でもブランクの状態で保存ができたら本末転倒ですね^^;すみません。 ほんとにわけわからない文章にお付き合いいただきありがとうございました。貴重なお時間感謝いたします!

すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.4

>保存ツアーNo = Me!ツアーNoの場所で型が一致しませんって出ました。 ツアーNoのコントロールソースに対応する項目は テーブルでは どのデータ型になっていますか? NOなので、短絡的に数値と判断したのですが、もしテキスト型であれば Dim 保存ツアーNo As Integer を Dim 保存ツアーNo As String にしてください。 他の型であれば、それにあった型で宣言してください。

Armadillo5
質問者

お礼

うそです!!!! できました!”1!! 一番最初にタイトルが空白の状態で保存ボタンを押すとNullが不正だとでます。これの対処の仕方をお願いいたします!

Armadillo5
質問者

補足

クリアしました! つ、次は 保存ツアータイトル = Me!ツアータイトル でNullの使い方が不正ですとなります。 ほんまにすみません。。 Private Sub ツアーNo_AfterUpdate() If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If DoCmd.SetWarnings False '警告メッセージをオフにします。 DoCmd.OpenQuery "ツアー情報抽出テーブル削除クエリ" ' 削除クエリーを実行します。 ' 追加クエリーを実行します。 DoCmd.OpenQuery "ツアー情報抽出テーブル作成クエリ" DoCmd.SetWarnings True '警告メッセージをオンに戻します。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim stCri As String Set cn = CurrentProject.Connection rs.Open "ツアー情報抽出テーブル", cn, adOpenDynamic, adLockOptimistic '文字列型データ検索 stCri = "[ツアーNo]='" & ツアーNo & "'" rs.Find stCri '該当するレコードが無い場合は、メッセージボックスを表示し、抜け出す If rs.EOF Then MsgBox ("該当データがありません。確認してください!!") Else Me!団体名 = rs!団体名 Me!ツアータイトル = rs!ツアータイトル End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これと何か関係があるのでしょうか?

すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.2

kurodai2です。 前回のは、難しかったですか・・ >非連結のテキストボックス「非ツアーNo.」にツアーNo.を入れ、 >保存ボタン押したら「非ツアーNo.」から「ツアーNo.」へ値を >反映させるようにしたのですが、ボタンを押した時点では反映 >されているのに、レコードが切り替わったらブランクに >なってしまいます。たぶんそういう設定にしているのでしょうけど、 >どこをいじっていいのか。。 この切り替わったら・・と言うのは 新しいデータの入力になったら と言うことですか? そうであれば、当然そうなります。 なぜならば、保存のときにツアーNOを入れていますので 新しいデータになった時には、空の状態ですね。 新しいデータの入力状態になったときに、ツアーNOが入っている ようにするには、保存ボタンを押したときではなく(このイベント時に ほかにどのような操作をしているのかも不明ですね) Private Sub Form_BeforeInsert(Cancel As Integer) のタイミングですね。 >しかもツアーNo.へ値を反映させても値のみが反映され、 >「ツアータイトル」と「ツアー情報」が空白のままになって >しまいます。 そもそも、ツアーNOを入力すると言うことから考えると 「ツアータイトル」「ツアー情報」の情報がマスタ化されてるのでしょう。 そうなると、画面上の「ツアータイトル」と「ツアー情報」は表示 されているだけで、入力項目でも、データとして格納される項目でもないと 思うのですが・・ ツアーNOの入力間違いがあると言うことであれば、コンボボックスではない と考えます。 そうなると、ツアーNOを入力したときに、ツアーマスターを 参照して、「ツアータイトル」「ツアー情報」を取得している場所が あるのではないですか? 新規データ入力になった時にツアーNOをセットするようにすれば その処理を通るのか?  通らないのであれば、セットした時にその処理をしてやるようにすれば よいと思いますが ただ・・コードだけ入力して、名称を参照表示させているとしても 間違っていれば、表示されないか 他の名称が表示されるので 基本的には入力時に即 気がつくと思うのですが・・ 入力対象のテーブルの構成と、画面の部品の種類 (テキストボックスなのかコンボなのか)を含め、 もう少し情報を出されたほうがわかりやすいですね。

Armadillo5
質問者

補足

先日は本当にありがとうございました! しつこく質問しまくって申し訳ありません。 とりあえず今現在はコンボボックスでなく、 テキストボックスになります。返答が遅れてしまいました。 前もってツアーNo.とツアータイトルとツアー情報を、 ツアー内容テーブルに入力しておきます。 フォームのテキストボックスにツアーNo.を入れたら、タイトルと 情報がでるようにしています。そのフォームで入力した全てのものが 入るテーブルに、その三つも入るようなっています >新しいデータの入力状態になったときに、ツアーNOが入っている ようにするには、保存ボタンを押したときではなく(このイベント時に ほかにどのような操作をしているのかも不明ですね) Private Sub Form_BeforeInsert(Cancel As Integer) のタイミングですね。 クリック時に Private Sub 新規データ保存_Click() Me.入力者書込み.Value = Me.入力者表示.Value Dim strmsg As String strmsg = "データの保存が完了しました。" CkPoint = False 'CKPointをFalseに変更します。 MsgBox strmsg, vbInformation DoCmd.GoToRecord , , acNewRec DoCmd.GoToControl "自宅電話番号" End Sub となっています。 タイミングが違うのですね^^;了解しました。 画面の部品ですが、ツアーNo.、タイトル、情報の上記の三つと ツアーID、これは規定値にして新しいレコードになった際も 最後に入力したデータが反映されます。 あとは普通に個人情報です。氏名、電話番号、住所(郵便番号支援使用)です。 今現在のツアーNo.に入っているコードは以下です。 Private Sub ツアーNo_AfterUpdate() If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If DoCmd.SetWarnings False '警告メッセージをオフにします。 DoCmd.OpenQuery "ツアー情報抽出テーブル削除クエリ" ' 削除クエリーを実行します。 ' 追加クエリーを実行します。 DoCmd.OpenQuery "ツアー情報抽出テーブル作成クエリ" DoCmd.SetWarnings True '警告メッセージをオンに戻します。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim stCri As String Set cn = CurrentProject.Connection rs.Open "ツアー情報抽出テーブル", cn, adOpenDynamic, adLockOptimistic '文字列型データ検索 stCri = "[ツアーNo]='" & ツアーNo & "'" rs.Find stCri '該当するレコードが無い場合は、メッセージボックスを表示し、抜け出す If rs.EOF Then MsgBox ("該当データがありません。確認してください!!") Else Me!ツアー情報 = rs!ツアー情報 Me!ツアータイトル = rs!ツアータイトル End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.1

QNo.3143864 から見ていますが、どうも方向が違うように思えてなりません。 >基本同じコードを使用し、一回一回コードを入力していました。 >やはり人間の手によるものですから間違いがあり、 >違うコードを入力してしまうと行方不明になってしまうのです。 この対策は重要ですが、「そのために入力回数をへらす」のではなく「誤ったコードは入力できない」ようにするべきです。その上で入力者の負担軽減を考えるのが良いでしょう。 それではどうするか? 選択対象が多くない場合はコンボボックスが便利です。 Armadillo5さんが使用しているテーブルやフィールドの名前が判らないので一応 ツアーマスター(Table) ツアーNo、ツアータイトル、ツアー情報(Field) ツアー記録(Table) ツアーNo、入力者ID(Field) と仮定します。フォームのレコードソースは SELECT ツアー記録.入力者ID, ツアー記録.ツアーNo FROM ツアー記録; コンボボックスを貼り付け 1.テーブルまたはクエリーの値 2.ツアーマスター 3.ツアーNo 4.次のフィールドに保存する→ツアーNo これで登録されているツアーNoしか選択できなくなります。同様にコンボボックスを作り3.のところだけを「ツアータイトル」に替えると、ツアーNoとツアータイトルが連動して変わります。ツアー情報も同様です。 最終の選択を次に反映させたければ Private Sub Form_AfterUpdate() stok_cd = Forms![フォーム1]![ツアーNo] End Sub Private Sub Form_BeforeInsert(Cancel As Integer) Forms![フォーム1]![コンボ1] = stok_cd End Sub みたいなことでできるでしょう。

Armadillo5
質問者

お礼

↑の補足の補足になりますが、、。 ツアーNo. ツアータイトル ツアー情報 氏名 電話番号 住所 など、メインのテーブル(ツアー参加者テーブル)があり、 フォームで入力したものはタイトルも情報も含め すべてこの中に入ります。 ツアーNo.で反映されるように、もう一つの(ツアーマスター) のテーブルにツアーNo.とツアータイトルとツアー情報が先に 登録してあります。 以下にもありますが、フォームのレコードソースは 「ツアー参加者テーブル」となっています。

Armadillo5
質問者

補足

なんとかできそうな気がしてきました。 ツアーNo.とツアータイトル、ツアー情報のテーブルが一つあり、 メインのテーブルにはそれらも入りますが、個人情報、つまり氏名、電話番号、住所など、ほかのデータも入ってきます。そうなるとフォームのレコードソースはどうなるのでしょうか?? 今現在は全部のデータが集まるメインのテーブルの名前だけがレコードソースに入っているのですが。。。 あと、前にも教えていただいたのですが、stok_cdというのはこのまま使えばいいのですよね?CDを何かに置き換える必要はありませんよね?

すると、全ての回答が全文表示されます。

関連するQ&A