
今仕事で、CSVファイルが400ファイル程あり、これを一つの
エクセルファイルにまとめなくて加工しなければならないのですが
うまいことVBAを活用して効率的にできないか思案中なのですが
うまい具合に行きません。
データの持ち方として
○CSVファイル1
1.AAA
2.BBB
○CSVファイル2
3.CCC
4.DDD
となっており、これを1つのエクセルファイル上で
1.AAA
2.BBB
3.CCC
4.DDD
としたいのですがなにかいい方法はないでしょうか?
1つのブックで外部データの取り込みでCSVを次々に選択して
いくVBAなんてあれば教えていただけないでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんにちは。
昔書いた事があるサンプルです。
同一フォルダにあるcsvファイルをまとめて処理します。
Sub CSVまとめsample()
Dim MyObj As Object
Dim MyFol As String
Dim MyFnm As String
Dim MyStr As String
Dim i As Long
Dim n As Long
Dim n1 As Long
'フォルダを選択する
Set MyObj = CreateObject("Shell.Application") _
.BrowseForFolder(0, "SelectFolder", 0)
'選択なければ処理を抜ける
If MyObj Is Nothing Then Exit Sub
MyFol = MyObj.self.Path & "\"
MsgBox MyFol & "を処理します。"
Set MyObj = Nothing
Application.ScreenUpdating = False
'ThisWorkbookにシートを追加して処理
With Sheets.Add
'Dir関数を使って指定フォルダ内csvファイルを順次処理
MyFnm = Dir(MyFol & "*.csv")
Do Until Len(MyFnm) = 0&
i = i + 1
'データエリアを取得してセット先を変更
n = IIf(n = 0, 1, n + n1)
'外部データ取り込みを利用
With .QueryTables.Add(Connection:="TEXT;" & MyFol & MyFnm, _
Destination:=.Range("B" & n))
.AdjustColumnWidth = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileCommaDelimiter = True
.Refresh False
n1 = .ResultRange.Rows.Count
.Parent.Names(.Name).Delete
.Delete
End With
'ファイル名をA列にセット
.Range("A" & n).Resize(n1).Value = MyFnm
'次のファイルへ
MyFnm = Dir()
Loop
End With
If i > 0 Then
MyStr = i & "個のファイルを処理しました。"
Else
'検索結果が0なら
MyStr = "検索条件を満たすファイルはありません。"
End If
Application.ScreenUpdating = True
MsgBox MyStr
End Sub
#シート行数をオーバーした時のエラー処理などはしてないので
#うまくいかなかったらごめんね^ ^;
教えていただきましたサンプルを使わせていただいた結果うまく
すべてのファイルを処理することができ、お蔭様でひたすら作業
をしなくて済みました。
どうもありがとうございました。
No.3
- 回答日時:
#1の蛇足の補足ですが、Excelでのcsvファイル読み込みは結構重い処理です。
http://park7.wakwak.com/~efc21/cgi-bin/exqaloung …
[外部データ取り込み]は比較的速いですが、
複数ファイル処理時は、Table定義や名前定義の削除などに気をつけなければなりません。
コーディングの手間を考えると、cmd.exeを使うのも一つの方法です。
windowsメニューから[ファイル名を指定して実行]
コマンドプロンプトに
copy /b d:\test\*.csv d:\ketugou.csv
と入力して[Enter]
Dドライブのtestフォルダの拡張子csvファイルを、 Dドライブ直下のketugou.csvとしてまとめて
バイナリモードでコピー...というコマンドです。
これで1つにまとめたファイルをExcelに読み込めば良いかと。
VBAで実行するなら
Sub CSV結合()
Const CRFILE As String = "D:\ketugou.csv"
Dim obj As Object
Dim arg As String
Set obj = CreateObject("Shell.Application") _
.BrowseForFolder(0, "SelectFolder", 0)
If obj Is Nothing Then Exit Sub
arg = obj.self.Path & "\*.csv "
Set obj = Nothing
Call Shell(Environ("ComSpec") & " /c copy /b " & arg & CRFILE)
End Sub
(Excelに読み込む前のまとめるところまでです)
参考まで。
No.2
- 回答日時:
CSVファイルの数が多いだけで、問題自体平凡な内容で、WEBや本に類似例が載っています。
(1)拡張子だCSVファイルに統一だれているか
でない場合、手作業で統一できるか。
(2)CSVファイルは1つのフォルダの中にまとまっているか。
2,3までなら同じことの繰り返しで対処できるでしょうが。
(3)CSVファイルは1つのフォルダの中にまとまっているとして、そのフォルダには他のファイル形式のファイルが混在するか
(4)最悪の場合、CSVファイルの名前のリストがエクセルの例えばA列の400行に作れるか。
ーー
(1)(2)(3)が都合よい状態として
(A)VBのDir関数の利用(既回答)
(B)VBscりpt的に処理
ーーー
Sub test02()
Set objFS = CreateObject("Scripting.FileSystemObject")
' フォルダーの名称を取り出す
strFDIRNAME = CurDir
' GetFolderで、フォルダーオブジェクトを取得します
Set objdir = objFS.GetFolder(strFDIRNAME)
MsgBox objdir
' Filesコレクションにアクセスする
For Each objFILE In objdir.Files
strFname = objFILE.Name '取り出したobjFILEの.Nameを取得
If Right(strFname, 4) = ".csv" Then '.csvなら処理
MsgBox strFname
'処理
Else
End If
Next
End Sub
処理の方法として
(X)Open Input方式
(Y)VBScript式のOpenてxtFile
が缶上げられる(下記)
ーーー
Sub test02()
Set objFS = CreateObject("Scripting.FileSystemObject")
' フォルダーの名称を取り出す
strfdirname = CurDir
' GetFolderで、フォルダーオブジェクトを取得します
Set objdir = objFS.GetFolder(strfdirname)
MsgBox objdir
' Filesコレクションにアクセスする
For Each objFILE In objdir.Files
strfname = objFILE.Name '取り出したobjFILEの.Nameを取得
If Right(strfname, 4) = ".csv" Then '.csvなら処理
MsgBox strfname
'処理
MsgBox strfdirname & "\" & strfname
Set objTS = objFS.OpenTextFile(strfdirname & "\" & strfname)
While objTS.AtEndOfStream = False
mytext = objTS.readline
MsgBox mytext
'各行処理
'Split関数で、カンマで分離
'エクセルへの取り込み処理
Wend
Else
End If
Next
End Sub
ーーー
'エクセルへの取り込み処理については、
http://ncdomino.notescons.gr.jp/ncDisc.nsf/1e288 …
他多数あり参照。
検索キーワード Createobject excelapplication
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで複数の他のファイルから...
-
エクセル2003 CSVファイルの取...
-
Excel2002のおせっかい機能につ...
-
Excelで、他のExcelファイルか...
-
OUTLOOKのスケジュール...
-
Excelで、任意のCSVファイ...
-
日付の入ったタイトルのファイ...
-
EXCELで外部データの取り込みが...
-
「ほかのアプリケーションを無...
-
Excelのグラフ、データ範囲につ...
-
Excel VBAを使った複数のCSVフ...
-
VBAでパスを取得しファイル名を...
-
エクセルの指数を無効にしたい
-
エクセルマクロで、他ブックの...
-
エクセルVBAで質問です
-
ファイル名を今日の日付、時刻...
-
【マクロ】宣言は、何のために...
-
エクセルシートをまとめて印刷...
-
複数のデータ系列の線の太さを...
-
ピボットグラフの書式の固定に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数のCSVファイルを横に並べて...
-
excelインポート時の「実行時エ...
-
エクセルの指数を無効にしたい
-
VBAでCSVの1行目だけを書き換え...
-
「ほかのアプリケーションを無...
-
複数のcsvファイルを1つのEXCEL...
-
EXCELにcsv形式の外部データを...
-
VBAでユーザーフォーム上に参照...
-
複数個のascファイルを1つ...
-
【エクセル VBA】CSVファイルの...
-
二つのCSVファイルを照らし合わ...
-
【VBA初心者】同じフォルダ内の...
-
EXCELLの動きが遅い
-
CSVファイルの結合(重複データ...
-
Excel VBAを使った複数のCSVフ...
-
大量のCSVデータを1つのエ...
-
datファイル→csvファイル→datフ...
-
Accessにエクセルからデータを...
-
エクセルの並べ替えが・・・
-
複数のCSVファイルからのデータ...
おすすめ情報