- ベストアンサー
Csvから1行ずつ変数に格納するには;
いつもお世話になっています。 次のようなcsvファイルがあります。 会員番号,パスワード,データ1,データ2,データ3 1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB ・ ・ ・ このcsvファイルをExcelのVBAで次のようなコードで読みとろうとしています。 Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFile("csvファイル名") Set ts = f.OpenAsTextStream(1, -2) ssk = ts.readline readlineは1行だけ読み込むと覚えているのですが、なぜか変数sskにはすべての行が連結された状態で格納されてしまいます。 2回目以降のreadlineでは「ファイルにこれ以上データがありません。」と出ます。何か根本的に間違っているのでしょうか;; このようなcsvファイルを、正しく1行ずつ変数に格納する方法にはどのようなものがありますでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
わざわざFSOを使うようなことでもない気がします。 open~closeステートメントでファイルを開いて line inputで読み込めば良いのではないでしょうか。 例文は確かヘルプファイルにあります。 FSOの必要性があったならば、失礼しました。
その他の回答 (2)
1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB 次は、これを1行づつ呼び込んで表示するサンプルコードです。 Private Sub コマンド0_Click() Dim strData As String Do strData = FileRead("C:\Temp\Test.csv") Debug.Print strData Loop Until Len(strData) = 0 End Sub [イミディエイト] 1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB このように1行づつ変数に取り込んでイミディエイトウィンドウに出力しています。 そういうことで FileRead() の類を作成し利用するとコードは簡略化できます。 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 Object Static fil As File Static txs As TextStream If Not isOpen Then isOpen = True Set fso = CreateObject("Scripting.FIleSystemObject") Set fil = fso.GetFile(FileName) Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault) End If FileRead = txs.ReadLine Exit_FileRead: 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
お礼
ご回答ありがとうございます。 まだまだVBA未熟者でして関数定義は使ったことありませんでした。 今回は#1さんの方法で解決しましたが、便利そうなので覚えておきます。 丁寧にありがとうございました。
- fumufumu_2006
- ベストアンサー率66% (163/245)
元ファイルの1行がCRLFでなくCRで終わってるんじゃないでしょうか? ssk = ts.readline の後に Dim d() As String d = Split(ssk, vbCrLf) MsgBox "crlf=" & UBound(d) d = Split(ssk, vbCr) MsgBox "cr=" & UBound(d) d = Split(ssk, vbLf) MsgBox "lf=" & UBound(d) ts.Close '一応 を入れてみてください。 CRLFの個数,CRの個数(CRLFでもカウントされる),LFの個数(CRLFでもカウントされる)を表示します。 マイナス1個だけど。 たいした量でなければ、 ssk = ts.readall で全部読んで、splitで配列に入れて処理する方が楽ですよ。 p.s. FileSystemObjectを使う時は、 Microsoft Scripting Runtime を参照設定して、 dim fs as FileSystemObject と宣言して使う方が楽ですよ。
お礼
回答ありがとうございます。 ご指示いただいたコードを追加してみましたが、全て-1が返されてしまいました。すでにsskの中で結合されて全ての改行がなくなっているためでしょうか? readallも考えたのですが、結構たくさんデータが増えそうなので躊躇していました。 FSOについても意味をあまり理解しないまま使っているので、教えていただいた方法も今後参考にさせていただきます。 ありがとうございました。
お礼
返事とお礼が遅くなりまして申し訳ありません。 FSOを使ったのは、それしか知らなかったからです(!) 教えていただいた方法であっさりやりたいことができました。 本当にありがとうございます。