- ベストアンサー
自動で入力した文字をテーブルに反映させたい
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
No8の続きとして、といいますか、No8の確認の前に、 Loop 'フォームを再クエリしてデータを反映させます Me.Requery '再クエリするとフォーカスが先頭に飛ぶので強制的にレコードの最後に移動させます DoCmd.GoToRecord , , acLast rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub のところで、 DoCmd.GoToRecord , , acLast をコメントアウトして、 Me.Requery のかわりに、 Me.Refresh を試してみてください。これはカレントレコードを 更新するだけなので、これが本来はいいのかも しれません。
その他の回答 (9)
- piroin654
- ベストアンサー率75% (692/917)
>ただタブオーダーどおりの指示にはなってくれません。 >イベントを実行するとタブオーダーの一番初めのフィールドに移動します。 これは、どうしてもRequeryによりフォーカスの位置が 初期化されてしまうのでは、と思います。 No9の Me.Refresh はカレントレコードの更新、Requeryは連結している テーブルの更新をするので、少し挙動が違って くるのだろうと、思います。 Me.Requery のかわりに、 Me.Refresh をためしてみてください。ただ、データを入力した 最後のフィールドではなく、「品番」の次の「色種類」 にとどまるかもしれません。 このあたりは、許容の範囲内だろうと思います。
- piroin654
- ベストアンサー率75% (692/917)
Accessのバージョンの違いで修正されている かもしれないので、一旦、No5のコードのままで、 DoCmd.GoToRecord , , acLast を 'DoCmd.GoToRecord , , acLast のようにコメントアウトしてどのようになるか、確認してみてください。 もし、フォーカスが一番最初のレコードに飛ぶようであれば、 No7の方法を試してみてください。
補足
ありがとうございました!コメントアウトするとレコードは移動せず出来ました。 ただタブオーダーどおりの指示にはなってくれません。 イベントを実行するとタブオーダーの一番初めのフィールドに移動します。
- piroin654
- ベストアンサー率75% (692/917)
(1) 最後のあたりで、 Loop 'フォームを再クエリしてデータを反映させます Me.Requery 'フォーカスが先頭に飛ぶので強制的にレコードの最後に移動させます DoCmd.GoToRecord , , acLast rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub となっているところを、 Loop 'フォームを再クエリしてデータを反映させます Me.Requery 'フォーカスが先頭に飛ぶので強制的にレコードの最後に移動させます DoCmd.GoToRecord , , acLast '一つ前のレコードに戻します DoCmd.GoToRecord , , acPrevious rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub のように、 DoCmd.GoToRecord , , acLast のあとに、 DoCmd.GoToRecord , , acPrevious を入れて一つ前のレコードに戻します。 (2) あるいは、 最初の変数の宣言で、 Dim bk As Variant としておきます。そして、 Loop bk = Me.Bookmark 'フォームを再クエリしてデータを反映させます Me.Requery Me.Bookmark = bk 'フォーカスが先頭に飛ぶので強制的にレコードの最後に移動させます 'DoCmd.GoToRecord , , acLast rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub のように、 Me.Requery を bk = Me.Bookmark と Me.Bookmark = bk で挟みます。 BookMarkプロパティで再クエリする前の位置を bkに格納し、再クエリした後の位置を自分の BookMarkプロパティに当てはめ、再クエリ前の位置に 修正するというものです。 この方法で、一つ前のレコードに飛ぶようであれば Loop bk = Me.Bookmark 'フォームを再クエリしてデータを反映させます Me.Requery Me.Bookmark = bk DoCmd.GoToRecord , , acNext のように、 DoCmd.GoToRecord , , acLast を追加して、レコードを一つ前に進め、 位置を修正するということもできます。 以上ですが、このようにするとどうなりますか。 なお、 Docmd.GotoControl コントロール名 という方法はこの場合には向かないので 使えないと思います。
- piroin654
- ベストアンサー率75% (692/917)
>このコレクションには項目がありません。と出るのですが何故でしょう? どの部分が黄色になりますか? Set rs = db.OpenRecordset("品名テーブル") のテーブルの名前。 Me!色種類 = rs!色種類 Me!詳細 = rs!詳細 「Me!色種類」の「色種類」はフォームのコントロールの 名前、すなわちテキストボックスの名前。「テキスト1」とかに なっていないか。 「Me!詳細」についても同じ。 「rs!色種類」の色種類はテーブル「品名テーブル」のフィールドの名前。 「rs!詳細」についても同じ。 このあたりを確認してみてくださ。 なお、DAOをつかっているのでDAOのチェックも確認しておいてください。
お礼
'再クエリするとフォーカスが先頭に飛ぶので強制的にレコードの最後に移動させます DoCmd.GoToRecord , , acLast このコードを変更すればいいのですよね? GoToControlで自分なりにしてみましたがコンパイルエラー引数は省略できませんとなりました。 ながながと申し訳ありませんが宜しくお願いします。
補足
ありがとうございました!思い通りに入りました。 でもエンターを押すと勝手に次のレコードに移動してしまいます。 まだフィールドの入力があるのになぜでしょうか?
- piroin654
- ベストアンサー率75% (692/917)
>品名、色種類、詳細だけのテーブルをもう一つ作って >それを参照にしたらいいのか?? はい、そのようにします。本来はそのようなテーブルが あるべきなのですが、当初はこのテーブル1がそのような テーブルと思っていました。つまり、たとえば商品テーブル のようなものです。 そのテーブルを「品名テーブル」とします。 品名 色種類 詳細 みかん 暖色 黄 オレンジ 暖色 黄 リンゴ 暖色 赤 のようにします。これにオートナンバーのIDなどを 追加して主キーにしてもいいのですが、いまのところ 必要ないかもしれません。 次に、フォームの「品番」の「更新後処理」を 以下のようにしてみてください。これには 「品番」から「品名」を取り出す部分も 含まれています。それと同時に「色種類」、「詳細」 に追加していくようにしています。 Private Sub 品番_AfterUpdate() Dim db As DAO.Database Dim rs As DAO.Recordset Dim var As Variant Set db = CurrentDb Set rs = db.OpenRecordset("品名テーブル") 'split関数で変数varに文字列を半角スペースのところで分離して格納します。配列です。 var = Split(Me!品番, " ") '分解した文字列の最初を取り出し品名フィールドにいれます Me!品名 = var(0) '色種類と詳細を各フィールドに格納します Do Until rs.EOF If var(0) = rs!品名 Then Me!色種類 = rs!色種類 Me!詳細 = rs!詳細 '見つかればここでループを抜けます Exit Do End If rs.MoveNext Loop 'フォームを再クエリしてデータを反映させます Me.Requery '再クエリするとフォーカスが先頭に飛ぶので強制的にレコードの最後に移動させます DoCmd.GoToRecord , , acLast rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub ほとんどエラー処理をしていませんが、「品番」で書き損じた 場合は、書き直せばいいので、そのあたりは柔軟に。 もし、不都合が出たらまた補足なり、質問なりしてください。 なお、たとえば、「品番」にオレンジとして他のフィールドを クリックしてもデータが反映されるようになっています。 No1~No3で言いたかったのは、テーブルを正規化しておかなければ あとで、必要なデータの加工が面倒になるということなのですが、 もともと、データが変則的な「品番」から始まっているので こちらも少しとまどったようなところです。何よりも苦労するのは 質問者さんですから、最初の作り始めを考えたらどうでしょうか、 ということで回答した次第です。 なお、レポートの件に関しては慣れた人なら、テーブルの正規化と サブレポートなどを使って切り抜けるかもしれませんが、そこは 質問者さんの意地次第だと思います。
補足
実行時エラー3265 このコレクションには項目がありません。と出るのですが何故でしょう? フィールド名も合ってるのですが。。。。
- piroin654
- ベストアンサー率75% (692/917)
テーブル1とテーブル2の説明というか、どちらが日ごろの 入力用で、どちらが基準値(規格)を収めておくものか 質問や補足を読み返してみるとますますわからなく なっているのですが。こちらの疑問点をなくしたいので 少し質問をしてみます。テーブル1とテーブル2の説明が 途中で入れ替わっているような気がするのですが。 >フォームで品番を入力したら色種類と詳細が自動でて、 >テーブルにも反映されるようにしたいです。 (1) このフォームの基となっているテーブルはテーブル1ですか、 それともテーブル2ですか。 (2) 反映させるテーブルはテーブル1ですか、テーブル2ですか。 (3) 質問の画像のテーブルはテーブル1としていいのですね。 このテーブルにデータがないフィールドがありますが、 これはこれから入力していくものですか、あるいは この部分に他のテーブルのデータを自動的に入れたい、 ということなのでしょうか。 (4) (3)の続きとして、このテーブルに入力されている データ(品名、色種類、詳細)はその都度入力 しているのですか。またこれらのデータは 決まっているもの(すなわち基準値、あるいは 規格値)なのでしょうか。それならば、質問の >品名、色種類、詳細だけのテーブルをもう一つ >てそれを参照にしたらいいのか?? は合点がいくのですが。 (5) みかん A-1 みかん A-2 オレンジ A-1 ・ ・ ・ という品番というのは測定対象となる いわばロット番号のようなものですか。 (6) 品名 色種類 詳細 みかん 暖色 黄 オレンジ 暖色 黄 ・ ・ これは基準値(あるいは規格値)ということに なるのでしょうか。
補足
説明下手で申し訳ないです。 (1)(2) 自動で出てテーブルに反映させたいのはテーブル1の基準値などが入ってるテーブルです。 新規商品(番号)が出た時に基準値を入力するのですがその時に表示&反映させたいのです。 (3) 分かりにくくしてしまいすいません。基準値の数値が入力されています。 例として作ったもので数値を入れるのを忘れてました。。。 (4) その都度入力しています。それが面倒だし、入力ミスもあってはダメなので 色種類、詳細を自動的に反映させたいのです。 (5) 測定対象となるものです。ロット番号のようなものですが、1つに対してデータは1つではありません。 みかん A-1が数十個あって日々の測定で入力(テ-ブル2)していってます。 (6) 基準値というよりはグループの名前?的な感じでしょうか? そのグループ名でレポートの表示をまとめたいので入力してると言う感じです。 宜しくお願い致します。
- piroin654
- ベストアンサー率75% (692/917)
最終的にレポートでのデータの並びは、どのように なっている必要があるのでしょうか。少し具体的に 表示してみてもらえますか。補足にあるような表を レポートに表示するということでしょうか。 >細のフィールドも増やそうとなったのですが入力手間がかかるので >品名を入力すると色種類、詳細も自動で入力出れば これはそれほど難しくはないと思いますが、 どのテーブルにどのようなデータをどのように入力 したいのでしょうか。
補足
今現在補足にあるような感じでレポートで表示しています。 補足ではみかんが先にきてしまってますが品名の昇順で並んでいてオレンジが先です。 これを基準値の大きさでの降順にとの要望があり、品名が混じらないように詳細でグループ分けしようとしています。 テーブル1には品名と大きさ、重量など数種類の基準値が入っています。 テーブル2には日付と品名、大きさ、重量など数種類の測定値が入っています。 色種類や詳細は特にテーブルには必要ないのですがレポートでのグループ分けをしたいので入力してると言う感じです。 色種類や詳細はテーブル2に入っています。 基準値などは他の方が入力する場合もあり、レポート用になど言ってもあまり理解できないので 品名が入力されると自動にテーブルに反映されたらいいのですが。。。 宜しくお願い致します。 説明が下手で分かりにくく申し訳ないです。。。
- piroin654
- ベストアンサー率75% (692/917)
No1です。もし質問の内容ですすめるのであれば、 テーブル1を、規格テーブル、テーブルカテゴリを 品名テーブルとして、 規格テーブル 規格名ID 品名ID 規格名 色種類 詳細 サイズ 重量 1 1 みかん A-1 暖色 黄 2 2 オレンジ A-1 暖色 黄 3 1 みかん A-3 暖色 黄 4 1 みかん A-4 暖色 黄 5 1 みかん A-2 暖色 黄 6 2 オレンジ A-2 暖色 黄 7 2 オレンジ A-3 暖色 黄 品名テーブル 品名ID 品名 1 みかん 2 オレンジ 3 りんご のように、するのはどうでしょう。
- piroin654
- ベストアンサー率75% (692/917)
「テーブル1」のデータをどのように利用するかに よりますが、普通は テーブル1 (これを詳細テーブルとします) 品名ID カテゴリID 品名 色種類 詳細 サイズ 重量 1 1 みかん A-1 暖色 黄 2 1 みかん A-2 暖色 黄 3 1 みかん A-3 暖色 黄 4 1 みかん A-4 暖色 黄 5 2 オレンジ A-1 暖色 黄 6 2 オレンジ A-2 暖色 黄 7 2 オレンジ A-3 暖色 黄 テーブルカテゴリ カテゴリID カテゴリ 1 みかん 2 オレンジ 3 りんご テーブル1の品名IDと、テーブルカテゴリの カテゴリIDをそれぞれ主キーとします。 このようにするほうがそれぞれのカテゴリの中の 品種、あるいは規格による管理などに便利では ないかと思います。 品名IDはかならずしもカテゴリごとに品名が 順序良く並ぶ必要はなく、登録順に品名ID が発行されればいいと思います。ですから、 品名ID カテゴリID 品名 色種類 詳細 サイズ 重量 1 1 みかん A-1 暖色 黄 2 2 オレンジ A-1 暖色 黄 3 1 みかん A-3 暖色 黄 4 1 みかん A-4 暖色 黄 5 1 みかん A-2 暖色 黄 6 2 オレンジ A-2 暖色 黄 7 2 オレンジ A-3 暖色 黄 のように、オレンジ A-1 と みかん A-2 の品名IDが登録順に 発行されていても構わないのです。 カテゴリIDはオートナンバーでもVBAで自動で発行する方法でも どちらでも構わないです。とくに品名IDに意味を 持たす必要はありません。 このときサブフォームなどを利用すれば、カテゴリ別に 見通しよく管理できます。 また、登録も簡単にできると思いますが。 ほんの少し作り込めばできるのですが。
補足
テーブル1はあくまで規格値などを入力しているので新規入力は1ヶ月に数回です。 テーブル2は毎日測定結果を入力しています。 入力はすべてフォームでそれぞれ入力しています。 クエリで平均などを出してレポートで表示しています。 レポート表示の時に色種類で大きなグループ分けをしていてその中でも品名でグループ分けしています。 基準値などが品名によって違うため。 暖色 みかん 基準値 大きさ 10 重量 5 平均 最小 平均 最小 みかん A-1 11 9 5 4 みかん A-2 11 8 6 4 オレンジ 基準値 大きさ 15 重量 9 平均 最小 平均 最小 オレンジ A-1 16 14 10 8 りんご 基準値 大きさ 15 重量 9 平均 最小 平均 最小 りんご B-3 15 13 9 8 品番での降順にしていたのですがサイズでの降順にして欲しいと要望がありました。 しかもサイズ別でも詳細部分は分けて欲しいとの要望があり、元々詳細部分の入力をしていなかった(必要性があまり無いため)のですがレポートの並びを考えた末詳細のフィールドも増やそうとなったのですが入力手間がかかるので品名を入力すると色種類、詳細も自動で入力出れば思い質問させて頂きました。 レポートで並びが特定出来れば入力する必要もないのですが。。。 なんだか訳が分からない補足になってしまいました。 今の所、テーブルで主キーは設定していません。 ナンバーは特にいらないので設定しませんでした。
お礼
なりました!!ありがとうございました。 なかなかやっぱりアクセスって難しいです。 助かりました。詳しく丁寧に教えてくださってありがとうございます。