dポイントプレゼントキャンペーン実施中!

8月7日の質問No.8708191「Accessクロス集計で列数が多い場合の処理方法」ですが一部、未解決となります。
ですので、一旦その質問は締切りまして、再度内容を吟味して質問させていただきます。

関連会社から商品情報(十万件以上)に関する複数の「.txt」ファイルを頂きました。
この「.txt」ファイルには、商品に関する情報が記載されており、それぞれが関連し合ったファイルです。

これらを適切に関連を持たせ、最終的にはアップロード用に「.csv」として出力させたい為、内容が横1行に吐き出されるようにしたいです。

初歩的な質問になりますが教えてください。

作業環境はWindows7にExcel2003、Access2003がインストールされていますが、そのどちらも素人程度にしか扱えない状況です。
「.txt」の主情報(商品マスタ)は十万行以上になります。

金銭的なバックアップは見込めませんが、無料ソフトの導入などは問題ないです。
また、私以上に素人がこの処理をするかもしれない場合、どのような方法でアップロード用の情報にするのが良いでしょうか?

※添付画像が削除されました。

A 回答 (37件中11~20件)

>お伝えした.txtの区切りが間違っていたかもしれません。


>タブ区切りとお伝えしましたが実際の私の手元にあるデータはこちらです。
>(タブ区切りでインポートしましたが、問題はなかったです)

>"カテゴリコード","カテゴリ名","親カテゴリ","成分フラグ","階層"
>01化粧品0101

見過ごしていました。
タブ区切りをカンマ区切りに変更するのは大変ですか

TAB区切りの手作業ではできるのですが、
インポート試してみましたがダメでした。

カテゴリコード,カテゴリー名,親カテゴリ,成分フラグ,階層
01,化粧品,01,0,0
を、インポートするとOKですが、これをエキスポートすると

"カテゴリコード","カテゴリー名","親カテゴリ","成分フラグ","階層"
"01","化粧品","01",0,0
となり、これもインポート可能です。

テキスト情報の文頭
----------------------------------------
・カテゴリ
カテゴリコード,カテゴリー名,親カテゴリ,成分フラグ,階層

・カテゴリ関連
成分コード,カテゴリコード

・カテゴリ中継
成分コード,大分類コード,中分類コード,小分類コード

・ブランド
ブランドコード,ブランド名

・メーカ
メーカコード,メーカ名

・商品マスタ
商品番号,商品名,メーカコード,ブランドコード,重要成分コード,販売価格,廃番フラグ,更新日

・成分
成分コード,成分名,成分説明

・成分関連
商品番号,成分コード

・説明
配番,商品番号,項目,項目の説明
-------------------------------------------------

この回答への補足

回答ありがとうございます。

> タブ区切りをカンマ区切りに変更するのは大変ですか
置換で対応してみます。

> を見比べて下さいテーブルの順が逆になっていますね
> Private Sub テーブル初期化RTN() は ∞から1へ
> Private Sub txtインポート_Click() 1から∞へ
なるほど!この事だったのですね!
お手間をかけさせてしまいすみません…

> いっそのこと、リレーションを全て削除して
カンマ区切りを試してみても遅くなさそうですね!
少し目前の仕事が立て込んできましたので、また夜にインポート結果をご報告致しますね。

補足日時:2014/09/19 14:52
    • good
    • 0
この回答へのお礼

こんばんは^^

回答No.25について、ずっと考えてました。

まず、「hoge.txt」と「説明.txt」は同じものです。
先方から頂いたデータをそのまま載せるのはNGかと思い、ファイル名とフィールド名を仮の名前としたものが「hoge.txt」なのです。

> 【説明】と【全説明】フィールド名は全て一致していますね
はい、名前を変えて質問していたただけで、中身は同じものになります。

> 両者の違いはレコード件数です。
申し訳ないのですが、なぜレコード件数が違うのか分からないです。
同じものなのにレコード件数が違う???など考えているのですが、どこを見ればよいのでしょうか。

折角説明していただいているのに、ついていけなくて申し訳ございません。


区切り記号をカンマに変更し、再度インポートを試みたところ、このようなエラーが出ました。

実行時エラー2391
貼り付け先の商品マスタテーブルにはF39フィールドがありません

商品マスタテーブルのフィールドは38種類です。
商品マスタ.txtの項目名も38種類で、フィールド名と項目名は同じになっています。


実行時エラー2391で検索したら色々出てきましたので、明日調べてみようと思います。

お礼日時:2014/09/19 19:11

変なたとえになりますが この無い親はいるが、親の無い子はいない



>> 1:∞ のリレーションのテーブルから∞側 1側の順に初期化する
>申し訳ないのですが、意味がよく理解できませんでした。
VBAのコーディングリストで

Private Sub テーブル初期化_Click()
If MsgBox("全テーブルを初期化します。", vbYesNoCancel) = 6 Then
テーブル初期化RTN
Else
MsgBox ("取り消し")
End If
End Sub
Private Sub テーブル初期化RTN()
DoCmd.SetWarnings True
DoCmd.RunSQL ("delete from カテゴリ ;")
DoCmd.RunSQL ("delete from カテゴリ関連 ;")
DoCmd.RunSQL ("delete from カテゴリ中継 ;")
DoCmd.RunSQL ("delete from 成分 ;")
DoCmd.RunSQL ("delete from 成分関連 ;")
DoCmd.RunSQL ("delete from 説明 ;")
DoCmd.RunSQL ("delete from 全説明 ;")
DoCmd.RunSQL ("delete from 商品マスタ;")
DoCmd.RunSQL ("delete from ブランド ;")
DoCmd.RunSQL ("delete from メーカー ;")
MsgBox ("テーブル初期化完了")
DoCmd.SetWarnings False
End Sub
Private Sub txtインポート_Click()
DoCmd.SetWarnings True 'シングルクォーテーションより右はメモです。 警告表示 True 非表示 False
DoCmd.TransferText acImportDelim, , "メーカー", "D:\okwave\テキスト\メーカー.txt", True
DoCmd.TransferText acImportDelim, , "ブランド", "D:\okwave\テキスト\ブランド.txt", True
DoCmd.TransferText acImportDelim, , "説明", "D:\okwave\テキスト\説明.txt", True
DoCmd.TransferText acImportDelim, , "全説明", "D:\okwave\テキスト\全説明.txt", True
DoCmd.TransferText acImportDelim, , "商品マスタ", "D:\okwave\テキスト\商品マスタ.txt", True
DoCmd.TransferText acImportDelim, , "成分関連", "D:\okwave\テキスト\成分関連.txt", True
DoCmd.TransferText acImportDelim, , "成分", "D:\okwave\テキスト\成分.txt", True
DoCmd.TransferText acImportDelim, , "カテゴリ中継", "D:\okwave\テキスト\カテゴリ中継.txt", True
DoCmd.RunSQL ("INSERT into カテゴリ関連(成分コード,カテゴリコード) select 成分コード,大分類コード&中分類コード&小分類コード from カテゴリ中継 ; ")
DoCmd.TransferText acImportDelim, , "カテゴリ", "D:\okwave\テキスト\カテゴリ.txt", True
DoCmd.SetWarnings True
MsgBox ("txtファイルインポート完了")
End Sub

を見比べて下さいテーブルの順が逆になっていますね
Private Sub テーブル初期化RTN() は ∞から1へ
Private Sub txtインポート_Click() 1から∞へ

わーまた大変なミスをしたようです。
次を
Private Sub テーブル初期化RTN()

の前に挿入して下さい
これでテーブル毎にワーニングが出て、「いいえ」「デバッグ」で対象の行が表示され
テーブル名と初期化の判断が出来ます
'----------------------------------------------------------------------
Private Sub テーブル初期化_Click()
If MsgBox("全テーブルを初期化します。", vbYesNoCancel) = 6 Then
テーブル初期化RTN
Else
MsgBox ("取り消し")
End If
End Sub
Private Sub テーブル初期化RTN()
'-------------------------------------------------------------------------
VBAを差し替え、以下の順で再度インポートを行ってみましたが、また同じようにエラーとなってしまいました…

【テーブル初期化】→【TXTファイルエキスポート】→【リレーションの再設定】→【先方データをD:OKWAVE\テキストのファイルにコピペ】→【TXTファイルインポート】

どこに原因がありそうか、少しずつファイルをいじっては試してるのですが…原因がつかめず仕舞いです。
------------------------------------------------------------------------
いっそのこと、リレーションを全て削除して
【テーブル初期化】→【TXTファイルインポート】 を繰り返しやってみますか
これだと、単独の処理出でチェックでき、テーブルとテキストの項目名の整合性が確認でき、
リレーションの再定義で総合チェックとなります
    • good
    • 0

こんにちは。


どおでもよいのですが、朝の挨拶はおはよう、おはようございますを
使い分けますが、昼夜の挨拶は一つしかなく
今もですが、特にサラリーマン時代に躊躇しています。
----------------------------------------------------
商品番号と商品コードの続きですが
各テーブルのフィールド名も商品番号に統一して下さい
---------------------------------------
最初の質問の抜粋です
【「hoge.txt」だけを別途Accessへインポートした際の現状】

商品番号,配番,項目,項目の説明
A11111,1,商品説明,○○○○
A11111,30,使用上の注意,△△△
A11111,50,成分,□□□□
F22222,1,商品説明,◆◆◆
F22222,2,含有成分,▼▼▼▼

インポート先ののテーブル名を仮に【全説明】します。

【説明】と【全説明】フィールド名は全て一致していますね

・説明
配番,商品番号,項目,項目の説明

両者の違いはレコード件数です。
考えられるのは【全説明】
1.ある条件で抽出したもの
  抽出条件となる項目は【商品マスタ】内のフィールドの
  ・メーカー ・ブランド ・重要成分・更新日
  ・配番フラグ とこれらの組合せ

2.抽出用テーブル
・【カテゴリ中継 】 リレーションの見直しが必要
・【商品番号抽出】テーブル追加
  ID(主キー オートナンバー型)
  商品番号(テキスト型 主キーにすると変更が効かない))

更新日を抽出条件とする時の【クエリ:商品マスタ-全説明】を添付します
フィールドへドラックする項目は【商品マスタ】の更新日と
【全説明】の全てです
更新日の抽出条件行には
>=[forms]![メニュー]![開始日] And <=[forms]![メニュー]![終了日]
とします。
抽出条件行は表示行の次から複数行あります
同一行は AND条件になり、行が異なればOR条件になります。

参考URL:http://okwave.jp/qa/q8708191_6.html#answer
「関連がある複数のテキストファイルの扱い方」の回答画像25

この回答への補足

回答ありがとうございます。

確かに「こんにちは」や「こんばんは」には丁寧語に当たる言い換えがなく使うのに気が引ける場面がありますよね…
私も気になって調べた事があります。

私の場合ですが…それが現代になって省略した言葉と知ってからは、丁寧語になる要素がないと割り切り積極的に使っています^^
挨拶やお礼の言葉に何度も助けられた経験がある為、挨拶に悩むぐらいなら使ってしまえ~という結論です。

おっと、話がそれました!
今回も残念ながらインポートエラーとなってしまいました。

> インストールするテキストデータの先頭行に項目名があること
私の方でも、ご提示いただきました内容と同じように、1行目に項目名だけとなっております。
但し先方から頂いてるデータに合わせておりますので、項目名が多いテキストデータなどはあります。

> テキスト情報の全ての項目名とデータ形式が一致するフィールド存在する
先方から頂いているデータを元に、テーブルの方もフィールドの追加・データ形式共に修正済みです。

> 1:∞ のリレーションのテーブルへは1側 ∞側の順にインストールする
これは1側から∞側に向かってリレーションの線?をドラックする事でしょうか?

> 1:∞ のリレーションのテーブルから∞側 1側の順に初期化する
申し訳ないのですが、意味がよく理解できませんでした。

VBAを差し替え、以下の順で再度インポートを行ってみましたが、また同じようにエラーとなってしまいました…

【テーブル初期化】→【TXTファイルエキスポート】→【リレーションの再設定】→【先方データをD:OKWAVE\テキストのファイルにコピペ】→【TXTファイルインポート】


どこに原因がありそうか、少しずつファイルをいじっては試してるのですが…原因がつかめず仕舞いです。

補足日時:2014/09/18 18:56
    • good
    • 0

商品コードと商品番号を混同していたためこちらでもとらぶっていました。


商品番号に統一しました。

インポート、エキスポートについて整理してみましょう

インポートするには
・インストールするテキストデータの先頭行に項目名があること

・テキスト情報の全ての項目名とデータ形式が一致するフィールド存在する
  テーブルのフィールドを追加する
・ 1:∞ のリレーションのテーブルへは1側 ∞側の順にインストールする


テーブルを初期化するには
・ 1:∞ のリレーションのテーブルから∞側 1側の順に初期化する

こちらでは、下記のようにテキストファイルに保管しています
----------------------------------------
TXT⇔ACCESS一覧.TXT
・カテゴリ
"カテゴリコード","カテゴリー名","親カテゴリ","成分フラグ","階層"

・カテゴリ関連
"成分コード","カテゴリコード"

・カテゴリ中継
"成分コード","大分類コード","中分類コード","小分類コード"

・ブランド
"ブランドコード","ブランド名"

・メーカ
"メーカコード","メーカ名"

・商品マスタ
"商品番号","商品名","メーカコード","ブランドコード","重要成分コード","販売価格","廃番フラグ","更新日"

・成分
"成分コード","成分名","成分説明"

・成分関連
"商品番号","成分コード"

・説明
"配番","商品番号","項目","項目の説明"
---------------------------------------------
インポート、エキスポート関連のコーディングリストです。
この部分差し替えて下さい
'-----------------------------------------------------------
Private Sub テーブル初期化RTN()
DoCmd.SetWarnings True
DoCmd.RunSQL ("delete from カテゴリ ;")
DoCmd.RunSQL ("delete from カテゴリ関連 ;")
DoCmd.RunSQL ("delete from カテゴリ中継 ;")
DoCmd.RunSQL ("delete from 成分 ;")
DoCmd.RunSQL ("delete from 成分関連 ;")
DoCmd.RunSQL ("delete from 説明 ;")
DoCmd.RunSQL ("delete from hoge ;")
DoCmd.RunSQL ("delete from 商品マスタ;")
DoCmd.RunSQL ("delete from ブランド ;")
DoCmd.RunSQL ("delete from メーカー ;")
MsgBox ("テーブル初期化完了")
DoCmd.SetWarnings False
End Sub
Private Sub txtインポート_Click()
DoCmd.SetWarnings True 'シングルクォーテーションより右はメモです。 警告表示 True 非表示 False
DoCmd.TransferText acImportDelim, , "メーカー", "D:\okwave\テキスト\メーカー.txt", True
DoCmd.TransferText acImportDelim, , "ブランド", "D:\okwave\テキスト\ブランド.txt", True
DoCmd.TransferText acImportDelim, , "商品マスタ", "D:\okwave\テキスト\商品マスタ.txt", True
DoCmd.TransferText acImportDelim, , "説明", "D:\okwave\テキスト\説明.txt", True
DoCmd.TransferText acImportDelim, , "成分関連", "D:\okwave\テキスト\成分関連.txt", True
DoCmd.TransferText acImportDelim, , "成分", "D:\okwave\テキスト\成分.txt", True
DoCmd.TransferText acImportDelim, , "カテゴリ中継", "D:\okwave\テキスト\カテゴリ中継.txt", True
DoCmd.RunSQL ("INSERT into カテゴリ関連(成分コード,カテゴリコード) select 成分コード,大分類コード&中分類コード&小分類コード from カテゴリ中継 ; ")
DoCmd.TransferText acImportDelim, , "カテゴリ", "D:\okwave\テキスト\カテゴリ.txt", True
DoCmd.SetWarnings True
MsgBox ("txtファイルインポート完了")
End Sub
Private Sub txtファイルエキスポート_Click()
DoCmd.TransferText acExportDelim, , "カテゴリ", "D:\okwave\テキスト\カテゴリ.txt", True
DoCmd.TransferText acExportDelim, , "カテゴリ関連", "D:\okwave\テキスト\カテゴリ関連.txt", True
DoCmd.TransferText acExportDelim, , "カテゴリ中継", "D:\okwave\テキスト\カテゴリ中継.txt", True
DoCmd.TransferText acExportDelim, , "ブランド", "D:\okwave\テキスト\ブランド.txt", True
DoCmd.TransferText acExportDelim, , "メーカー", "D:\okwave\テキスト\メーカー.txt", True
DoCmd.TransferText acExportDelim, , "商品マスタ", "D:\okwave\テキスト\商品マスタ.txt", True
DoCmd.TransferText acExportDelim, , "成分", "D:\okwave\テキスト\成分.txt", True
DoCmd.TransferText acExportDelim, , "成分関連", "D:\okwave\テキスト\成分関連.txt", True
DoCmd.TransferText acExportDelim, , "説明", "D:\okwave\テキスト\説明.txt", True
MsgBox ("D:\okwave\テキストに新規作成しました")
End Sub
「関連がある複数のテキストファイルの扱い方」の回答画像24
    • good
    • 0

hogeの正体が見えたような


確認したいことがあります。
説明テーブルの配分はユニークですか テーブルデザインビューで
配分のインデックスを ハイ(重複なし)にすることができますか?

この回答への補足

回答ありがとうございます。

Access高価ですよね~。
オークションなども見てみましたが、偽物を購入してしまうのも怖いので今は様子見です^^;

さて、回答No.21のVBAの設定が終了し、メニューから正常に動く事まで確認しました。
インポートする前にD:OKWAVE\テキストのファイル内を一度フィールドのみに修正しますので、インポート結果はまた後ほどご報告します!

> 配分のインデックスを ハイ(重複なし)にすることができますか?
できなかったです。原因として考えられますのは、
この内容は商品説明なのですが、サイズ違いの商品(商品コードは別)も扱っている為、同じ説明が入っている事が原因ではないかと思います。

補足日時:2014/09/17 17:13
    • good
    • 0
この回答へのお礼

こんばんは^^

再度インポートを試みました。
8点の.txtデータ全てインポートするのに1分未満の時間で終了しましたが、前回(回答No.18の補足)と同じエラーが出ました。


以下のURLの一番下から2番目の画像を見て思ったのですが、お伝えした.txtの区切りが間違っていたかもしれません。
タブ区切りとお伝えしましたが実際の私の手元にあるデータはこちらです。
(タブ区切りでインポートしましたが、問題はなかったです)

"カテゴリコード","カテゴリ名","親カテゴリ","成分フラグ","階層"
01化粧品0101

URL中の画像では、chayamatiさんが記述くださったものと同じ形のVBAが正常にインポートできた時のCSVファイルの内容が、カンマ区切りのダブルクォーテーションでくくっていますので、そこが鍵かなと思っています。
見当違いでしたら申し訳ございません。

http://www.feedsoft.net/access/tips/tips93.html


データ件数はテキストデータそれぞれの件数をお伝えすればよいでしょうか?

> HOGEは1商品1レコードと繋げるのではなく、主テーブルとサブテーブルに分解した方が扱いやすいのでは
主テーブルとサブテーブルの関係性がよくわかっていないのですが、
最終的に関連付けられたデータを、支給されたアップロード用CSVファイルの形式に、必要な項目を流し込みたいのです。
複雑な構造のAccessを扱った事がない為、内容を横1行にしたいと考えておりました。
(普段はダウンロードしたCSVの必要項目だけ選択クエリで抽出して修正する為に利用するので、商品番号に対して横1列のデータという事が多いのです。)

質問した当初は横1列にする事しか頭になかったのですが、そうすると下記のような事ができない事に気付いてしまいました…

▼以下のものはアップロード用CSVの商品説明という項目に全て流し込みたい内容です(長文含む)
説明.txtの「項目の説明」←hoge.txtの事です
成分.txtの「成分説明」
商品マスタ.txtの「原材料」「サイズ」

これら3つを流し込む事自体は&を使用してなんとかなりそうなのですが(http://office.microsoft.com/ja-jp/access-help/HA …これらを合計すると文字数が多い(全角5000文字程度には収まる内容と推測します)事と、説明.txtの「項目の説明」が1商品に対して複数の内容がある(縦に展開されている為)事でうまくいかないのでは?と、どうすればいいのか悩んでいます。

質問に質問で答えてしまい申し訳ないのですが、このような場合も主テーブルとサブテーブルに分解する事で扱いやすくなりますでしょうか?

※現在思いつくのはCSVのアップロードを分ける方法です。
説明の項目だけのCSVと、その他の情報の項目を持つCSVを分けるのですが、その他の情報は選択クエリで割りと簡単に収集できます。
説明.txtは横一列にする方法が以前の質問でわかりましたので、これだけ別にCSVを作り、内容を1つのセルにまとめる加工をし、アップロードすれば手間はかかるが問題はない、と言ったところなのです^^;

お礼日時:2014/09/17 19:53

> 2-3.商品登録フォーム作成


> 2-4.長文のメモ型フィールドのある説明登録フォーム作成
> ⇒【読み込まれたフォーム左の+】
+をクリックしても展開しない為に直接、式ボックスに「>=Forms![メニュー]![商品名検索]」とし、画面を閉じました。
商品登録フォームを開くと、「パラメータの入力」という小窓が出現します。
  この小窓は正しく動作していることになります。

> 2-5.説明登録を商品登録のサブホームとする
  お考えの通りです。画面の行数を多くするためです。ボックスのプロパティーのその他タグに縦書き設定もあります。
  限られた画面の中で メインフォームの行数、サブフォームの行数、長文の項目の説明の高さの配分にになります。
  ※ 項目の説明の説明等長文のフィールドはメモ型に !!!
  ※ テキスト型ではインポートの時無警告で255文字で切り捨てられます

回答No.20での設定がキチンとできれば、添付いただいた画像のように「メーカー登録/成分登録/カテゴリ登録/ブランド登録/成分登録/カテゴリ登録/商品登録/説明登録」ボタンが自動的に作成されるものでしょうか?
  全く自動とは言えませんが、メニュー画面に配置するラベルボックスの名前が合っていても、ダメな時があります。
  ダメなときは、ボックスのイベントを起動するとうまくできます。
  ボックス名が誤っていれば,Private Sub( )と End Subだけが作成されます。これ は即削除して下さい。
  元データはテキストデータで登録の必要が無いので、●●●参照とした方が良いかもしれませんね
  フォームのデータタブに追加、変更、削除のはい(規定値)いいえ の設定が出来ます。

  また、レポートを作成しなくとも。テーブル、フォームをファイルツールから印刷も可能です。

それとも先にコマンドボタンを作成してから回答No.20での設定にとりかかるべきだったのでしょうか?
コマンドボタンは作らないでください。多分ですが、コマンドボタンと同名のラベルボックスと差し替えるだけでよろしいかと

PS.だんだん楽しくなってきたのに、休日でAccessが触れないのはとてももどかしいです。
いっそ購入しようかと検索してみたら…型落ち単体でも思った以上に高価でガッカリした休日を過ごしました^^;
  気持ちわかります。自分が買った時は4万円近くでした。子供の学生所でエコノミーパックで半額以下の1万円台でしたが

こんなに親身に回答をくださっているのにお返事できず申し訳ありませんでした。
  分からないところは調べてからの回答になりますが、楽しい時間です。一週間が早いですね

  今【「hoge.txt」のテーブルを他のテーブル情報から作れるかと試しています。
  これが出来れば 商品マスタに?フィールドを追加等で対策があるかも
  HOGEは1商品1レコードと繋げるのではなく、主テーブルとサブテーブルに分解した方が扱いやすいのでは
  これをテーブルの正規化言います。 正規化ツールはツールバーにあります。
「関連がある複数のテキストファイルの扱い方」の回答画像22
    • good
    • 0

メニューフォーム内のコードです。


--------------------------------------------------------------------------------------
Option Explicit
Private Sub Form_Load()
基準日 = Date
基準日変更RTN
開始日 = 月初日: 終了日 = 月末日
End Sub
Private Sub 基準日_BeforeUpdate(Cancel As Integer)
基準日変更RTN
End Sub
Private Sub 基準日変更RTN()
月初日 = 基準日 - Day(基準日) + 1
月末日 = 月初日 + 31: 月末日 = 月末日 - Day(月末日)
End Sub
Private Sub 前日_Click()
基準日 = 基準日 - 1
基準日変更RTN
End Sub
Private Sub 翌日_Click()
基準日 = 基準日 + 1
基準日変更RTN
End Sub
Private Sub 終了_Click()
DoCmd.Quit
End Sub
Private Sub メーカ登録_Click()
DoCmd.OpenForm "メーカ登録"
End Sub
Private Sub ブランド登録_Click()
DoCmd.OpenForm "ブランド登録"
End Sub
Private Sub 商品登録_Click()
DoCmd.OpenForm "商品登録"
End Sub
Private Sub 説明登録_Click()
DoCmd.OpenForm "説明登録"
End Sub
Private Sub 成分登録_Click()
DoCmd.OpenForm "成分登録"
End Sub
Private Sub 成分関連登録_Click()
DoCmd.OpenForm "成分関連登録"
End Sub
Private Sub カテゴリ登録_Click()
DoCmd.OpenForm "カテゴリ登録"
End Sub
Private Sub カテゴリ関連登録_Click()
DoCmd.OpenForm "カテゴリ関連登録"
End Sub
Private Sub テーブル初期化_Click()
DoCmd.SetWarnings True
If MsgBox("全テーブルを初期化します。", vbYesNoCancel) = 6 Then
DoCmd.RunSQL ("delete from カテゴリ ;")
DoCmd.RunSQL ("delete from カテゴリ関連 ;")
DoCmd.RunSQL ("delete from カテゴリ中継 ;")
DoCmd.RunSQL ("delete from 成分 ;")
DoCmd.RunSQL ("delete from 成分関連 ;")
DoCmd.RunSQL ("delete from 説明 ;")
DoCmd.RunSQL ("delete from 商品マスタ;")
DoCmd.RunSQL ("delete from ブランド ;")
DoCmd.RunSQL ("delete from メーカー ;")
MsgBox ("テーブル初期化完了")
Else
MsgBox ("取り消し")
End If
DoCmd.SetWarnings False
End Sub
Private Sub txtインポート_Click()
DoCmd.SetWarnings True 'シングルクォーテーションより右はメモです。 警告表示 True 非表示 False
DoCmd.TransferText acImportDelim, , "メーカー", "D:\okwave\テキスト\メーカー.txt", True
DoCmd.TransferText acImportDelim, , "ブランド", "D:\okwave\テキスト\ブランド.txt", True
DoCmd.TransferText acImportDelim, , "商品マスタ", "D:\okwave\テキスト\商品マスタ.txt", True
DoCmd.TransferText acImportDelim, , "説明", "D:\okwave\テキスト\説明.txt", True
DoCmd.TransferText acImportDelim, , "成分関連", "D:\okwave\テキスト\成分関連.txt", True
DoCmd.TransferText acImportDelim, , "成分", "D:\okwave\テキスト\成分.txt", True
DoCmd.TransferText acImportDelim, , "カテゴリ中継", "D:\okwave\テキスト\カテゴリ中継.txt", True
DoCmd.RunSQL ("INSERT into カテゴリ関連(成分コード,カテゴリコード) select 成分コード,大分類コード&中分類コード&小分類コード from カテゴリ中継 ; ")
DoCmd.TransferText acImportDelim, , "カテゴリ", "D:\okwave\テキスト\カテゴリ.txt", True
DoCmd.SetWarnings True
MsgBox ("txtファイルインポート完了")
End Sub
Private Sub txtファイルエキスポート_Click()
DoCmd.TransferText acExportDelim, , "カテゴリ", "D:\okwave\テキスト\カテゴリ.txt", True
DoCmd.TransferText acExportDelim, , "カテゴリ関連", "D:\okwave\テキスト\カテゴリ関連.txt", True
DoCmd.TransferText acExportDelim, , "カテゴリ中継", "D:\okwave\テキスト\カテゴリ中継.txt", True
DoCmd.TransferText acExportDelim, , "ブランド", "D:\okwave\テキスト\ブランド.txt", True
DoCmd.TransferText acExportDelim, , "メーカー", "D:\okwave\テキスト\メーカー.txt", True
DoCmd.TransferText acExportDelim, , "商品マスタ", "D:\okwave\テキスト\商品マスタ.txt", True
DoCmd.TransferText acExportDelim, , "成分", "D:\okwave\テキスト\成分.txt", True
DoCmd.TransferText acExportDelim, , "成分関連", "D:\okwave\テキスト\成分関連.txt", True
DoCmd.TransferText acExportDelim, , "説明", "D:\okwave\テキスト\説明.txt", True
MsgBox ("D:\okwave\テキストに新規作成しました")

この回答への補足

お返事が遅くなりまして申し訳ございません。

> 大量のテキストデータですね、どれ位の時間が係りますか、進行状況の表示が必要かどうかの判断をしたいです。
エラー表示が出る度に「はい」としてインポートを進めたのですが、それぞれのテーブルが1分未満です。

> 2-3.商品登録フォーム作成
> 2-4.長文のメモ型フィールドのある説明登録フォーム作成
> ⇒【読み込まれたフォーム左の+】
+をクリックしても展開しない為に直接、式ボックスに「>=Forms![メニュー]![商品名検索]」とし、画面を閉じました。
商品登録フォームを開くと、「パラメータの入力」という小窓が出現します。

> 2-5.説明登録を商品登録のサブホームとする
> ⇒【ホームヘッダー内を項目見出しのみとして】
これは目的のもの以外削除するという意味でしょうか?
また、項目見出しというのは以下で言う「項目」を指しているのでしょうか?(ずれて表示されたらすいません)
だとしたら、↓このようにすればよいでしょうか?

フォーム ヘッダー
___
│項目│
 ̄ ̄ ̄
詳細
______ ___ ___
│商品コード││配番││項目│
 ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄  ̄ ̄ ̄
フォーム フッター
______
│項目の説明│
 ̄ ̄ ̄ ̄ ̄ ̄
│項目の説明│
│     │
│     │
 ̄ ̄ ̄ ̄ ̄ ̄

> 差し障りなければ、データ件数とインポート時間、エクスポート時間を補足頂けませんませんか
上記でつまづいてしまった為、回答No.21に記述いただいたVBAを作動させておりません。
設定後またご報告させていただきますね!

また現在のメニュー上にはこれら↓の表示しかありません。
「基準日/月初日/月末日/開始日/終了日/商品名検索/TXTファイルインポート/TXTファイルエキスポート/テーブル初期化/商品登録」

回答No.20での設定がキチンとできれば、添付いただいた画像のように「メーカー登録/成分登録/カテゴリ登録/ブランド登録/成分登録/カテゴリ登録/商品登録/説明登録」ボタンが自動的に作成されるものでしょうか?
それとも先にコマンドボタンを作成してから回答No.20での設定にとりかかるべきだったのでしょうか?


PS.だんだん楽しくなってきたのに、休日でAccessが触れないのはとてももどかしいです。
いっそ購入しようかと検索してみたら…型落ち単体でも思った以上に高価でガッカリした休日を過ごしました^^;
こんなに親身に回答をくださっているのにお返事できず申し訳ありませんでした。

補足日時:2014/09/16 18:33
    • good
    • 0

回答No.19のフォーム作成で作成に誤りがありました。


フォームはこちらで作成して下さい。

情報の全てはテキストデータですから登録用のフォームは必要ないと思いますが
テキストデータのインストール後のテーブル内容を参照するためです。
登録用:データの追加、更新、削除が可能
参照用:データの追加、更新、削除が不可能
フォームのプロパティーのデータタグに追加の許可、削除の許可、更新の許可の項目があります。
ここを変更することで、登録用にも参照用にもなりますが、フォームの規定値が登録用になっています。

1.フォームを開くボックスに絞り込み検索機能を付けるための商品名検索ボックスを配置
2-1. コンボボックス用のクエリ作成
【メニュー画面で空白部分を右クリック】⇒【デザインビュー】⇒【テキストボックス】⇒【メニュー画面】
⇒【次へ】⇒【次へ】⇒【商品名検索】⇒【OK】⇒【商品名検索を右クリック】⇒【コントロール種類の変更】
⇒【コンボボックッス】⇒【商品名検索右クリック】⇒【プロパティー】⇒【データータグ】
⇒【値集合ソースの右端の…】⇒【商品マスタ】⇒【追加】⇒【閉じる】
⇒【商品名をフィールドへドラッグ】⇒【並び替え昇順】
⇒【抽出条件に Forms!メニュー!商品名検索 と入力】⇒【クエリを閉める】⇒【はい】

2.フォームの作成
2-1.各テーブル毎にフォームを作成
2-2.フォームは全て表形式
  フォーム名をテーブル名に "登録" を付加して、例えば "説明登録"
2-3.商品登録フォーム作成
【フォームウィザード起動】⇒【商品マスタ】⇒【全て選択移動】⇒【次へ】⇒【表形式】
⇒【次へ】⇒【商品登録と入力】⇒【フォームのデザインを編集する】⇒【完了】
⇒【データタグ】⇒【レコードソースの右端の…】⇒【全ての項目をフィールドに移動】
⇒【はい】⇒【商品名の並び換え行を昇順】⇒【商品名の検索行の右端を右クリック】
⇒【ビルド】⇒【式の要素のaccess印の左の+】⇒【Formsの左の+】
⇒【読み込まれたフォーム左の+】⇒【メニュー】⇒【式のカテゴリのの商品名検索】
⇒【式の値の値をダブルクリック】
⇒【上枠の Forms![メニュー]![商品名検索] 左端に >= と入力】⇒【OK】
⇒【クエリビルダを閉じる】⇒【はい】⇒【デザイン画面を閉じる】⇒【はい】

2-4.長文のメモ型フィールドのある説明登録フォーム作成
手順は商品登録と同じだが途中長文のフィールドの処理とテーブル内にない商品名の追加が入る
【フォームウィザード起動】⇒【説明】⇒【全て選択移動】⇒【次へ】⇒【表形式】
⇒【次へ】⇒【説明登録と入力】⇒【フォームのデザインを編集する】⇒【完了】
⇒【項目の説明をフォームフッタへ移動し左右に拡げる】
⇒【この見出しラベルもここへ移動しテキストボックスとに並べる】
⇒【見出しラベルを縦書きにしてテキストボックスの左に配置するにはその他タグの縦書きを はい】
⇒【データタグ】⇒【レコードソースの右端の…】⇒【はい】⇒【全ての項目をフィールドに移動】
⇒【説明の項目名のある枠で右クリック】⇒【商品マスタ】⇒【追加】⇒【閉じる】
⇒【二つのテーブルが ∞:1 出つながっていることを確認】⇒【商品名を下のフィールドに移動】
⇒【商品名の並び換え行を昇順】⇒【商品名の検索行の右端を右クリック】
⇒【ビルド】⇒【式の要素のaccess印の左の+】⇒【Formsの左の+】
⇒【読み込まれたフォーム左の+】⇒【メニュー】⇒【式のカテゴリのの商品名検索】
⇒【式の値の値をダブルクリック】
⇒【上枠の Forms![メニュー]![商品名検索] 左端に >= と入力】⇒【OK】
⇒【クエリビルダを閉じる】⇒【はい】⇒【デザイン画面を閉じる】⇒【はい】

2-5.説明登録を商品登録のサブホームとする
※サブフォーム/サブレポートツールは隠れています。デザインモードのメニューバー中央付近の▼より見つけて下さい。
【左のナビゲーションウィンドで説明登録をコピペしてフォーム名を説明サブとする】
⇒【説明サブ を右クリック】⇒【デザインビュー】⇒【ホームヘッダー内を項目見出しのみとして】
⇒【ホームヘッダーを項目見出しの高さに縮小する】⇒【編集画面を閉じる】⇒【はい】
⇒【商品登録を右クリック】⇒【デザインビュー】⇒【サブフォーム/サブレポートツール】
⇒【フォームフッター】⇒【はい (単票に変更する)】⇒【説明サブ】⇒【次へ】
⇒【独自に設定】⇒【商品コード(メインフォーム)】⇒【商品コード(サブフォーム)】
⇒【商品登録説明サブ】⇒【デザインビューを閉じる】⇒【はい】

最初の目的であるデータの横並びににはお答えできなくて心苦しいですが
自分のお伝えできることはここまでです。

テキストデータが無いので十分な動作チェックは出来ませんが、
BVAを添えます、

VBA文中
DoCmd.SetWarnings True
という文がありますが、処理途中の警告を有効にして処理が一時停止して
警告時のコードをひょうじします。
ここでF8押下するとプログラムは一つづつ進みF5押下継続して通常に戻ります。、

エラー修正が終り、実用に移るとこの警告が煩わしくなります。
実用に移るときは
DoCmd.SetWarnings False
とし、処理途中の警告を無効にします。

Private Sub 終了_Click()
DoCmd.Quit
End Sub

はシステムを終るときのものですが右肩の閉じるボタンが不要とはおもいますが

また各フォームにも、閉じるボタンをラベルで配置しクリックで

テキストデータは1回切りならば

Private Sub テーブル初期化_Click() を Private Sub テーブル初期化RTN()

テキストインポートの最初に初期化をを実行するようにするとよいでしょう

Private Sub txtインポート_Click()
テーブル初期化RTN
DoCmd.SetWarnings True 'シングルクォーテーションより右はメモです。 警告表示 True 非表示 False
DoCmd.TransferText acImportDelim, , "メーカー", "D:\okwave\テキスト\メーカー.txt", True
DoCmd.TransferText acImportDelim, , "ブランド", "D:\okwave\テキスト\ブランド.txt", True
DoCmd.TransferText acImportDelim, , "商品マスタ", "D:\okwave\テキスト\商品マスタ.txt", True
以下略


Private Sub 閉じる_Click()
DoCmd.Close
End Sub

でフォームが閉じます。
テーブルのルックアップ、コンボボックスのリスト行数はコそれぞれののプロパティーに設定項目があります。
大量のデータを扱ったことがありません。
差し障りなければ、データ件数とインポート時間、エクスポート時間を補足頂けませんませんか

ミスが多発する回答でしたが、よく付き合って下さいいましてありがとうございます。

--------------------------------------------------------------------------------------
文字数オーバです。
VBAは次に回答します。
「関連がある複数のテキストファイルの扱い方」の回答画像20
    • good
    • 0

>その後インポートが進んだものの、以下のエラー画面が現れました。


大量のテキストデータですね、どれ位の時間が係りますか、進行状況の表示が必要かどうかの判断をしたいです。

この対処法は整理して後程回答します。

インストール後のテーブル内容を確認するためです。
各テーブルのフォームを作成して、これを開くためのコマンドボタンをメニューフォーム上に配置してください。
フォームは全て表形式で、フォーム名をテーブル名に "登録" を付けて、例えば "商品マスタ登録" として下さい。
    • good
    • 0

>恐らくですが、VBAの最後尾のEnd Subが足りなかったようなので、付け加え7まで順調に進みました。


 End Subで正解です。またミスですね、ゴメン

>7.の「但し成分関連.TXTは 成分中継へコピペ」は、カテゴリの事だと思いましたので
  カテゴリ関連.txtをカテゴリ中継へコピペしました。
  ここでもミスですね

>D:\okwave\テキスト\テキストカテゴリ関連.txtには、何も貼り付けない状態でよいのでしょうか?
  これも他のテキストと茂名滋養に項目名は付け加えて下さい。

>そしてまた8.の【TXTファイルインポート】で何も起こりませんでした…
  5~6回メッセージが表示するはずですが
  イベントが感知しなかったのでしょうかなら
   メニュをデザインモードにしてクリックイベントを発生させてください
Private Sub txtインポート_Click()の次にカーソルが止まるはずです。
  メニューを起動して試してください
----------------------------------------------------------------------
こちらで作成したメニュー画面を添付します。
登録のボタンが沢山ありますが、登録は必要ないですが
インポートの確認用と思って下さい。
  
「関連がある複数のテキストファイルの扱い方」の回答画像18

この回答への補足

回答ありがとうございます。

読み込めなかった原因が解りました。

Private Sub txtインポート_Click()となっていた為、
Private Sub txtテキストインポート_Click()としてみると動作しました。

その後インポートが進んだものの、以下のエラー画面が現れました。

「すべてのデータをテーブルに追加できませんでした。
キー違反のため***件のレコードのデータが失われ、***件のレコードが削除されました。
*データが失われた時は、貼り付けまたはインポートしたデータが、対象となるテーブルのフィールドのデータ型または、フィールドサイズプロパティと一致していません。
*レコードが削除されたときは、対象となるテーブルにすでに存在する主キー値が貼り付けたレコードに含まれているか、テーブル間に設定されているリレーションシップの参照整合性に違反しています。」

「はい」として、インポートを進め、終了後テーブルを開いてみると

・データ自体取り込めていないもの
・1レコード1フィールドに保存されてしまったもの
・エラーテーブルが作成されたもの
商品マスタ_インポート エラー(解析不能なレコード)
説明_インポート エラー(フィールドの切り捨て:商品コード)
名前の自動修正保存エラー(商品マスタ:テーブル:オブジェクトを保存できませんでした)

が、表示されました。

毎日さわっているので理屈はわからないでも少しずつ馴染んできました^^
ですが根本が解っていない為もどかしいです。

補足日時:2014/09/12 15:29
    • good
    • 0

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