• ベストアンサー

AccessVBAでのインポート

AccessVBAにてファイル名にシステム日付が入っている、または更新日付がシステム日付のテキストファイルを指定ディレクトリよりインポートするということはできるのでしょうか?よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 ということになりますね。おそらくは使われることはないと思います。

nana_poco
質問者

お礼

一昨日の取得は試行錯誤し、自分で解決できました。本当にありがとうございました。

nana_poco
質問者

補足

ありがとうございます。本当にご丁寧にありがとうございます。重ね重ね申し訳ございませんが、Dateから引っ張ってきた日付の前日をあらわすにはどうしたらよいのでしょうか?

その他の回答 (10)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

#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

nana_poco
質問者

補足

本当にご丁寧にありがとうございます。教えていただいたロジックで想定通りうまく動きました。もし該当ファイルが存在しない場合、エラーメッセージを出すとするとどこにその処理を持って行けばよいのでしょうか?

  • takibo
  • ベストアンサー率57% (116/200)
回答No.9

takiboです。誤って投稿ボタンを押してしまいましたので続きを。 と思ったら skikichiさんが全て解説してくださいました。 まったくその通りです。どうもありがとうございます。

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.8

私や#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という関数で日付(当日の日付)と比較して、当日の日付の入ったファイル名だけをインポートするようにしているのです。

nana_poco
質問者

お礼

Instrの部分の意味がやっとわかりました。こんな初心者の私にご親切に教えていただきまして大感謝しております。

  • takibo
  • ベストアンサー率57% (116/200)
回答No.7

No.4 takibo です。 まず、nana_pocoさんの作られたインポートプログラムの [Filename] の部分を    パス & FNAME (ダブルコーテーション無し) に置き換えて実行してみてください。 >また、if文のInstr(1,FNAME,…)のところで、FNAMEをなぜいれるのかよくわかりません。

nana_poco
質問者

お礼

ご親切にありがとうございます。takiboさんに教えていただいたロジックを元にして、うまくいきました!また機会がありましたらお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#1 さんへの「回答に対する補足」を読んだ限りでは、そのテキストファイルというのは、単にインポートしたところで、それだけのデータテーブルが作られるだけだと思います。 例えば、 Function インポート() DoCmd.TransferText acImportDelim, , [TableName],[FileName] 'acImportDelim (区切り記号付きテキストインポート) End Function などとなると思うのですが、それを、マクロにつければよいのではないかと思います。 ファイル名の方は、もしも、当日で間に合うのでしたら、 FileName = "file1_" & Format$(Date,"yyyymmdd") &".txt" このようなものを作ればよいと思います。 そうでないのでしたら、 DoCmd.RunCommand acCmdImport("*.txt") で、外部データインポートのダイアログ・メニューを開けるか、どちらかだと思います。

nana_poco
質問者

補足

本当にご親切にありがとうございます。取り急ぎ、午後から取り掛かります。

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.5

失礼しました。 #4の方の回答でよろしいかと思います。

  • takibo
  • ベストアンサー率57% (116/200)
回答No.4

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からのアプローチです。ご参考になれば幸いです。

nana_poco
質問者

補足

ご丁寧にありがとうございます。 私のインポートのプログラムがおかしいのでしょうか? DoCmd.TransferText acImportDelim, "インポート定義名","インポート先テーブル名","D:\Data\日付*.txt",true をインポート部分に入れたのですが、 該当データなしになってしまいます。 また、if文のInstr(1,FNAME,…)のところで、 FNAMEをなぜいれるのかよくわかりません。 お手数ですがお時間ありましたら教えてください。

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.3

バッチファイルはご存知ではないのですね!? 1.バッチファイルの作成(file_ichiran.bat)    DIR C:\*.txt > file_ichiran.txt 2.Accessでfile_ichiran.txtをインポート 3.インポートした内容にファイル名と更新日付が入っていますので、日付を見て当日のファイルだけをあらためてインポートする。 以上です。 file_ichiran.txtの中身を見ていただけば3.の処理方法は自ずと見えてくるかと思います。 もし更新日付ではなく、作成日付で判断せねばならない場合には、さらにワンクッション処理が必要です。

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.2

下記アルゴリズムで可能かと思います。 1.バッチファイルでディレクトリ内のファイル一覧をテキストファイルにはき出す。 2.そのテキストファイルをAccessにインポートする。 3.Accessで、一つ一つのファイル名または作成日付を判断し、当日のファイルをインポートする。

nana_poco
質問者

補足

ありがとうございます。 あまり詳しくないもので、ファイル一覧をテキストにするところからよく分かりません。 特に、3の具体的な判断方法を教えていただけますか?

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.1

どういう意味かわかりません! 何をしたいのですか?

nana_poco
質問者

補足

説明不足ですみません。 例えば、日付がファイル名に入っているような「file1_20050627.txt」のようなファイルがディレクトリに日次ではき出されています。日次で処理をまわすために、その日にできたファイルをAccessへ自動でインポートするようなプログラムにしたいのですが、意味わかりますでしょうか?

関連するQ&A