Access2003でのデータの正規化方法

このQ&Aのポイント
  • エクセルで作った表を1万件近くのデータがあるため、重くなってきました。そこで、アクセスに移行しようと考えています。アクセスではエクセルのフォーマットのままでは扱いにくく、データ正規化が必要です。
  • データの正規化にはvbaを利用したいと考えています。データ量が多いため、vbaを使用することで効率的に正規化を行うことができます。
  • 正規化後のAccessのデータは、商品マスターと原料マスターの2つのテーブルで管理します。商品IDと原料IDを紐付けることで、データの効率的な管理を実現します。
回答を見る
  • ベストアンサー

Access2003 vbaでの正規化

エクセルで作った表を、データが1万件近くなって重くなってきたので アクセスに移行しようと考えています。 エクセルのフォーマットのままではアクセスでは扱いにくいので正規化したいのですが、 データ量が多いのでvbaでできたらなと思います。 【Excel】 商品|原料1│原料2│原料3・・・ ああ│_×_│___│_×_ いい│_×_│_×_│___  【Access】 商品マスターと原料マスターを作っておいて 商品ID|原料ID|× _1_|_1_|× _1_|_2_| _1_|_3_|× _2_|_1_|× _2_|_2_|× _2_|_3_| というようにしたいです。 よろしくお願いします。

noname#157816
noname#157816

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

Excelのシートの先頭行は、質問のように 商品|原料1│原料2│原料3・・・ となっているものとします。先頭行が ああ│_×_│___│_×_ からいきなり始まっている場合はコードを 変更する必要があるのでその場合は補足 してください。 手順を以下に説明します。 (1)テーブルの用意 使用原料: 商品 テキスト型 原料 テキスト型 使用 テキスト型 使用原料一覧: 商品ID 数値型 原料ID 数値型 使用  テキスト型 (2)ExcelのSheetのリンク設定 シートをテーブルとしてリンクします。 以下に方法を記述しています。 http://oshiete1.watch.impress.co.jp/qa6524626.html 途中の設定で、「先頭行をフィールド名として使う」 にチェックをいれます。 (3)標準モジュールに以下を貼り付ける。 DAOを使っているので、コード表のツールから 参照設定を選択して、 Microsoft DAO xx Object Library にチェックを入れて、OKとします。xxは3.6のような数字です。 このとき、 Microsoft ActiveX Data Objects xx Library にチェックが入っていたらはずしてください。 なお、Sheet1はリンクしたExcelのシート名ですが、 シート名が設定してある場合は変更してください。 Sub test() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim fld As Field Dim i As Long Set db = CurrentDb Set rs1 = db.OpenRecordset("Sheet1") Set rs2 = db.OpenRecordset("使用原料", dbOpenDynaset) If rs1.RecordCount > 0 Then rs1.MoveFirst Do Until rs1.EOF For i = 1 To rs1.Fields.Count - 1 rs2.AddNew rs2!商品 = rs1!商品 rs2!原料 = rs1.Fields(i).Name rs2!使用 = rs1.Fields(i).Value rs2.Update Next i rs1.MoveNext Loop End If rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub (4)クエリの設定 以下のSQL文をあたらしいクエリの SQLビューに貼り付け保存してください。 名前は、「Q変換」としておきます。 INSERT INTO 使用原料一覧 ( 商品ID, 原料ID, 使用 ) SELECT 商品マスタ.商品ID, 原料マスタ.原料ID, 使用原料.使用 FROM (使用原料 INNER JOIN 商品マスタ ON 使用原料.商品 = 商品マスタ.商品) INNER JOIN 原料マスタ ON 使用原料.原料 = 原料マスタ.原料; (5)実行手順 新しいフォームにボタンを二つ設定します。 ボタンのクリック以下を設定します。 Private Sub コマンド0_Click() Call test End Sub Private Sub コマンド1_Click() DoCmd.OpenQuery ("Q変換") End Sub 実行はコマンド0、コマンド1の順で行ないます。 コマンド0を実行し、テーブルを確認し、コマンド1 を実行しテーブルを確認してみてください。 以上です。わからないところがあれば補足してください。

noname#157816
質問者

お礼

できました! ご丁寧にどうもありがとうございました。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

商品マスタ、原料マスタを作り、商品別原料詳細の ようなものに、Excelのデータを移植したい、という ことですか。 たとえば、 商品ID|原料ID|使用 _1_|_1_|× _1_|_2_| _1_|_3_|× _2_|_1_|× _2_|_2_|× _2_|_3_| あるいは、 商品ID|原料ID|使用量 _1_|_1_|10 _1_|_2_| _1_|_3_|20 _2_|_1_|50 _2_|_2_|30 _2_|_3_| のようなテーブルを作成したい、 あるいは、フォームやクエリで 表示したい、ということですか。

noname#157816
質問者

補足

説明がわかりにくく、すみません。 商品ID|原料ID|使用 _1_|_1_|× _1_|_2_| _1_|_3_|× _2_|_1_|× _2_|_2_|× _2_|_3_| はい、まさにこういうテーブルが作りたいです。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

もう少し質問内容を丁寧に説明のこと。 自分のようには他人にはわからない。 ーー 商品マスター・・・商品ID、商品名+あと項目は何? 原料マスタ・・・ ID、原料名+あと項目何? 商品と使用原料のリストはつくる? 両ペアーの対で持つ? その方が融通性はあるが、どういう使い方をするかで、固定的かどうかで、ベターかどうか決る。これは 他人には判らない。 ーー VBAでやるなら、こんなところへ聞いても妙案は無い。アイデアを出すだけ。 適当なソート列でソートして、重複を省いてマスタといったファイルを作れば良い。アイデアよりも力仕事。 ーー 質問のAccess側のXはなに? 使うというサイン? Xでやるより _1_|_1_ _1_|_3_ _2_|_1_ _2_|_2_ の方が良くは無いのか? これなら、エクセルから商品と原料ペアーを右端列まで、および最終行まで書き出せば仕舞いでは?。

noname#157816
質問者

補足

うまく説明できないので、整理してからまた質問することにします。 ありがとうございました。

関連するQ&A

  • AccessのVBAの教本を探しています

    VBAはEXCELで結構使うのですが、データ量がEXCELでは処理しきれないので、AccessのVBAでデータ処理をやりたいのですが、基本事項とコマンドを解説した適当な教材を探しています。どなたか紹介いただけないでしょうか。

  • ACCESS テーブルの正規化

    EXCELデータで以下のような正規化されていない項目のデータをACCESSに取り込んで顧客毎に商品の数量を計算するクエリを使用しています。 顧客ID|顧客名|商品名1|商品名2| ・・・・・・・ XXXXX ○○○       2      3  ・・・・・・・ XXXXX ○○○       2      3  ・・・・・・・・ XXXXX ○○○       2      3  ・・・・・・・・ 商品名が可変で追加されたり、削除されたりするのですが、今までは集計の都度クエリを作成していたため問題はありませんでしたが、今回クエリからレポートとフォームを作成するように指示がありました。自分が集計の都度クエリを作成出来ない環境になったため、事前にクエリを組んでフォーム、レポートを作っておきたいのですが、可変な項目名の集計クエリを作成する方法はあるでしょうか? 私のイメージでは 顧客ID|顧客名|商品名 数量 XXXXX ○○○  商品1  2 XXXXX ○○○  商品2  1 XXXXX ○○○  商品3  3 このように正規化出来ればよいと思います。 ACCESSにはテーブルの正規化機能がありますが、操作方法を読んでみるとやはり事前に項目を指定して作成するように読み取れました(間違っているかもしれませんが) 何か良い方法があれば教えてください。 EXCELのVBAは多少書けるのですが、ACCESS VBAはあまり得意ではありません。 自分でメンテナンス出来るように、出来ればクエリで作成したいのですが無理でしょうか? よろしくお願いします。

  • AccessでVBAって何に使えるんでしょうか?

    僕はExcelのVBAで長年仕事してきましたが、AccessでもVBAが使えるのは知っていますが、どんなことに使うのかがイメージ湧きません。 AccessってExcelだとVBAでマクロ組まないとできないような機能をデフォルトで持っているような感じじゃないですか? レポートみたいな画面も出せるし、Excelデータから普通に取り込むこともできるし、これ以上、何を自動化するのかな?と。 求人情報などでたまにAccessのVBAを使える人というのが条件にあったりするんですが、こういった仕事って何ができることを期待してるのでしょうか?

  • 〔VBA・マクロ〕EXCELからACCESSデータをひっぱるには?

    当方のレベルはアクセス初級者(基本的な操作)、 エクセルはごく簡単なVBAをいじる中級者です。 アクセスにて顧客マスター、商品マスターを作成しています。 エクセルで納品書を作成しています。 現状では外部データの取り込みをつかって エクセルシートに顧客データ(シート1)と商品データ(シート2)を 取り込んだ後に、納品書(シート3)でシート1、2に VLOOKUP関数をかけて、納入先と商品情報を 伝票におとしこんでいます。 こんなまどろっこしいことをせずに、 エクセルからアクセスのテーブルへ直接データを取り込む方法は ないものでしょうか? どなたかよろしくお願いいたします。

  • ACCESSのVBAについて

    仕事でACCESSのVBAの知識が必要になった為、勉強しようと考えていますが、オススメの参考書がありましたら、教えて下さい。 今のところ、やりたい事は、CSVデータを取り込んだ後、定型のExcelフォーマットに編集し、出力するというVBAを作りたいです。 プログラミングの知識としては、COBOLやExcelマクロまでの知識はあります。 よろしくお願いいたします。

  • EXCELのVBAを用いたACCESSのデータベース操作の本について

    VBAの初心者です。 EXCELのシート上にあるデータをACCESSのデータベースに蓄積したり、ACCESSのデータベースからEXCELにデータを飛ばして加工したりしたいと考えています。できれば、ACCESSにVBAを記述するのではなく、EXCELにVBAを記述し、データの蓄積などをEXCELから行う方法を勉強したいのです。 自分が本屋で見た限りでは、ACCESSにVBAを記述する方法であれば様々な本が出版されているのですが、EXCELに記述する方法が書いてある本が見当たりません(たくさんあるのかも知れませんが)。皆様お勧めの分本を教えてください。 なお、自宅でEXCEL2000とACCESS2000、会社でEXCEL97とACCESS97を使っていますので、どちらでもいける本がいいです。 よろしくお願いします。

  • Microsoft office access VBAについて

    Access2007を用いて、旅館の客室の在庫管理をしたいのですが、 おおまかなイメージがつかず、手詰まり状態となってしまいました。 商品、商品注文、顧客のマスターを作成し、在庫テーブルを作ってクエリで現在在庫数を  現在在庫数: [総在庫数]-[現在出荷数]  のように表示させました。 各テーブルについては サービスマスター:ID、サービス名、価格 顧客マスター:ID、氏名、住所、電話番号 注文マスター:注文ID、顧客ID、サービス名、注文日、納品日 商品注文マスター:商品注文ID、顧客ID、商品名、注文日、納品日 商品マスター;商品ID,商品名、価格 となっています。 この後は、予約をするとその場で在庫が減る・在庫はマイナスにならないようにしたいのですが どのように行うべきでしょうか。 予約は1度に1件までで、エラーはなしとします。 検索をしたり参考書を参照したところ、VBAを使用するとのことですが、まったくもって知識がないです。ほかの方法かわかりやすい解説のほうをよろしくお願いします。

  • ACCESSとEXCELの連携に関して

    現在マスタの登録業務でEXCELを中心に行っているのですが、件数が10万件を超えておりACCESSに格納しています。 そこで、こちらであらかじめ指定したマスタ名称(キー項目)をEXCEL上に並べておき、ACCESSからその他のマスタ項目を名称の隣にずらりと持ってきたいのですが追加編集を行いたいのですがそんな事可能なのでしょうか?ご教授願いたく。 例>Access マスタ名称 金額 区分 AAAA 100円 原料 BBBB 500円 容器 CCCC 600円 原料 Excel(マスタ名称のみ予め記述しておく) マスタ名称 AAAA←ここに対して金額と区分をACCESSから引っ付けたい CCCC← ※EXCELをACCESSに一度インポートしてクエリ作成する等はしたくないのです。

  • Accessのテーブルデータを一気にVBAで追加したい・・

    Accessのテーブルデータを一気にVBAで追加したい・・ Accessに一時商品登録データというテーブルがあり、 問題なければ商品登録データにデータを流し込みたいと思っています テーブルのデータ構造は全く同じです VBAで一時商品登録のテーブルから一件ずつデータを読み取って 商品登録データに追加することは出来るのですが 一気にデータを追加する方法があれば教えていただけないでしょうか? よろしくお願いいたいます

  • Access2007への移行で動かなく・・・

    よろしくお願いいたします。 Access2000で作成されたVBAのプログラムをAccess2007に移行しました。 そこでEXCELを入力して帳票出力している部分があるのですが、そこでエラーになるようになってしまいました。 ==エラーの部分== SQL = "SELECT * FROM `Sheet1$` IN 'c:\data.xls' 'EXCEL 8.0;'" Me.RecordSource = SQL これで“FROM句の構文エラーです。”と表示されるようになってしまいました。 色々と試してみましたが、どうしてもエラーになってしまいます。 どうか、お助けください。 ちなみにEXCEL 8.0をEXCEL 12.0に変更しても同じでした。

専門家に質問してみよう