- ベストアンサー
ACCESSで質問があります!
お世話になります。できるかどうかはわからないのですが質問させてください。 現在の使用状況として、ACCESS2002・OS 2000を利用しています。 質問として ACCESSで、TXTデータをインポート(固定長)をし、データ別にフォームから指定のデータを抽出したい希望があります。 データの例として (1)00000100大阪00000000 100オオサカシテン 101152110000000000000000"金額"000”得意先名” 101152110000000000000000"金額"000”得意先名” (2)00000200福岡00000000 200フクオカシテン 101152110000000000000000"金額"000”得意先名” 101152110000000000000000"金額"000”得意先名” (3)00000300沖縄00000000 300オキナワシテン 101152110000000000000000"金額"000”得意先名” 101152110000000000000000"金額"000”得意先名” 上記のようなデータがあり、日ごとにデータの量や ”金額”・”得意先名”等のデータは変わってくる状態なのですが、ヘッダ情報?(00000200福岡00000000・・・)等 を元にして、その範囲に含まれているデータを抽出してくる事は可能でしょうか?(start・・・endのような) ヘッダ情報以外は、全て同様の番号になっており、特有の番号をもっていない為 どうやればうまく抽出できるか悩んでいます。 知識不足の点があり、説明も下手かもしれませんが アドバイスがありましたら、ご協力よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>それがクエリ等でできればいいなという希望はもっているのですが DB(データベース)のファイル構造がきちんと出来ていれば良いのですが、テキストを読み込んだだけでは関連付けが出来ていないと思われますので、多分無理かと。。。(^^; 簡単なサンプルを作ってみました(VBA) コマンドボタンのクリックイベントに貼り付けて下さい。 入力ファイルは、mdbと同じフォルダにしています。 ファイル名などは、コメントを参考に変更して下さいネ(^^) DBでもよかったのですが、実際のレイアウトが不明だと余計に判りづらいかと思いまして、取込前のテキストファイルをCSV形式にして作成しています。 加工方法は色々あると思いますので、No.2さんのご指摘通りでDBを作成できる様にされた方が後々抽出する場合も楽ですが。。。 まずは、1つづつやって順次、拡張されれば良いかと思います。 ガンバって下さいネ(^^v Private Sub コマンド1_Click() Dim I_CNT As Integer 'I/P COUNT Dim O_CNT As Integer 'O/P COUNT Dim I_FNM As String 'I/P FILE NAME Dim O_FNM As String 'O/P FILE NAME Dim W_HD As String Dim W_DT As String 'メッセージを表示 wSQL = "TXTデータ→CSVファイル" & vbCrLf & vbCrLf & "作成しますか?" If MsgBox(wSQL, vbYesNo + vbQuestion) = vbNo Then Exit Sub 'いいえ-->終了 End If 'I/O FILE の保存先(.mdb と同じフォルダ)・ファイル名の設定 O_FNM = Application.CurrentProject.Path & "\" I_FNM = O_FNM & "URIAGE.txt" '入力-FILE名(固定.TXT) O_FNM = O_FNM & "URIAGE2.txt" '出力-FILE名 ''' O_FNM = O_FNM & "URIAGE.csv" '出力-FILE名 On Error Resume Next '念の為エラートラップ(削除時) If Dir(I_FNM, vbNormal) = "" Then Call MsgBox("入力ファイルが存在しません" & vbCrLf & vbCrLf & I_FNM) Exit Sub '→終了 End If Call Kill(O_FNM) '前回分は削除-->ごみ箱へ ※上書きしない On Error GoTo sCSV_OP_ERR '念の為エラートラップ Open I_FNM For Input As #3 Open O_FNM For Output As #8 I_CNT = 0: O_CNT = 0 Do Until EOF(3) Line Input #3, W_DT I_CNT = I_CNT + 1 '(ヘッダ部) If Left(W_DT, 5) = "00000" Then '左5桁=0の時、ヘッダと判断しています W_HD = W_DT 'ヘッダ情報を退避 Else '(データ部) Write #8, Left(W_HD, 8), Mid(W_HD, 9, 2), W_DT O_CNT = O_CNT + 1 End If Loop Close #3: Close #8 Call MsgBox("入力:" & Format(I_CNT, "#,##0 \件") & vbCrLf & _ "出力:" & Format(O_CNT, "#,##0 \件") & vbCrLf & vbCrLf & "作成しました") Exit Sub sCSV_OP_ERR: Call MsgBox("(エラー発生)sCSV_OP" & vbCrLf & vbCrLf & W_DT, vbExclamation) Call MsgBox(Err.Number & " " & Err.Description) End Sub
その他の回答 (2)
<アドバイス> データをインスト-ル前に加工すると楽でしょう。 Heder.txt 1,00000100大阪00000000 100オオサカシテン 2,00000200福岡00000000 200フクオカシテン 3,00000300沖縄00000000 300オキナワシテン Data.txt 1,101152110000000000000000"金額"000”得意先名” 1,101152110000000000000000"金額"000”得意先名” 2,101152110000000000000000"金額"000”得意先名” 2,101152110000000000000000"金額"000”得意先名” 3,101152110000000000000000"金額"000”得意先名” 3,101152110000000000000000"金額"000”得意先名” | +--> ID列 これで、Header.txtとData.txtは、列[ID]でリンクさせることが可能です。後は、サブフォームを持つフォームを作成すれば簡単にヘッダー情報に対応した明細情報を参照することができます。 <arare2005さんの回答との関係> 両者は、同じ回答をしています。VBAでリンクテーブルを作成するも、事前にテキストを編集するにしても、目的は同じです。しかも、テキスト編集をVBAで書くのであれば、その処理コードの大半は同じようなものになるでしょう。
お礼
s_huskyさん・arare2005さん ご回答ありがとうございました。 確かにこの方法をとれば、リンク可能で処理が可能ですね。目から鱗って感じです。 只、処理を行う担当者が私ではなく、アクセスを知らない方が取り込み担当になっている為、正確に処理できると思われる方法を考えていました。 (今までは支店ごとにデータを手で削除をして取込。) あまり、手で先に加工をして、取り込んでリンクさせて出力という形になると、担当者に逆に手間になってしまう所があるかなっとは思います。 何度も問い合わせをさせて頂いて申し訳ないのですが 例えば、 00000300沖縄00000000 101152110000000000000000"金額"000”得意先名” 101152110000000000000000"金額"000”得意先名” があって次の行に 00000300 ~ があると処理が終了するというようなことっていうのは やはりむずかしいのでしょうか? それがクエリ等でできればいいなという希望はもっているのですが・・・・
- arare2005
- ベストアンサー率31% (63/199)
>ACCESSで、TXTデータをインポート(固定長)をし ここで、ツールのインポートを使用せずに、HD、DT部を判断し、DTへHD情報を貼り付けたDBを作成しましょう。(VBA)
補足
arare2005さん早速の回答ありがとうございます。 補足の説明をさせて頂きます。 説明が難しいのですが、今回のデータをさらに別のシステムに取込をおこなっています。 例えば、カンマ・改行一つ違っていてもデータが間違ったデータを取り込んでしまう為、なるべくでしたら書式・並び順等も全て同様のデータをとりたい希望があります。 >ここで、ツールのインポートを使用せずに、HD、DT部>を判断し、DTへHD情報を貼り付けたDBを作成しまし>ょう。(VBA) すいませんm(__)m まだあまりVBAが詳しくなく・・・ 独学で作れるレベルに達しておりません。 DTへHD情報を貼り付けたDBというのは?? ご面倒かけて申し訳ありませんが、教えて頂けるとたすかります。 以上 よろしくお願いいたします。
お礼
arare2005さん 回答ありがとうございます。 色々教えて頂いて、非常に参考になりました。 頂いたコードを参考に一つ一つ確認していきます。 ありがとうございました。