- ベストアンサー
AccessVBAでのインポート
AccessVBAにてファイル名にシステム日付が入っている、または更新日付がシステム日付のテキストファイルを指定ディレクトリよりインポートするということはできるのでしょうか?よろしくお願いいたします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
nana_pocoさん、こんにちは。返事がおそくなってすみません。 >もし該当ファイルが存在しない場合、 >エラーメッセージを出すとするとどこにその処理を持って行けばよいのでしょうか? Fname = Dir(myPath & "file?" & "_" & BaseFname) Do While Fname <> "" このようにして、実在するファイルを選び出していますから、該当ファイルが存在しない場合のエラーメッセージは、ここの場合はありません。 もしも、あえて必要なら、 If rtn = vbYes Then と DoCmd.TransferText acImportDelim, "インポート定義名", "インポート先テーブル名", myPath & Fname, True の間に、やはり、 If Dir(Fname) ="" Then MsgBox "該当ファイルが存在しません。" Exit Sub End if ということになりますね。おそらくは使われることはないと思います。
その他の回答 (10)
- Wendy02
- ベストアンサー率57% (3570/6232)
#6 の Wendy02 です。前回、あまり反応されていなかったので、実際に、作ってみました。なお、テキストフォーマット自体は、この件とは別ですので、それについては考慮していません。 '<標準モジュール> Option Compare Database Sub TextFileImport() On Error GoTo TextFileImport_Err Dim myDate As String Dim myPath As String Dim Fname As String Dim rtn As Integer Dim BaseFname As String 'テキスト・ファイルのパス myPath = "D:\Data\" '日付の部分 BaseFname = Format(Date, "yyyymmdd") & ".txt" 'ファイルの定型フォームにあわせてください。 Fname = Dir(myPath & "file?" & "_" & BaseFname) Do While Fname <> "" rtn = MsgBox("「 " & Fname & " 」をインポートしますか?", vbYesNoCancel) If rtn = vbYes Then DoCmd.TransferText acImportDelim, "インポート定義名", "インポート先テーブル名", myPath & Fname, True ElseIf rtn = vbCancel Then Exit Sub End If Fname = Dir() Loop TextFileImport_Exit: Exit Sub TextFileImport_Err: MsgBox Error$ Resume TextFileImport_Exit End Sub
補足
本当にご丁寧にありがとうございます。教えていただいたロジックで想定通りうまく動きました。もし該当ファイルが存在しない場合、エラーメッセージを出すとするとどこにその処理を持って行けばよいのでしょうか?
- takibo
- ベストアンサー率57% (116/200)
takiboです。誤って投稿ボタンを押してしまいましたので続きを。 と思ったら skikichiさんが全て解説してくださいました。 まったくその通りです。どうもありがとうございます。
- skikichi
- ベストアンサー率65% (45/69)
私や#4さんが想定しているケースはこうです。 D:\Data\ というフォルダーの中に毎日複数のファイルが作成される。 一日に一つだけファイルが作成されるのではないので、たとえば、2005年6月28日には、file1_20050628.txt とか file2_20050628.txt とか file3_20050628.txt など、いくつものファイルが作成される。 当然、前日、前々日など過去のファイルも同じフォルダーに存在するので、Accessで自動的にインポートする際にはその日付を見て当日のものだけをインポートする。 #4さんのサンプルプログラムでは、最初にFNAMEには最初に見つかったファイル「file1_20050628.txt」が読み込まれます。 次にwhileでloopしてきたときには、「file2_20050628.txt」が読み込まれます。 同様に3回目には「file3_20050628.txt」が読み込まれ、それ以上ファイルが無ければloopを抜け出します。 FNAME = Dir() という構文で次のファイル名が検索され、FNAMEという変数にセットされるのです。 また、インポート文ですが・・・ ファイル名の指定のところは、"D:\Data\日付*.txt" ではなく、FNAME になります。 >また、if文のInstr(1,FNAME,…)のところで、 FNAMEをなぜいれるのかよくわかりません。 ここまででおわかりかと思いますが、FNAMEという変数には日付の付いたファイル名(file1_20050628.txt)が入っていますから、Instrという関数で日付(当日の日付)と比較して、当日の日付の入ったファイル名だけをインポートするようにしているのです。
お礼
Instrの部分の意味がやっとわかりました。こんな初心者の私にご親切に教えていただきまして大感謝しております。
- takibo
- ベストアンサー率57% (116/200)
No.4 takibo です。 まず、nana_pocoさんの作られたインポートプログラムの [Filename] の部分を パス & FNAME (ダブルコーテーション無し) に置き換えて実行してみてください。 >また、if文のInstr(1,FNAME,…)のところで、FNAMEをなぜいれるのかよくわかりません。
お礼
ご親切にありがとうございます。takiboさんに教えていただいたロジックを元にして、うまくいきました!また機会がありましたらお願いいたします。
- Wendy02
- ベストアンサー率57% (3570/6232)
#1 さんへの「回答に対する補足」を読んだ限りでは、そのテキストファイルというのは、単にインポートしたところで、それだけのデータテーブルが作られるだけだと思います。 例えば、 Function インポート() DoCmd.TransferText acImportDelim, , [TableName],[FileName] 'acImportDelim (区切り記号付きテキストインポート) End Function などとなると思うのですが、それを、マクロにつければよいのではないかと思います。 ファイル名の方は、もしも、当日で間に合うのでしたら、 FileName = "file1_" & Format$(Date,"yyyymmdd") &".txt" このようなものを作ればよいと思います。 そうでないのでしたら、 DoCmd.RunCommand acCmdImport("*.txt") で、外部データインポートのダイアログ・メニューを開けるか、どちらかだと思います。
補足
本当にご親切にありがとうございます。取り急ぎ、午後から取り掛かります。
- skikichi
- ベストアンサー率65% (45/69)
失礼しました。 #4の方の回答でよろしいかと思います。
- takibo
- ベストアンサー率57% (116/200)
ExcelVBAで使うものですが、Accessでも使えると思います。(Access2002で確認済) Sub 指定ファイルインポート() 日付 = Format(Date, "yyyymmdd") パス = "D:\test\" FNAME = Dir(パス & "*.txt") Do While FNAME <> "" If InStr(1, FNAME, 日付, vbTextCompare) > 0 Then '・・・・・(※) '(インポート処理) Else MsgBox "該当ファイルがありません" End If FNAME = Dir() Loop End Sub 指定ディレクトリ=[D:\test\]、対象拡張子=[.txt]と仮定しています。 インポート処理やエラー処理は書き加えてください。 上記のコードは『ファイル名にシステム日付(8文字)が含まれている場合』です。 『更新日がシステム日付の場合』は(※)の部分を以下の2行と差替えます。 更新日 = Format(FileDateTime(FNAME), "yyyymmdd") If 更新日 = 日付 Then あくまでもExcelVBAからのアプローチです。ご参考になれば幸いです。
補足
ご丁寧にありがとうございます。 私のインポートのプログラムがおかしいのでしょうか? DoCmd.TransferText acImportDelim, "インポート定義名","インポート先テーブル名","D:\Data\日付*.txt",true をインポート部分に入れたのですが、 該当データなしになってしまいます。 また、if文のInstr(1,FNAME,…)のところで、 FNAMEをなぜいれるのかよくわかりません。 お手数ですがお時間ありましたら教えてください。
- skikichi
- ベストアンサー率65% (45/69)
バッチファイルはご存知ではないのですね!? 1.バッチファイルの作成(file_ichiran.bat) DIR C:\*.txt > file_ichiran.txt 2.Accessでfile_ichiran.txtをインポート 3.インポートした内容にファイル名と更新日付が入っていますので、日付を見て当日のファイルだけをあらためてインポートする。 以上です。 file_ichiran.txtの中身を見ていただけば3.の処理方法は自ずと見えてくるかと思います。 もし更新日付ではなく、作成日付で判断せねばならない場合には、さらにワンクッション処理が必要です。
- skikichi
- ベストアンサー率65% (45/69)
下記アルゴリズムで可能かと思います。 1.バッチファイルでディレクトリ内のファイル一覧をテキストファイルにはき出す。 2.そのテキストファイルをAccessにインポートする。 3.Accessで、一つ一つのファイル名または作成日付を判断し、当日のファイルをインポートする。
補足
ありがとうございます。 あまり詳しくないもので、ファイル一覧をテキストにするところからよく分かりません。 特に、3の具体的な判断方法を教えていただけますか?
- skikichi
- ベストアンサー率65% (45/69)
どういう意味かわかりません! 何をしたいのですか?
補足
説明不足ですみません。 例えば、日付がファイル名に入っているような「file1_20050627.txt」のようなファイルがディレクトリに日次ではき出されています。日次で処理をまわすために、その日にできたファイルをAccessへ自動でインポートするようなプログラムにしたいのですが、意味わかりますでしょうか?
お礼
一昨日の取得は試行錯誤し、自分で解決できました。本当にありがとうございました。
補足
ありがとうございます。本当にご丁寧にありがとうございます。重ね重ね申し訳ございませんが、Dateから引っ張ってきた日付の前日をあらわすにはどうしたらよいのでしょうか?