dポイントプレゼントキャンペーン実施中!

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

よろしくお願いします。

A 回答 (3件)

わざわざFSOを使うようなことでもない気がします。


open~closeステートメントでファイルを開いて
line inputで読み込めば良いのではないでしょうか。
例文は確かヘルプファイルにあります。

FSOの必要性があったならば、失礼しました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/11 07:06

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/11 07:18

元ファイルの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
と宣言して使う方が楽ですよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/11 07:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!