• ベストアンサー

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行ずつ変数に格納する方法にはどのようなものがありますでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

わざわざFSOを使うようなことでもない気がします。 open~closeステートメントでファイルを開いて line inputで読み込めば良いのではないでしょうか。 例文は確かヘルプファイルにあります。 FSOの必要性があったならば、失礼しました。

hitoshipon
質問者

お礼

返事とお礼が遅くなりまして申し訳ありません。 FSOを使ったのは、それしか知らなかったからです(!) 教えていただいた方法であっさりやりたいことができました。 本当にありがとうございます。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

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

hitoshipon
質問者

お礼

ご回答ありがとうございます。 まだまだVBA未熟者でして関数定義は使ったことありませんでした。 今回は#1さんの方法で解決しましたが、便利そうなので覚えておきます。 丁寧にありがとうございました。

回答No.2

元ファイルの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 と宣言して使う方が楽ですよ。

hitoshipon
質問者

お礼

回答ありがとうございます。 ご指示いただいたコードを追加してみましたが、全て-1が返されてしまいました。すでにsskの中で結合されて全ての改行がなくなっているためでしょうか? readallも考えたのですが、結構たくさんデータが増えそうなので躊躇していました。 FSOについても意味をあまり理解しないまま使っているので、教えていただいた方法も今後参考にさせていただきます。 ありがとうございました。

関連するQ&A