• ベストアンサー

AccessへのCSVファイルの取り込み

CSVファイルが複数あるのですが、それを取り込んでひとつにまとめたいと思っています。 数が多いので、どうにか簡単に出来る方法はありませんでしょうか。 今は、インポートしたCSVのデータをコピーして貼り付けているので、数が増えてくると大変な手間です。 やはり、プログラムなんかを使わないとだめなのでしょうか。 あるいは、そういうアプリケーションはありますか? 情報をお持ちの方、よろしくお願いします。

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

  • ベストアンサー
noname#22222
noname#22222
回答No.4

s_husky です。 先の回答のMessage関数は、MsgBoxに置き換えて下さい。 まず、関数の使い方を説明します。 関数自体は、使い方さえ知っておれば事足ります。 が、所詮は、プログラマではない素人の考えたものです。 質問者の手で、より洗練して下さい。 ====GetFileList()==================================================================== Dim strFileName() AS String strFileName()=GetFileList("DirName")-------------第2引数はオプショナル strFileName()=GetFileList("DirName", "*.txt") ====FileRead()==================================================================== Dim strText AS String Do   strText=FileRead("FileName")-------第2引数にTrueをセットしないと次を読み込む Loop Until strText="" FileRead関数は、最後に達すると読み込みエラーを起こします。 が、エラーはトラップされており、結果的に静的なファイルオブジェクトが破棄されます。 ====FileAppend()==================================================================== Dim isOk As Boolean isOK=FileAppend("FileName", "aaaaaaaaaaaaa") isOK=FileAppend("FileName", "")-----静的なファイルオブジェクトを破棄 ==================================================================================== 新しい標準モジュールに以下の関数をコピペして下さい。 標準モジュールの名前は、<ファイルシステム関数>など適当に付けて下さい。 *僅か、4、5行で書ける関数がエラートラップで肥大化しています。 *が、これは、関数の宿命と思って下さい。 Public Function GetFileList(ByVal strDir As String, _               Optional strName As String = "*") As String() On Error GoTo Err_GetFileList    Dim strFiles As String    Dim fso   As FileSystemObject    Dim fol   As Folder    Dim fil   As File    Dim fils   As Files       Set fso = New FileSystemObject    Set fol = fso.GetFolder(strDir)    Set fils = fol.Files    For Each fil In fils      If fil.Name Like strName And fil.Attributes = Archive Then        strFiles = strFiles & "," & fil.Name      End If    Next Exit_GetFileList: On Error Resume Next   GetFileList = Split(Mid(strFiles, 2), ",")   Exit Function Err_GetFileList:   strFiles = ""   MsgBox Err.Description & "(GetFileList)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_GetFileList End Function Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead     Static isOpen As Boolean     Static fso    As FileSystemObject     Static fil    As File     Static txs    As TextStream          If Not isOpen Then         isOpen = True         Set fso = New FileSystemObject         Set fil = fso.GetFile(FileName)         Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)     End If     FileRead = txs.ReadLine Exit_FileRead: On Error Resume Next     If Len(FileRead) = 0 Or isStop Then         isOpen = False         Set txs = Nothing         Set fil = Nothing         Set fso = Nothing     End If     Exit Function Err_FileRead:     Resume Exit_FileRead End Function Public Function FileAppend(ByVal FileName As String, ByVal Text As String) As Boolean On Error GoTo Err_FileAppend     Static isOpen As Boolean     Static fso    As FileSystemObject     Static txs    As TextStream          If Not isOpen Then         isOpen = True         Set fso = New FileSystemObject         Set txs = fso.CreateTextFile(FileName, True)     End If     If Len(Text) > 0 Then         txs.WriteLine Text     End If     FileAppend = True Exit_FileAppend: On Error Resume Next     If Len(Text) = 0 Then         isOpen = False         Set txs = Nothing         Set fso = Nothing     End If     Exit Function Err_FileAppend:     Resume Exit_FileAppend End Function

pochitarou
質問者

お礼

一度アクセスへいれて試して見たいと思います。 本当にありがとうございます!

その他の回答 (4)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.5

原始的な方法です。 前提条件 一つのフォルダ内に目的のCSVファイルがあり、 かつ、そのフォルダ内には他のCSVファイルが存在しない。 かつ、CSVファイル内にはデータのみで、タイトル行などは存在しない。 かつ、CSVファイル内の構造は同一である。 であれば、 コマンドプロンプトで、仮にそのフォルダが、c:\data だとして type c:\data\*.csv >> c:\all.csv で一つに統合されます。 Access上でやりたい場合は sub test() dim rtnVal as long if dir("c:\all.csv") <> "" then   if msgbox("以前のファイルを消しますよ",vbyesno)=vbno then     msgbox "中止しました"   else     kill "c:\all.csv"   end if end if    rtnVal = shell(environ("comspec") & " /c type c:\data\*.csv >> c:\all.csv") end sub のようなものを作成すれば、実行後暫くすると、 Cドライブ直下に統合されたファイルが出来ると思います。 ※コマンドラインオプションは、/c か /K /K だとコマンドプロンプトのウィンドウが閉じません。こっちの方が良いかも? 後はall.csvのインポート処理が無事に済むのを祈るだけ・・・

noname#22222
noname#22222
回答No.3

s_husky です。 次が、C:\Temp\Temp\に存在する*.csvを合成するコードの全てです。 注意事項は、"C:\Temp\gattai.csv"と別フォルダに合成するファイルを作るように指示することです。 誤って、同一ファイルでテストしたところ永遠に作り続けました。 なお、JでForループを脱出する不可思議な仕掛けがあります。 これは、上述の無限ループを阻止するものです。 全体、僅か30行にも満たないコードです。 一応、合成テストを数回繰り返して結果を確認しています。 Private Sub コマンド0_Click()   '   ' 絶対に同じフォルダを指定しないこと!!   '   Const conFROM = "C:\Temp\Temp\"   Const conTO = "C:\Temp\gattai.csv"   Dim isOK   As Boolean   Dim I     As Integer   Dim J     As Integer   Dim N     As Integer   Dim filName() As String   Dim strText  As String     filName() = GetFileList(conFROM, "*.csv")   J = -1   N = UBound(filName())   For I = 0 To N     J = J + 1     If N <= J Then       Do         strText = FileRead("C:\Temp\Temp\" & filName(I))         If Len(strText) > 0 Then           isOK = FileAppend(conTO, strText)         End If       Loop Until strText = ""     Else       Exit For     End If   Next I   FileAppend conTO, ""   Message N + 1 & " 個のファイルを合成しました。" End Sub *なお、 GetFileList()・・・ファイルリストを取得する関数。 FileRead()・・・・・・1行づつファイルを読む込む関数。最後まで読んだら""を戻す。 FileAppend()・・・・1行づつファイルに追加書き込むする関数。""を渡すと閉じる。 という3つの関数は明朝に投稿します。 一度では、ゲッとおもうでしょう。 今回のコードはフォームのコマンドボタンのイベントに!

noname#22222
noname#22222
回答No.2

s_husky です。 1000もある場合は、No1のやり方は不可です。 1、結合したファイルを所定のフォルダに集めます。 2、フォルダのファイル一覧を取得します。 3、ファイルを順次にオープンして1行読んでは1行を統合ファイルに書き出します。 これで、メモリの心配もありません。 結合したいファイル名を書く必要もありません。 多分、2、30行のコードを書く必要があるでしょう。 もちろん、ファイルライブラリの関数が更に増えるでしょう。 これから退勤して犬の散歩をさせて酒を飲みます。 2、30行ですから、酒でも飲みながら書いて投稿します。 その際に、ファイルライブラリ関数の登録要領、それを利用した一挙統合コードを書く場所等も示します。

pochitarou
質問者

お礼

s_huskyさんたびたび、ありがとうございます!! 私もついて行くのに時間がかかりそうなので、ご無理はなさらないで下さいね。笑

noname#22222
noname#22222
回答No.1

幾つかの方法があると思います。 が、合成後のチェックが必要と思います。 Private Sub コマンド0_Click()   DosCommand "Copy C:\Temp\aaa.csv+C:\Temp\bbb.csv C:\Temp\ccc.csv" End Sub このように、DOSコマンドを使えば簡単に合成されます。 が、[aaa.csv] の最後が非改行ですと、[bbb.csv]の先頭とくっつきます。 次のように、一旦、変数に呼び込んで合成すると必要なチェックも可能です。 Private Sub コマンド0_Click()   Dim strTexts(10) As String      strTexts(0) = FileReadAll("C:\Temp\aaa.csv")   strTexts(1) = FileReadAll("C:\Temp\aaa.csv")   FileWrite "C:\Temp\ddd.csv", strTexts(0) & strTexts(1) End Sub なお、ここで使った関数は次のようです。 Public Function DosCommand(ByVal CommandText As String) As Boolean   DosCommand = VBA.Shell(VBA.Environ("COMSPEC") & " /C " & CommandText, 6) End Function Public Function FileReadAll(ByVal FileName As String) As String On Error GoTo Err_FileReadAll    Dim fso As FileSystemObject    Dim fil As File    Dim txs As TextStream       Set fso = New FileSystemObject    Set fil = fso.GetFile(FileName)    Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)    FileReadAll = txs.ReadAll Exit_FileReadAll:    Exit Function Err_FileReadAll:    MsgBox Err.Description & "(FileReadAll)", vbExclamation, " 関数エラーメッセージ"    Resume Exit_FileReadAll End Function Public Function FileWrite(ByVal FileName As String, _              ByVal Text As String) As Boolean On Error GoTo Err_FileWrite   Dim fso As FileSystemObject   Dim txs As TextStream      Set fso = New FileSystemObject   Set txs = fso.CreateTextFile(FileName, True)   txs.Write Text   FileWrite = True Exit_FileWrite:   Exit Function Err_FileWrite:   MsgBox Err.Description & "(FileWrite)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_FileWrite End Function

pochitarou
質問者

お礼

ありがとうございます。 やはり、プログラムを扱う事になるのですね。 これはモジュールというところに記述すればよいのですかね?どうもよくわかりません。すいません。 あと、この方法だと例えばファイルが1000くらいあった場合、その全てをプログラムに記述しなくてはいけなさそうですよね。

関連するQ&A

  • csvファイルをAccessに取り込むとデータ数が増える

    項目をカンマで区切っただけの単純なcsvファイルをAccessでインポートしてテーブルを作成したら、データ数が増えてしまいました。 (csvファイルをテキストで開いたときの行数と、Accessの行数が異なる) 5000件ぐらいなら、csvもAccessもデータ数は同じなのですが、データ数が大きくなると、csvとAccessのテーブルで6万件とかの差分が出てしまいます。 csvファイルとAccessで、データ数を同じにするにはどうしたら良いでしょうか。 参考になるURLでも良いので、教えて頂ければと思います。 よろしくお願いします!

  • Access2000 csvファイルのインポート

    Access2000のVBAを使用してcsvファイルを用意されたテーブルにインポートをしたいのですが、 やっかいな条件があります。 ある決められたフォルダに複数のファイルが存在している、そこから全てのCSVファイルを読み込み、3フィールド目(1行目はタイトル行)の値が「"3"」のものだけインポートする。 あるフィールドには、255文字以上のフィールド(改行文字あり)があります。このフィールドはインポートしてもしなくてもよい 今までは、インポート定義を設定してインポートしていたのですが、csvファイルを判別して、インポート前にフィールドの判別をする方法がわかりません。また、255文字以上の対応もうまくいきません。   

  • Access csvファイルの取り込み

    Access2021 2箇所の保存先の違う所からcsvファイルの取り込みについて伺います。 csv取り込みボタンは、2つ用意しています。 1つ目のボタンに、コード記述して動作確認は正常に動作して他のボタンも正常に動作。 2つ目にのボタンに、csvの格納パス名のみ変更後コード記述して動作確認したら全てのボタンが反応しなくなりました。 動作としては、削除クエリでテーブルのデータを削除してから、指定したフォルダからcsvファイルを選択して取り込ます。 同じテーブルを使用して、格納先の違うcsvファイルを使用する操作になります。 コードは、以下の通りです。 ①ボタン1 Private Sub コマンド61_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名①" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ②ボタン2 Private Sub コマンド62_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名②" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ご教授の程、宜しくお願い致します。

  • CSVファイルの取り込み

    みなさんはじめまして VB初心者です。 個人+仕事で色んなデータをエクセルに納めています。 そのデータ(CSV)をオラクルのデータベースに収めようと思っています。 その為データをオラクルに取り込むプログラムを作ろうと思っていますが、 その前段階として、CSVファイルを取り込みたいのですが、買った入門者 用の本にはそんな事がかかれていなくて、どのように取り込めばいいのかが わかりません。大きな本屋で、それらしいものを探していましたが、見当た らなかったです。(というよりわからなかったと言うのが正解です) どのようにしてCSVファイルを取り込めばいいのでしょうか?

  • Access2000のCSVファイルのインポートについて

    Access2000でCSVファイルをインポートしようと思っています。 インポート方法は、VBAで 「DoCmd.TransferText acImportDelim, , "テーブル名", "ファイル名"」を使用しています。 この時に、CSVファイルが次のようなデータです。 F1,F2,F3 0010,0200,0001A12 0011,0201,0021B12 (実際は、1000件近いデータです) これをインポートすると、 F1,F2,F3 10,200,1A12 11,201,21B12 となってしまいます。 頭の「0」を省きたくないのです。 文字列として取り込めないでしょうか? CSVのデータに""を自動でつける方法はないでしょうか? Accessの外部データの取り込みを使うと、文字列として指定できるのですが、VBAを使いワンクリックでデータを取り込もうとしています。 よろしくお願いします。

  • 任意のCSVファイルをAccessに取り込むには?

    同様の質問が発見できなかったため質問させて頂きます。 アクセスを利用して日々の電力監視のデータを管理しようと思います。 データを出力するシステムの都合で、日々のデータがcsv形式で毎日1ファイル生成されます。 ファイル名は[AT20070925.csv]のような形です。 このファイルをアクセスにインポートする際、ファイル名をダイレクトに指定しなくてもインポートするファイルを指定することは出来るのでしょうか? 具体的には (1)毎日指定した時間にデータを取り込むものとして、本日の(または前日の)ファイル名のデータを取り込む (例えば9月26日0時2分に9月25日のデータ[AT20070925.csv]を自動的にインポートする) (2)処理を行う際に随時指定した日付のファイル名のデータを取り込む (フォームで日付を指定し、例えば9月25日と指定したら[AT20070925.csv]を随時インポートする) インポートするファイル名に変数を使うことは可能なのでしょうか? また実際にはインポートでなくリンクを使用する可能性もあるのですが、リンクでも同じ様な処理は出来るのでしょうか? 良い方法等ありましたらご教授いただければと思います。

  • ACCESSでのCSVデータの自動取り込み

    よろしくお願いします。 ACCESS2000で、CSVファイルの内容に変更があったとき(CSVは他のアプリケーションが任意に更新します)、そのCSVファイルのデータを取り込むことは出来るのでしょうか?

  • 複数のCSVファイルの一括インポートについて

    CSVファイルをインポートしたいと思っているのですが、 複数のファイルをいっぺんに複数のテーブルにインポートする方法が わからず困っています。200行8列の2000ファイルを、 テーブル1,テーブル2,テーブル3・・・・テーブル2000にそれぞれ 1ファイルずつを一回のSQL文でインポートするやり方です。 毎日ほぼ同じ量のデータをインポートする必要がありますので、 2000ファイルをファイル名などの固有の情報を付加し連結して、 1ファイルにしてしまい、1テーブルにインポートする方法だと SELECT文をかけたときに取得する時間がとてもかかってしまうような 気がしますので、、、

    • ベストアンサー
    • MySQL
  • CSVファイル読込みについて

    CSVファイル読込みで困っています。 どなたかご教授をお願い致します。 CSVファイル読込みを行うと、複数行のデータにも関わらず、ネットで調べたプログラムを用いると、1行で読込まれてしまいました。 その原因として、NL(LF)で改行されていたためです。 これをどうにか複数行で読込みを行うための方法はありませんか? NLがある場合、それをvbCrLfに変換してやればよいとは思ったのですが、うまくプログラムを組むことができません。 プログラムをどう組めばよいのか教えて頂けないでしょうか? 以下のサイトを利用させて頂き、読込みを行おうとしました。 http://www.k1simplify.com/vba/tipsleaf/leaf291.html VB初心者なので、どなたかご教授頂けると助かります。 よろしくお願い致します。

  • ExcelVBAでCSVファイル簡単に取り込む

    ExcelVBAでCSVファイル簡単に取り込むコードを教えてください。 OpenコマンドでCSVファイルを開いて、 自分でカンマ毎に切り分けてセルにセットするやり方はできるのですが、 もっと簡単な方法はありませんか? イメージとしてはExcelの「外部データのインポート」機能が近いのですが この機能を使って取り込むと、何やら余計な情報がくっついてしまうようです。 あくまでテキスト情報だけをセルに貼り付けたいのです。 (ちなみに「外部データのインポート」で都合が悪い点は Ctrl+*で65536行目まで選択されてしまうところです。 何行目までデータがあるか?をCtrl+*で調べているためです。 ・・・Range("A65536").End(xlUp)で調べればいいのかもしれませんが・・・) 何か良いやり方をご存知の方はいらっしゃいませんか?