重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

エクセルで作った表を、データが1万件近くなって重くなってきたので
アクセスに移行しようと考えています。
エクセルのフォーマットのままではアクセスでは扱いにくいので正規化したいのですが、
データ量が多いのでvbaでできたらなと思います。

【Excel】
商品|原料1│原料2│原料3・・・
ああ│_×_│___│_×_
いい│_×_│_×_│___ 


【Access】
商品マスターと原料マスターを作っておいて

商品ID|原料ID|×
_1_|_1_|×
_1_|_2_|
_1_|_3_|×
_2_|_1_|×
_2_|_2_|×
_2_|_3_|

というようにしたいです。

よろしくお願いします。

A 回答 (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
を実行しテーブルを確認してみてください。

以上です。わからないところがあれば補足してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/03/24 14:48

商品マスタ、原料マスタを作り、商品別原料詳細の


ようなものに、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_|

のようなテーブルを作成したい、
あるいは、フォームやクエリで
表示したい、ということですか。

この回答への補足

説明がわかりにくく、すみません。

商品ID|原料ID|使用
_1_|_1_|×
_1_|_2_|
_1_|_3_|×
_2_|_1_|×
_2_|_2_|×
_2_|_3_|


はい、まさにこういうテーブルが作りたいです。

補足日時:2011/03/23 16:02
    • good
    • 0

もう少し質問内容を丁寧に説明のこと。


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

この回答への補足

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

補足日時:2011/03/23 10:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!