• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access2003 vbaでの正規化)

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

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

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

  • ベストアンサー
  • 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/17069)
回答No.1

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

noname#157816
質問者

補足

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

関連するQ&A