- ベストアンサー
CSVの読み込み処理について
こんばんわです。 エクセルのVBAをつかってCSV形式のファイルデーターを読み込みように某サイトを参考に作成しました。 確かに読み込む事が出来たのですが、数値も文字列扱いになってしまいます。 数値処理する方法があるのでしょうか? Sub CSV_Read2() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim textline, csvline() As String Dim Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 '1行読み込みます Line Input #ch1, textline 'ダブルクォーテーションを削除します 'カンマ+ダブルクォーテーションで区切られている CSV ファイルなどは '適時追加してください textline = Replace(textline, """", "") 'カンマで分離します csvline() = Split(textline, ",") '配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 もう1つの投稿サイトで完璧な回答がついてますよ。 そちらを参考にされたら良いかと。 『すいませんがVBA初心者ですので』 ...という事らしいので、失礼とは思いますが、その回答内容が理解できない場合は 一般機能で、ワークシートメニュー[データ]-[外部データの取り込み]-[テキストファイルのインポート]を 試されたほうが良いかと思います。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>数値も文字列扱いになってしまいます 当たり前のこと。テキスト形式やCSV形式はそういうものです。 全て情報は(半角・全角)文字列と半角カンマで入ります。 数字も(各機種での)コンピュター内部での計算できる数値は、特別な形式(普通意識しなくて良いが)をしているものですが、それではなくアスキー文字コードなどの文字コードで入ります。コンピュターの基礎的な勉強が不足していると見受けます。 ーー CSVの場合は、対処は数字文字列がどのフィールドかは、ユーザーには既知の話となっている前提です。中身をメモ帳などで見ればわかる話だが。 そして数値の場合は、カンマから、次のカンマまでの数字だけの文字 列を数値化する関数(Val)で数値化する。すると数値演算が可能になるし、書式(NumberFormat)だ適用できるようになる。 VB(A)ならSplit関数、Val関数を使えばよい。 この質問にはそんな長いコード例なんぞ不要と思う。 要点を絞って文章で疑問点を表現して質問のこと。
- xiaolong_goo
- ベストアンサー率29% (39/131)
配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() ↓ Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = val(csvline()) でだめ?
- xiaolong_goo
- ベストアンサー率29% (39/131)
読み込んだ文字になっている数字はVal関数で本来の数値になりますがこれではだめなのかしら?
お礼
早速のご回答ありがとうございます。 すいませんがVBA初心者ですので具体的にどうすればいいのかご教授いただければ有難いです。