- ベストアンサー
【VBA】【複数ファイルの読み込み】
- 23歳OLの質問。VBAで複数ファイルを読み込む際の問題点と解決方法について質問。
- 問題点1は、Line inputを使用しているが、一行ずつ入力されず、ファイルが一つのセルに入ってしまうこと。問題点2は、複数ファイルを読み込んだ際に、違う列に入るようにしたいが、現在は同じ列に入ってしまうこと。
- 回答者には、問題点1の解決策として、改行文字を指定して一行ずつ読み込む方法を提案して欲しい。問題点2の解決策として、ファイルごとに列を切り替える方法を提案して欲しい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
そのLogファイルやVファイルをメモ帳で開いてみてください。 改行されていなくてグチャっと表示されたなら 改行コードは CRLF ではありません。 Windowsのオマケソフトのワードパッドで開いて 改行されているなら ファイルの内容は何も変更せず別名で保存してから マクロの処理を行ってみてください。 (念のためオリジナルに上書きしない) ここまで問題なかったら VBA では ADODB.Stream を使って開きます。 https://msdn.microsoft.com/ja-jp/library/cc364272.aspx そのファイルの拡張子を、txt に変更して IE にドロップ IE上で右クリックし、エンコードからどれが選択されているかを確認します。 もし、正しく表示されていない場合は、 その他から正しく表示されるエンコードを調べます。 (あるいはファイルの作成者・作成アプリの製作者に確認) Sub adodbStream() '要参照設定ActiveX DataObjects Library 2.5以上 Dim strmFrom As ADODB.Stream Dim sTmp As String Set strmFrom = New ADODB.Stream With strmFrom .Charset = "Shift_JIS" 'ここは確認したエンコード UTF-8 など .LineSeparator = adLF '#1さんに教えてもらった改行コードを調べる方法で、ADCR, ADLF, ADCRLFの三択 .Open .LoadFromFile "読み込みたいファイルのフルパス" End With Do Until strmFrom.EOS sTmp = strmFrom.ReadText(adReadLine) Debug.Print sTmp '確認用にイミディエイトウィンドウに出力 End If Loop strmFrom.Close: Set strmFrom = Nothing End Sub ご参考まで。
その他の回答 (1)
- keithin
- ベストアンサー率66% (5278/7941)
>一行ずつ入力されず、読み込んだファイルが一つのセルの中にすべて入ってしまいます 会社システムやソフト等から出力したテキストファイル(CSVファイル)で時折発生する問題ですが、改行コード(一行の終わりを示す文字)が異なっています。 通常のウィンドウズ標準テキストでは、改行コードとしてvbcrlf(char(13)+char(10)の2文字)が記入されています。でも違う改行コード(例えばvblfしか記入されていない)の場合などでは、そのままでは一行終わりの識別が出来ないので、Line Inputすると最後まで一気読みしてしまうといった状況が起こります。 対策としてはテキストファイル(CSVファイル)をエディタで開いて改行コードをウィンドウズ標準に変換するか、若しくはあなたがご自分でテキストファイルを分析して改行コードを調べ、丸っと読み込まれてしまったテキスト文字列を該当の改行コードでsplitするような手順を組んでください。 作成例: sub macro1() dim buf as string dim a as variant open "c:\test\sample.csv" for input as #1 line input #1, buf a = split(buf, vblf) ’例えば改行コードがchar(10)だった場合 cells(1, 1).resize(ubound(a),1) = application.transpose(a) close #1 end sub 改行コードを調べる: 実際のテキストと見比べて改行コード位置の文字コードを確認する sub test() dim fso as object, buf as string, i as long set fso = createobject("Scripting.FileSystemObject") with fso.getfile("C:\test\test.csv").openastextstream buf = .readall .close end with for i = 1 to len(buf) cells(i, "A") = mid(buf, i, 1) cells(i, "B") = asc(mid(buf, i, 1)) next i end sub >複数ファイルを1、2、3、と読み込んだ際A列,B列,C列と違う列に入って行ってほしい 指定列を指定しなきゃダメですね。 dim c as long ’列カウンタ ' [[ ファイルパス取得できたら ]] c = 0 For Each Filename In varFileName open filename for input as #1 c = c + 1 do until eof(1) line input #1, buf Cells(n, c) = buf ’列を指定する loop close #1 next
お礼
ご返事ありがとうございます。 >会社システムやソフト等から出力したテキストファイル(CSVファイル)で時折発生する 使用しているのはlogファイルとvファイルです。 それでも一緒でしょうか?? >列の指定 こっちはできました!ありがとうございました!(*^。^*)