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

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

A 回答 (11件中1~10件)

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

ということになりますね。おそらくは使われることはないと思います。

この回答への補足

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

補足日時:2005/06/30 09:44
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/30 10:18

#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

この回答への補足

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

補足日時:2005/06/29 00:02
    • good
    • 0

takiboです。

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

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

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

お礼日時:2005/06/28 23:54

No.4 takibo です。


まず、nana_pocoさんの作られたインポートプログラムの [Filename] の部分を
   パス & FNAME (ダブルコーテーション無し)
に置き換えて実行してみてください。

>また、if文のInstr(1,FNAME,…)のところで、FNAMEをなぜいれるのかよくわかりません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/28 23:56

#1 さんへの「回答に対する補足」を読んだ限りでは、そのテキストファイルというのは、単にインポートしたところで、それだけのデータテーブルが作られるだけだと思います。



例えば、

Function インポート()

DoCmd.TransferText acImportDelim, , [TableName],[FileName]
'acImportDelim (区切り記号付きテキストインポート)

End Function

などとなると思うのですが、それを、マクロにつければよいのではないかと思います。

ファイル名の方は、もしも、当日で間に合うのでしたら、

FileName = "file1_" & Format$(Date,"yyyymmdd") &".txt"

このようなものを作ればよいと思います。

そうでないのでしたら、
DoCmd.RunCommand acCmdImport("*.txt")

で、外部データインポートのダイアログ・メニューを開けるか、どちらかだと思います。

この回答への補足

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

補足日時:2005/06/28 12:27
    • good
    • 0

失礼しました。


#4の方の回答でよろしいかと思います。
    • good
    • 0

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をなぜいれるのかよくわかりません。
お手数ですがお時間ありましたら教えてください。

補足日時:2005/06/27 19:09
    • good
    • 0

バッチファイルはご存知ではないのですね!?



1.バッチファイルの作成(file_ichiran.bat)
   DIR C:\*.txt > file_ichiran.txt

2.Accessでfile_ichiran.txtをインポート

3.インポートした内容にファイル名と更新日付が入っていますので、日付を見て当日のファイルだけをあらためてインポートする。

以上です。
file_ichiran.txtの中身を見ていただけば3.の処理方法は自ずと見えてくるかと思います。

もし更新日付ではなく、作成日付で判断せねばならない場合には、さらにワンクッション処理が必要です。
    • good
    • 0

下記アルゴリズムで可能かと思います。



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

この回答への補足

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

補足日時:2005/06/27 11:58
    • good
    • 0

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