いつもお世話になっています。
次のような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行ずつ変数に格納する方法にはどのようなものがありますでしょうか。
よろしくお願いします。
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
ご回答ありがとうございます。
まだまだ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
と宣言して使う方が楽ですよ。
回答ありがとうございます。
ご指示いただいたコードを追加してみましたが、全て-1が返されてしまいました。すでにsskの中で結合されて全ての改行がなくなっているためでしょうか?
readallも考えたのですが、結構たくさんデータが増えそうなので躊躇していました。
FSOについても意味をあまり理解しないまま使っているので、教えていただいた方法も今後参考にさせていただきます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでcsvのフィールドが減る
-
文字コードの違うファイルイン...
-
EXCEL|csvで保存→開くcsvを閉じる
-
VBA 毎日取得するデータを反映...
-
カンマ区切りのCSVファイルから...
-
複数のcsvファイルをフォルダご...
-
CSVの読み込み処理について
-
VBAのVLOOKUPで。検索範囲で列...
-
<csv>複数条件で検索・抽出し、...
-
VBAでcsvファイルを読み込んで...
-
データ解析ソフトRでのファイル...
-
CSV形式での保存時に”文字列...
-
VBA一覧取得 再投稿
-
ファイルのアクセス回数について
-
ファイル名と同名のフォルダを...
-
簡単なexeファイルの作り方。
-
Excel VBA で フォルダ名の一部...
-
Excel VBAでテキストファイルを...
-
VB6でExcelシートのコピー、貼付け
-
【マクロ】ファイル名の日付に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
csvファイル 項目数取得
-
CSV形式での保存時に”文字列...
-
マクロから出力されるcsvのダブ...
-
csvファイルでの日付設定「yyyy...
-
複数のcsvファイルをExcelに一...
-
バッチでCSVを処理する時、空の...
-
エクセルVBA 大容量CSVファイル...
-
データ解析ソフトRでのファイル...
-
VBAでcsvファイルを読み込んで...
-
csvファイルのデータの一部を取...
-
複数のCSVファイルのAccessテー...
-
CSVファイル作成
-
【C#】パス名で無効な文字
-
csvファイルのデータの間引きを...
-
エクセル形式のファイルの読み込み
-
csvファイルを列数ごとに分割す...
-
CSVファイルの項目行を削除...
-
【エクセル マクロ】読み込ん...
-
c#でcsvから指定の1行だけを読...
おすすめ情報