- 締切済み
アクセスの自動入力フォームに手動で入力したい
初心者ですが、ネットで調べながらaccess2013で、納品書フォームを作りました。 納品書明細テーブルと商品マスタテーブル(商品コード、品番、単位)を納品書明細クエリで紐づけしてフォームを作成しました。商品コードを入力すると、自動的に品番と単位が入るようになっています。 ここで、商品コードがついていない商品(商品マスタに含まれず、今後登録する予定もない)も品番と単位の欄に手動で入力できるようにしたいのですが、可能でしょうか。 今手動で入力すると「フィールド'商品コード'とキーが一致しているレコードをテーブル'商品マスタ'で探すことができません」とエラーが出てしまいます。 ご教示いただけましたら幸いです。よろしくお願いいたします。
- みんなの回答 (16)
- 専門家の回答
みんなの回答
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
>空のフォーム(メニュー)を新規に作り、 これにラベルボックスを納品書登録を配置します。 この時デザインモードですね、コードの表示ツールでコード編集画面 ここへコピペします。 こうして作ったフォーム(フォームAとします)に対して、 No.8の顧客マスタ登録作成の作業を始めたのですが、 >→クエリビルダを閉じる→左端の+をドラッグしてボックスを左へ移動 この部分で「左端の+」がどこにあるのか全く分かりませんでした。 どこかで間違っているのでしょうか。 ★左端のフィールドの更に左上角より少し離れた左上に影のような? 表形式:ラベルボックスはフォームヘッダ、 テキストボックスは詳細に分かれますが編集は一体になって反応します。 この十字マークは左右の移動 左端の一方のボックスでそれぞれ領域内の上下移動 ボックスの並びの移動はラベルとテキストセットで移動 (単独で移動すると並びが崩れます)Ctrl+Zで元に戻してください >クエリビルダで顧客マスタを追加したあとは、 ワイルドカードとMフリガナの2つを フィールドにドラッグしMフリガナの並び替えを昇順にしてクエリビルダを 閉じればいいんですよね? ★Mフリガナはワイルドカードに含まれているので重複することになるので フリガナの表示を外します レコードソースはテーブル名からSQL文に変わっています。 メモ帳にでもコピペして確認下さい >その後の商品マスタ登録も同じフォームAに対して行えばいいのでしょうか。 ★ ハイ!その通りです >納品書登録、納品書登録明細サブはフォームA とは別にそれぞれフォームを作成するのでしょうか ★納品書登録のレコードソースを納品書テーブル 納品書登録明細サブのレコードソースを納品書明細テーブル と同じ要領で作成して 納品書登録明細サブを納品書登録フォームのフッターにドラッグ プロパティーのデータタグでリンク親フィールドをID リンク子フィールドを納品書ID 基準日と税率期限の対比で決めます。 ★右の集合ボックスはプロフィールです。 ここはだれかれなしにみる所ではありません。 大きなラベルボックッスかぶせておきます
補足
ご回答いただきありがとうございます。 やはり「左端の+」がわかりません。 レコードソースのところには SELECT 顧客マスタ.* FROM 顧客マスタ; とあります。 クエリビルダを閉じると、フォームのデザイン画面に戻りますが、 詳細の欄には何もありません。 また回答No.8にあった >→Mフリガナをフィールドに追加→並び替えを昇順に という部分はどういう作業になりますでしょうか。 フィールドに追加とあったので、ワイルドカードと同じくドラッグして入れてしまいました。 次にご回答いただいても理解できなかったら、 私の能力を超えているのだと思いますので、解答を締め切らせていただきます。 貴重な時間を割いて丁寧に教えてくださっているのに理解できず申し訳ございません。
- chayamati
- ベストアンサー率41% (260/624)
>ANo.7にフォームを添付してくださっていますが、品番が二つあります。 片方が自動入力される欄で、もう片方が手入力する欄なのでしょうか。 ☆左端の商品コード(納品書明細テーブルのフィールド)に入力すると 商品マスタの主キーである商品コード繋がりで商品が確定します。 右端の基準単価、品番それに単位名は商品マスタの情報です。 !!この項目を修正すると他のレコードにも反映しますので、 フィールドの編集ロックをはいにします この情報をBVAで単価、品番にコピーします。 コピー後単価、品番に手入力で更新とが可能です。 右端の基準単価、品番コードをプッロパティーで表示しない設定しても VBAに影響することはありません >印刷し、取引先に送付するわけですが ☆このまま印刷できますが、取引先に送付するには敬称、住所等他に複数の 項目が必要ですので登録画面は単票形式 またはレポートで様式を整えたものの一括印刷になります。
- chayamati
- ベストアンサー率41% (260/624)
>せっかくお答えいただいたのに申し訳ございませんが、 よく理解できずにいます。 下記部分は、どこかに書き込まないといけないのでしょうか。 また、回答5までで作ったものはそのまま使うのでしょうか。 クエリは使わないということでよろしいのでしょうか。 ☆新規にフォームを作成し、顧客のコンボボックス配置します。 命令文でお分かりかと思いますがフォームを開くコマンドボタン使いません -----------コンポボックッスの値で絞り込み------------- Private Sub 納品書登録_Change() DoCmd.OpenForm "納品書登録", , , "T顧客ID=forms!メニュー!納品書登録" End Sub ----------------------------------------------------------------------------- ※テーブルには複数年の情報が蓄えられています。 無条件でフォームを開くと全てのレコードが対象になります。 企業のシステムでは数万のレコードは普通に存在します。 無条件で開くと大変ことになります。そのフォームが単票フォームならなおさらです。 そのため条件付きで開きますが、開いてから条件を指定しても無駄です。 その条件は今回の場合:納品書番号、日付、お客様、 今月分(月初日~月末日)、期間(開始日~終了日) それぞれのボックスを配置したフォーム(メニュー)を新規に作成し、 これを開いて条件入力後このメニューで目的のフォーム目的のフォームを 開くことになります。
- chayamati
- ベストアンサー率41% (260/624)
追伸 オートナンバー形式のIDフィールドはAccessにお任せなので 意識して外しています。ポカミスではありません 添付図は商品マスタ登録の画面です。 商品コードでソートがかかっていますので、どのような順で登録しても 閉じて再度開くとコード順にならびます 以上でお伝えしたい事は全てだと思っていますが、漏れている事も多々あるかと ご不明の点はご遠慮なく。 お陰で色々勉強になり有難うございました。
補足
さらにご回答いただきありがとうございます。 ANo.7にフォームを添付してくださっていますが、品番が二つあります。 片方が自動入力される欄で、もう片方が手入力する欄なのでしょうか。 このフォームから納品書のレポートを作り、印刷し、取引先に送付するわけですが、 レポートのなかの品番の位置は、自動入力された場合も手入力した場合も同じ位置にくるようにできるのでしょうか。
- chayamati
- ベストアンサー率41% (260/624)
今日も暑かったですね。 フォームの表形式いかがですか 表形式作成すると 最初ラベル部分はフォームヘッダーに、 テキスト部分は詳細に分かれますが ・どちらかのボックス幅を変えると他のボックスの幅もついてきます。 ・一つのラベルの高さを変えると他のラベルもついてきます ・一つのテキストの高さを変えると他のテキストもついてきます ・ボックスの場所を移動するには移動したい位置にドラッグします ・テーブルにフィールドを追加したとき、既定のフィールドの追加から 挿入したい場所にドラッグ ・表全体は左端のラベルボックスの近くの左の十字矢印で捕まえ 左右の移動のみ ・ラベルだけの左端のラベルでフォームヘッダ内で上下移動 ・テキストだけは左端のテキストで詳細内で上下移動 ・同じフォームヘッダ、詳細、フォームフッタのどれかに集めたいときは テキストから縁を切るためラベルを切取り、 集めたい場所に貼付け、テキッストを移動 ---------------------------------------------------------------------------- VBAとはVisual Basic for Applicationsttと呼ぶようにアプリケーションに 特化した言語でAccessVBAはフォームも含む各種ボックス(ラベル、テキスト、コンッボ)のイベントがきっかけで起動します。 VBAの記述画面へ入るには二通りあります。 1.ボックッスのイベントプロパティーでイベントの種類を選ぶ 2.コードの表示ツールから入る 添付図はコードの表示ツールをクリック→左側のプルダウンをクリック したところです。イベント対象の一覧が表示されています。 イベント対象の一つを選んで右側のプルダウンリストが に実行可能なイベントになります。 このイベントの一つをクリックすると Private行とEnd Sub行の2行が表示されます。 この間に命令文を記述します。 3.命令文の記述に入る前に 3-1.演算子 = の意味 数学では A=A+B Bは0以外になく意味のない式になりますが VBAでは 右の式を計算してAの値にすると云うことで普通に使います。 例えば 金額=金額+金額*税率と元の税抜き金額が税込金額に変わります 3-2.コード表示画面のツールオプションから編集タグ内で 変数の宣言を強制するにチェックを入れる 元祖は1970年代後半に開発されたBasicプログラムの仕様が 引き継がれてれているようです。 宣言(DIM)のない変数は暗黙の宣言であるとしていた内容が今も残っている 当初「得意先」開発途中で「得意先名」、「会社名」と入れ替わる バカミスがことがあます。 実行すると別変数として取り扱われ、エラーなしで終了するのですが、 結果はとんでもないことになり 私も体験しました。 Accessをインストールするとこの宣言を強制するにチェックが 外れています。 ☆VBAに戻ります。 納品書登録の主フォーム1行のレコードを入力すると次の行に移り 次のレコード入力になります。 マウスで元の行に戻し、サブフォームをクリックする2回の操作が必要です。 入力の最終フィールド(お客様名)の次はサブフォームに改良します 1.ボックッスのイベントプロパティーでイベントの種類を選ぶやります。 納品書登録フォームをデザインモードで開きます。 →顧客ID→イベントタグ→フォーカス喪失後の右端 →命令文はPrivat subの次の行から記述しますが字下げのため →Tab→半角モードにして→docmd.で次に可能な命令文を表示され →Gotocontrol→ "納品書登録明細サブ" と入力 →コード表示の一番外側で閉じます。 実行して動作を確認下さい docmd.でコマンドツールの全てが可能と確認頂けましたか 詳しくは参考URLをご覧ください ☆仕組み上品番コードは省略できません。 未定又は手入力の品番登録ではだめですか ☆フォームのその他タグのコメントプロパティはお気付ききですか 登録時ここへマウスカーソルを近付けるとツールのように コメントを表示します マニュアルレスのシステムになりませんか https://www.feedsoft.net/access/guide-vba/guide10.html
- chayamati
- ベストアンサー率41% (260/624)
テーブルの設計は完了し、いよいよフォームの設計です。 納品書登録と納品書登録明細サブを単独で作りましたね、 これらのテーブルをリレーションでドッキングすることは触れましたか 自信がないので 納品書登録をデザインモードで開く →納品書登録明細サブをナビゲーションウインドよりフォームフッタへドラッグ →警告メッセージにOK →納品書登録明細サブの枠の高さをドラッグで 画面の半分ぐらいまで伸ばして →納品書登録明細サブの枠外 →納品書登録の書式プロパティーの既定のフォームを帳票フォームに エクセルではデータ入力画面と印刷画面がおなじになりがちですが、 Accessではミス入力を回避しながら、入力効率上げるような工夫をし、 報告書は納品書のように、住所、電話番号等沢山の情報を盛り込みます。 このような理由で登録は単票形式より複数の帳票形式がよろしかと 今回は、データ入力の必要な場所にマウスカーソルが移動る仕組みを フィールドのプロパティーで プロパティーに無い所をVBAで補完すると考えて下さい。 以下はこのシステムに組み込んだ全てです。 納品書登録明細サブコードの表示画面にコピペするだけで、運用可能です ---------------------------------------------------------------------------- Option Compare Database Option Explicit '-------------------------------------- Private Sub T金額_GotFocus() Parent!T金額 = 合計 End Sub '--------以下のように:で区切ると一行に2つの命令文 ------------------------ Private Sub T商品コード_LostFocus() T品番 = M品番: T単価 = M基準単価 End Sub '------------------------------------- Private Sub T数量_BeforeUpdate(Cancel As Integer) T金額 = T数量 * T単価 End Sub '----------------------------------------- Private Sub T単価_BeforeUpdate(Cancel As Integer) T金額 = T数量 * T単価 End Sub '----------------------------------------- ☆納品書登録内 T金額:編集ロックはい データタグ内 明細行の合計が設定される 明細行と整合性が取れないので、修正するときは明細サブで ☆T品番、T単価:タブストップいいえ そのたタブ内 M単位名、M商品コード、M 品番、M基準単価:タブストップいいえ M単位名、M商品コード、M 品番、M基準単価:編集ロックはい
- chayamati
- ベストアンサー率41% (260/624)
>下記部分は、どこかに書き込まないといけないのでしょうか。 ☆フォームを開くときはナビゲーションウィンドから開いていますね これを別のフォームから開くのです。 空のフォーム(メニュー)を新規に作り、 これにラベルボックスを納品書登録を配置します。 この時デザインモードですね、コードの表示ツールでコード編集画面 ここへコピペします。 >また、回答5までで作ったものはそのまま使うのでしょうか。 ☆そのまま使います 最新のテーブルのリレーションシップを添付します フィールド名をチェックして下さい ここに単独のプロフィールと呼ぶテーブル 最終的にはメニューのレコードソースにします。 この件新規にQして頂くと有難いです。 >クエリは使わないということでよろしいのでしょうか。 ☆はい、ただクロス集計クエリを一つ使っていて脱却できていません。 そちらも意味不明なクエリが溜まっているのでは?
- chayamati
- ベストアンサー率41% (260/624)
こんばんは ・顧客マスタ登録作成 フォームデザイン→プロパティー→書式タグ →既定のビューを帳票フォームに→詳細枠の未使用部分をクリック →プロパティ→データタグ→レコードソース右端 →クエリビルダー→顧客マスタ→追加→テーブルを閉じる →ワイルドカード(*)をフィールドにドラッグ →Mフリガナをフィールドに追加→並び替えを昇順に →クエリビルダを閉じる→左端の+をドラッグしてボックスを左へ移動 →ボックス外をクリックして、左端のラベルを上へ移動 →詳細バーを止まるまで上へ →左端のテキストボックスを止まるまで上へドラッグ →フォームフッタバーを止まるまで上へドラッグ品目マスタ →フォームフッタの下の空白の下辺を上へドラッグ フリガナの部分はカーソが止まらないようする →プロパティー→Mフリガナのテキストボックス→その他タグ →タグストップいいえ ・商品マスタ登録 顧客マスタ登録と同じ手順ですの説明を省きます。 ・納品書登録 これは納品書テーブルと顧客テーブルのリレーションで繋がった 2つのテーブルの取り扱いになります。 これもテーブルを2つ配置するだけで他は変わりませんが抽出条件も 加わるかも ワイルドカードを使うのは後日フィールド追加したとき このクエリのステップをはぶく為です。 ・納品書登録明細サブ【ナビゲーションの表示がバラバラにならないためです】 このフォームでは、 (1)商品コードで参照した品番を他のレコードに与えずに修正する (2)金額=数量×単価 (3)明細書の金額の合計計算 (4)金額の合計を納品書に送る これらはVBAの範疇です。 このように納品書登録と納品書登録明細を別々作成して、リレーションシップで つないでサブフォームのあるフォームに仕上げます。 納品書登録明細サブが出来たといって頂ければVBAで済むので助かりますが 次回をお楽しみに。
補足
引き続きご回答いただきありがとうございます。 以下の作業をしました。 ANo.9にありますように >空のフォーム(メニュー)を新規に作り、 これにラベルボックスを納品書登録を配置します。 この時デザインモードですね、コードの表示ツールでコード編集画面 ここへコピペします。 こうして作ったフォーム(フォームAとします)に対して、ANo.8の顧客マスタ登録作成の作業を始めたのですが、 >→クエリビルダを閉じる→左端の+をドラッグしてボックスを左へ移動 この部分で「左端の+」がどこにあるのか全く分かりませんでした。 どこかで間違っているのでしょうか。 クエリビルダで顧客マスタを追加したあとは、ワイルドカードとMフリガナの2つをフィールドにドラッグし、 Mフリガナの並び替えを昇順にしてクエリビルダを閉じればいいんですよね? また、その後の商品マスタ登録も同じフォームAに対して行えばいいのでしょうか。 納品書登録、納品書登録明細サブはフォームAとは別にそれぞれフォームを作成するのでしょうか。 私が初心者のため理解が追い付かず申し訳ありません。
- chayamati
- ベストアンサー率41% (260/624)
今日は >自動入力フォームに手動で入力したい ☆見通しがつきましたので、結果(納品書の登録画面) と仕掛けです。 ・納品書登録と納品書登録明細サブの2つのフォーム ・お客様は倉敷店だけですね メニューフォーム上のお客様名のコンボボックスVBAで絞り込んで開いています ----------納品書テーブルの全レコード----------------------- Private Sub 納品書登録_DblClick(Cancel As Integer) DoCmd.OpenForm "納品書登録" End Sub -----------コンポボックッスの値で絞り込み------------- Private Sub 納品書登録_Change() DoCmd.OpenForm "納品書登録", , , "T顧客ID=forms!メニュー!納品書登録" End Sub ----------------------------------------------------------------------------- ・フィールドの背景の色分け 黄色:VBAの計算 表示後手入力出来る オレンジ:マスタテーブルのフィールドここでは修正不可 ここで修正すると他のレコードも一斉に修正される 無色:入力する。 ☆テーブルに関することはここ迄です。 舌足らず、漏れ等多々あると思います、不明な点はコメント下さい。 ☆クエリの種類 選択クエリ、クロス集計クエリ、テーブル作成クエリ、更新クエリ、 追加クエリ、削除クエリですが テーブルのルックアップが選択クエリーであることにお気付きですね フォーム、レポートも同じように、レコードソースが選択クエリ なので自分は単独のクエリは作ていません ☆フォームのデザイン 前準備として、よく使うツールをクイックアクセスツールバーに配置します。 例えばホームリボンのフォントを右クリック →クイックアクセスツールバーに追加 この要領で次のツールを追加します ・テーブルデザイン、・フォームデザイン・レポートデザイン ・既存のフィールド追加・プロパティシート ・集合形式・表形式・スペースの調整の無・レイアウトの削除 ・サイズの自動調整・高いコントロールに合わせる・低いコントロールに合わせる ・広いコントロールに合わせる・狭いコントロールに合わせる・左右の間隙を均等に ・上下の間隙を均等に・左揃え・右揃え・上揃え・下揃え・枠線の幅 ・コントロール・コンボッボックッス・コードの表示・フォントの色 ・線の色・背景色 これだけ追加すると、1行だけですので画面からはみ出します。 右端クリックから使えますが使用する都度表示が消えます。 クイックアクセスツールバーをリボンの下に表示すると表示幅が ディスプレイの横幅迄広がりますがやはりはみ出します。 我慢できず、ツールの表示順を入れ替えることがあります。 次回 フォームのデザインとVBAです。
補足
ご回答いただきありがとうございます。 せっかくお答えいただいたのに申し訳ございませんが、よく理解できずにいます。 下記部分は、どこかに書き込まないといけないのでしょうか。 また、回答5までで作ったものはそのまま使うのでしょうか。 クエリは使わないということでよろしいのでしょうか。 ----------納品書テーブルの全レコード----------------------- Private Sub 納品書登録_DblClick(Cancel As Integer) DoCmd.OpenForm "納品書登録" End Sub -----------コンポボックッスの値で絞り込み------------- Private Sub 納品書登録_Change() DoCmd.OpenForm "納品書登録", , , "T顧客ID=forms!メニュー!納品書登録" End Sub -----------------------------------------------------------------------------
- 1
- 2
お礼
何度もご回答いただきありがとうございました。 やってみましたがどうしてもできませんでした。せっかく教えていただいたのに理解できず申し訳ございません。 他の方法でやってみようと思います。 貴重なお時間を頂きまして本当にありがとうございました。