• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【VBA】【複数ファイルの読み込み】)

【VBA】【複数ファイルの読み込み】

このQ&Aのポイント
  • 23歳OLの質問。VBAで複数ファイルを読み込む際の問題点と解決方法について質問。
  • 問題点1は、Line inputを使用しているが、一行ずつ入力されず、ファイルが一つのセルに入ってしまうこと。問題点2は、複数ファイルを読み込んだ際に、違う列に入るようにしたいが、現在は同じ列に入ってしまうこと。
  • 回答者には、問題点1の解決策として、改行文字を指定して一行ずつ読み込む方法を提案して欲しい。問題点2の解決策として、ファイルごとに列を切り替える方法を提案して欲しい。

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

  • ベストアンサー
回答No.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)
回答No.1

>一行ずつ入力されず、読み込んだファイルが一つのセルの中にすべて入ってしまいます 会社システムやソフト等から出力したテキストファイル(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

joucomi
質問者

お礼

ご返事ありがとうございます。 >会社システムやソフト等から出力したテキストファイル(CSVファイル)で時折発生する 使用しているのはlogファイルとvファイルです。 それでも一緒でしょうか?? >列の指定 こっちはできました!ありがとうございました!(*^。^*)

関連するQ&A

専門家に質問してみよう