• ベストアンサー

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

  • マクロによりテーブルをインポートする際の処理について

    マクロの動作によりあるテキストファイル(csv)をテーブルにインポートする際に、そのテキストファイルにない取り込んだ日のフィールドを追加してインポートしたいと思っています。 具体的にはテキストデータが 番号 内容 1 本 2 自転車 3 東京 となっていまして、このテキストデータをマクロ動作によりインポートすれば 日付 番号 内容 5/31 1 本 5/31 2 自転車 5/31 3 東京 というテーブルになるというイメージです。 もう一つがマクロによりインポートする際に読み込むファイル名が text_data_20060531.txt となっていましてフォームのボタンを押すだけで自動的に本日の日付からこのファイル名を指定するにはどうしたらいいのでしょう?マクロの中では決めうちでファイル名を指定しなければならないように見えます。 どなたかご存知の方ご教授ください。

  • excelでのインポート

    エクセルでcsvを更新インポートするVBAを作りたいのですが、「テキストファイルのインポート」のウィンドウが出てきてしまいます。これをvbaにファイル場所・ファイル名を入れておき、ウィンドウを出さないで自動的に更新をするようにしたいのですが、全然分かりませんでしたのでお分かりになる方教えてください。 よろしくお願い致します。

  • 【AccessVBA】フォルダを指定してインポート

    私は現在、Accessでフォルダ内のExcelファイルを一括でインポートし集計するというツールを作成しております。 そこで質問ですが、フォルダ指定ダイアログを表示し、ダイアログで指定したフォルダ(中はxls,xlsx,xltmなど)をテーブル上にインポートするようなVBAはありますでしょうか? まとめます。 ・フォルダを選択するダイアログを表示したい ・一つのフォルダの中に、幾つものエクセルファイルが存在する ・ファイル名などはバラバラです ・シート単位でインポートしたいです ・インポートするシートを選択できるようにしたいです ・テーブルのカラムは決まっています 以上です。 どうか皆様のアドバイスよろしくお願い致します。

  • 【AccessVBA】ファルダごとインポート 

    お世話になります 実行可能かわからない範囲でお聞きしています。 ■概要 フォルダごとCSVをインポートする ■詳細 フォーム上でテキストボックス、参照ボタン、実行ボタン、を設置 参照ボタンでダイアログボックスを表示しファルダを選ぶ 選ぶとテキストボックスにあて先が記載され実行ボタンでファイル内にあるCSVファイルを一括してAccessテーブルにインポートさせたいのですが可能ですか? ■環境 Access2003 CSV カンマ区切り  CSVの数はまちまちです1個のときもあります CSVの列等は全部統一されています わかる方ご教授よろしくお願いします。

  • インポートできません

    昨日はできたのですが、今日はできなくなりました。 エクセルでoutlook expressのアドレス の順番に姓 名 電子メールとタイトルをうち、リストを つくり、csvで保存したいのですが、項目がないので、テキスト(タブ 区切り)で保存、結局テキストファイルで保存。out lookのアドレスをひらきインポート、その他の アドレスをクリック、ファイルをテキストファイル(csv)で指定、インポートするフィールドの割り当て、 の画面でテキストフィールドに姓、名、電子アドレスとなっており、割り当て、の変更をクリックシ、フィールド に、姓、をクリックするとアドレス帳フィールドに 姓と印字され、つぎに名を選択すると、アドレス帳 フィールドの姓が消去し、名がでてきます、次に 電子メールをしていすると、名が消去され、インポート すると、ばらばらではなく一塊の姓名電子メールが インポートされます。昨日やったときは、テキスト フィールドのしたに名、その下に電子メールが印字 されていたように思いますが、今日は上手く行きません。 エクセルで保存のとき、タブ区切りのテキストでしか 保存できませんのでそれがいけないのでしょうか 教えていただきたいと思います。 遅くなりましたが、ウインドウズMEです。

  • [PG]AccessVBAでファイルのインポートする方法

    [PG]AccessVBAでファイルのインポートする方法 VBAでエクセルファイルのインポートする機能を実装しています。 下記のコードで実行しますと実行時エラー"3011"が表示され DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange で止まります。何か解決方法を教えていただけないでしょうか? Function ExcelDataImport() 'On Error GoTo エラー Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String ' --- Accessテーブルを指定します。存在していなければ自動的に作成します。 varac = "tbl_売上げテーブル" ' ---Excelファイルを指定します。必ず、存在していなくてはいけません。 varxls = "C:\売上げ.xls" ' --- データ入力のシート名とセル範囲を指定します。 ' なお、省略が可能です。省略した場合は、ワークシート全体がインポートされます。 strrange = "売上げシート!A1:D10" strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & _ "へ、データ入力を行います。" & Chr(13) & _ "Excelファイルの入力レンジは、 " & strrange & " です。" ' --- DeleteObjectメソッドを用いて、tbl_売上げテーブルを削除します。 ' --- TransferSpreadsheetメソッドを用いてデータをインポートします。 DoCmd.DeleteObject acTable, varac If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange MsgBox "データ入力は、正常に完了しました。" End If Exit Function

  • Access2003でインポートをマクロで簡単に自動化したいです。

    Access2003でインポートをマクロで簡単に自動化したいです。 今はAccess2003でインポートをマクロにしたい時は、インポートする画面でインポート定義を作っておいて、マクロのテキスト変換でマクロにしています。 これだと、テキスト変換の画面でインポート元のフルパスを指定して、インポート先のテーブルのファイル名を指定しなくてはいけません。 インポート定義を作ってるのだから、定義と同じインポート元、インポート先で簡単にマクロでインポートを自動化する方法はありませんか? マクロにしたいインポートとエクスポートが結構な数あるので、マクロを作る時にいちいちフルパスとファイル名をコピーしてくるのが大変です。 簡単にインポートをマクロにする方法がありましたら、教えてください。

  • ACCESS VBAでインポート定義の場所

    人の書いたVBAを引継いでいます。 テキストファイルのインポートで、定義名が指定されているのですが、この定義名は、いったいどこで確認することができるのでしょうか?

  • 対象Excelファイルを開き日付入力をすると自動でファイル名+日付でファイルを保存

    対象Excelを開きます。→日付の入力画面起動(ポップアップ)→日付入力→同じディレクトリへ定形ファイル名+日付でファイル保存(例:Office20090812.xls) こうした事は出来るのでしょうか? また現在、対象ファイル起動後、外部データ取り込み→テキストファイルをインポートを行っておりますが、対象ファイル起動後、対象テキストファイルをインポートを自動と言いますが、どのファイルをインポートするのかポップアップで出来ないでしょうか? テキストファイルのインポートはセルA1列のみです。 可能でしょうか? 宜しくお願いします。

  • ACCESSでのインポート処理の自動化

    ACCESS2002を使用して、CSVデータをもとにリストを作成するMDBを作成しました。 このCSVデータは不定期に更新され、更新するごとに新しいファイル名がついて準備されます。 今、マクロを使ってインポートの設定をしようと思ったんですが、ファイル名をきっちり指定しないとできないので、今回のように、そのつど、ファイル名が変わる場合はどのように設定をしていいのかわかりません。 私の希望としては、該当のフォルダを開くとこまでをマクロか何かでして、ファイルの選択は利用者にしてもらって、その後は自動的にインポート定義に基づいてインポートされるようにしたいんです。 こういうことは簡単にできないものでしょうか? VBとかもあまり使ったことがないので、マクロとかで指定できればそのほうが助かります。

専門家に質問してみよう