質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.87%

  • Access

    376questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Access 一度の登録処理で、複数のレコード登録がしたい。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 193

Yuyuu

score 6

 前提・実現したいこと

Access初心者です。
VBAコードを用いて、一度の登録ボタンで複数のレコードに分けて登録がしたいです。

フォームでの入力欄は、
日付
伝票番号
商品
関連商品1
関連商品2
関連商品3
のようになっています。

関連商品には、各々番号を振っているため、
登録するテーブルのフィールド名を分けたくない状態です。

登録する際も、商品によって
関連商品が1~3種類とばらつきがあるため、
入力がある場所のみの登録がしたいです。

情報が不足していたら申し訳ございません。

 試したこと

.AddNewを使ってみましたが、1件のレコードしか登録できませんでした。

 補足情報(FW/ツールのバージョンなど)

環境
Windows10
Access2016
VBA

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sazi

    2018/05/22 15:54

    そのフォームのレコードソースにテーブルは指定したくないということですか?

    キャンセル

  • Yuyuu

    2018/05/22 15:59

    レコードソースがよくわかっていないため、答えになっているかわからないですが、後にデータを収集したいため、登録するテーブル内に関連商品のフィールドを複数持ちたくない状態です。現在作っているフィールドは「関連商品_ID」と「関連商品_Name」のようなイメージです。

    キャンセル

回答 2

checkベストアンサー

+1

関連商品の個数分、forループなどで.AddNewすればいいのでは?

もう少し丁寧に説明すると、
例えばテーブル構造
のようなテーブル構造を例示する。
もしも、日付、伝票番号を主キーにしたり、あるいはインデックス:「はい(重複なし)」にしてしまうと、
複数レコードを登録することができなくなる。
レコードをユニークに識別するために、ユーザーに入力させない、
オートナンバー型の例えばIDなるフィールドを設けてやると扱いやすい。
そうしないと、関連商品3個から2個に減らしたい、なんていう操作が大変なことになるから。

オートナンバー型のフィールドは、
.AddNewするときに自動で値を作ってくれるから気にしなくてよい。
.AddNewして、.Fields("~") = Me.テキストボックス1.Valueとかやって、
最後.Updateとか書けばいい。

フォームとテーブル
画像の中でテキスト7って書いてる隣のテキストボックスには、
ちゃんと名前:「関連商品1」「関連商品2」「関連商品3」ってなってる。
サンプルコード

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/22 15:39

    またまたご回答いただき、ありがとうございます!
    for文の使い方がいまいちわかっていないのですが、
    .AddNew
    .Fields("日付") =Me!日付
    .Fields("伝票番号") = Me!伝票番号
    ...
    とあったとして、どういう風にループさせていくのでしょうか?

    キャンセル

  • 2018/05/22 16:58

    詳しくありがとうございます!
    ただ、関連商品が2つだった場合に登録するレコードは2つ
    関連商品が1つの場合は登録するレコードは1つにしたいのですが、可能なのでしょうか?

    キャンセル

  • 2018/05/22 17:05

    .AddNew~.Updateを一括りとして、
    その直前に対象のテキストボックスに値が入っているかどうかをチェックすればよいです。
    If Len(Me.Controls("関連商品" & CStr(i)).Value & "") > 0 Then
    とか。テストしてないので自信なし。

    キャンセル

  • 2018/05/22 17:12

    全然理解できてなくて申し訳ございません。
    試してみたところ関連商品0が見つかりませんと7エラーになってしまいました。

    キャンセル

  • 2018/05/22 17:17

    テキストボックスが0,1,2なら
    For i = 0 To 2
    テキストボックスが1,2,3なら
    For i = 1 To 3
    ってことくらいお察しください。

    キャンセル

  • 2018/05/22 17:22

    言葉足らずで申し訳ございません。
    m6uさんのご回答のように、関連商品のテキストボックスは1.2.3
    でコードを書いて作成しました。
    そのコードの中に
    If Len(Me.Controls("関連商品" & CStr(i)).Value & "") > 0 Then
    これを入れたところ、関連商品0が見つかりません。
    という状況です。

    キャンセル

  • 2018/05/22 17:42

    iにゼロが入っているからです。
    iの値をFor文で作ろうとしていますので、
    For i = 1 To 3
    としていることをお察しください。

    キャンセル

  • 2018/05/23 09:04

    ありがとうございます!
    エラーも出ず登録できました。

    理解できるまでご教授頂き、ありがとうございました!

    キャンセル

+1

まずは、テーブル設計をどうしたらよいかを検討しましょう。
データベースでのテーブル設計のキーワードは「正規化」です。
このキーワードでWEB検索して、概要を理解しましょう。

今回の項目をみると、

日付
伝票番号
商品
関連商品1
関連商品2
関連商品3

日付があることから、受注履歴か、売り上げ履歴のようなデータの管理かと思います。

まず、マスターテーブルとトランザクションテーブルに分解しましょう。
一例をあげると、

マスター系
◆商品マスター(※商品CD、商品名、単価、メーカー、・・・・)

トランザクション系
◆受注履歴(※伝票番号、日付、商品CD、・・・)

◆受注関連商品(※受注関連ID(オートナンバー)、伝票番号、商品CD)

あくまで、提示の項目から推測した一例です。

「商品」と「関連商品」は一対多の関係のようですので、テーブルを分けます。
「商品」と「関連商品」は重複する可能性があるとして同じマスターを参照するようにしてます。
まったく別物なら、マスターはそれぞれ別テーブルに分けてもOKです。

一対多の関係のデータの入力フォームはメイン/サブフォーム形式にするといいでしょう。
リレーションシップを設定しておくと、ウィザードで簡単に作成できます。

サブフォームを含むフォーム (一対多のフォーム) を作成する - Access

上記のテーブル設計はあくまで提示されている情報からの推測による一例ですので、
まずは「正規化」についてある程度理解されてから、テーブル設計をしてください。
フォーム設計はテーブル設計がしっかりできてからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/22 17:15

    「正規化」ありがとうございます!
    もう少し勉強してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    VBA form

    お尋ねします。顧客入力formがあります。 顧客入力formがあります(添付ファイル)ヘッダーと詳細が分かれてます。 ヘッダーの顧客IDと登録日がヘッダにあります。ボールドテキ

  • 解決済

    帳票形式サブフォームのレコード数の増加のタイミングについて

    はじめまして。 お世話になります。 帳票形式サブフォームのレコード数の増加のタイミングについてご教授ください。 環境 現在Acceess 2016を使用しています。Access

  • 受付中

    外部のMDBのテーブルと接続するには

    ご質問させて頂きます。 ACCESS2000+ADOです。 バックエンドファイル(テーブルのみ) A.MDBと フロントエンドファイル(フォーム、レポート等) B.MDB

  • 解決済

    VBAを使って複数のデータを決まったフォーマットで印刷したい

    ストレスチェックの回答データをフォーマットに反映させた上で印刷したいのですが VBAを利用するにあたり質問です。 エクセル内容 ・Sheet1:回答データ一覧 (データ

  • 解決済

    VB6によるテーブルのデータ型変更

    VB6でSQL2014とMDBファイルに接続するアプリを修正中です。 SQLサーバーとMDBファイルとは基本的にはほぼ同じ構造で 接続はADOによる接続です。 今回、あるテーブ

  • 解決済

    サイトが更新された際の通知メールの作成について

    サイトが更新されたら、指定したアドレスにWebページが更新されました。というメールが届くようにしたいのですが、どのようにプログラムを書いたら良いですか?  言語はなるべくvbaがい

  • 解決済

    ACCESS VBA

     前提・実現したいこと やりたいことは ACCESSのVBAでメインフォームからサブフォームの新規レコードに移動したい。  発生している問題・エラーメッセージ 実行時エラー '

  • 解決済

    ExcelVBAの勉強法について

    今年で2年目を迎えるプログラマーです。今度仕事でExcelVBAを使って帳票出力するプログラムを作ることになったのですが、なぜかVBAは苦手で、書き方が覚えられません。これまでJa

同じタグがついた質問を見る

  • Access

    376questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。