• ベストアンサー

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

noname#63196
noname#63196

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

こんにちは。 もう1つの投稿サイトで完璧な回答がついてますよ。 そちらを参考にされたら良いかと。 『すいませんがVBA初心者ですので』 ...という事らしいので、失礼とは思いますが、その回答内容が理解できない場合は 一般機能で、ワークシートメニュー[データ]-[外部データの取り込み]-[テキストファイルのインポート]を 試されたほうが良いかと思います。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>数値も文字列扱いになってしまいます 当たり前のこと。テキスト形式やCSV形式はそういうものです。 全て情報は(半角・全角)文字列と半角カンマで入ります。 数字も(各機種での)コンピュター内部での計算できる数値は、特別な形式(普通意識しなくて良いが)をしているものですが、それではなくアスキー文字コードなどの文字コードで入ります。コンピュターの基礎的な勉強が不足していると見受けます。 ーー CSVの場合は、対処は数字文字列がどのフィールドかは、ユーザーには既知の話となっている前提です。中身をメモ帳などで見ればわかる話だが。 そして数値の場合は、カンマから、次のカンマまでの数字だけの文字 列を数値化する関数(Val)で数値化する。すると数値演算が可能になるし、書式(NumberFormat)だ適用できるようになる。 VB(A)ならSplit関数、Val関数を使えばよい。 この質問にはそんな長いコード例なんぞ不要と思う。 要点を絞って文章で疑問点を表現して質問のこと。        

回答No.2

配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() ↓ Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = val(csvline()) でだめ?

回答No.1

読み込んだ文字になっている数字はVal関数で本来の数値になりますがこれではだめなのかしら?

noname#63196
質問者

お礼

早速のご回答ありがとうございます。 すいませんがVBA初心者ですので具体的にどうすればいいのかご教授いただければ有難いです。

関連するQ&A

  • \記号が入った数値の処理について(VBA)

    はじめまして。 excel2013でcsvの読み込みをVBAで自動化させようとしています。 基となるCSVファイルに\記号が含まれておりファイルを読み込むと文字列として読まれてしまいまい、エラーインジケータが表示されます。 文字と読み込まれているので計算もできないでいます。 数値に置き換える方法として考えられる事はないでしょうか? ご教授お願いいたします。 ------------------------------- ソース Sub Read() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim csvline() As String Dim i, 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 '1行あたりの項目数を取得します ColumNum = GetItemNum(FileNamePath) 'csvlineを1行あたりの項目数で再割り当てます ReDim csvline(1 To ColumNum) '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 For i = 1 To ColumNum Input #ch1, csvline(i) '1行の項目数だけ読み込みます Next '配列渡しでセルに代入 この方が早い Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub 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 Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function ----------------------- CSVファイル \101,\101,\101

  • エクセルVBAでのCSV出力方法について

    エクセルVBAを使ってCSVを出力しようとしているのですが、 狙った範囲を上手くCSV化することが出来ずに苦戦しています。 どなたかアドバイスを頂けませんでしょうか。 使用してるエクセルは2010になります。 シート2のコマンドボタンを押すことでシート1の内容をCSV化したいと考えています。 シート1のA1に入力した内容がCSVのタイトルになります。 2行目はヘッダーですが、CSVには反映しないように制御をかけています。 ↓が実際に書いてみたVBAですが、どうしてもシート1の内容を持ってきてしまいます。 どのように改修したらシート2の内容を持ってこれるでしょうか。 Private Sub CommandButton1_Click() Dim MyFile, FileType, Prompt As String Dim FileNamePath As Variant Dim StartRow, StartCol, EndRow, EndCol As Integer Dim Rowcnt, Colcnt As Integer Dim UsedCell As Range Dim ch1 As Long '対象のシートをアクティブにする Worksheets("シート1").Activate 'ファイル名の取得 MyFile = ActiveSheet.Range("A1") & ".csv" FileType = "CSV ファイル (*.csv),*.csv" Prompt = "保存するファイルの名前を付けてください" '保存するファイルのパスを取得します FileNamePath = SaveFileNamePath(MyFile, FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Output As #ch1 '使用しているセルの取得 Set UsedCell = ActiveSheet.UsedRange StartRow = UsedCell.Cells(3).row StartCol = UsedCell.Cells(1).Column EndRow = UsedCell.Cells(UsedCell.Count).row EndCol = UsedCell.Cells(UsedCell.Count).Column For Rowcnt = StartRow To EndRow For Colcnt = StartCol To EndCol - 1 '改行を挿入しないで書き出す ; を最後に付ける Write #ch1, Cells(Rowcnt, Colcnt); Next '改行を挿入する Write #ch1, Cells(Rowcnt, EndCol) Next 'ファイルを閉じます Close #ch1 End Sub Function SaveFileNamePath(MyFile, FileType, Prompt) As Variant SaveFileNamePath = Application.GetSaveAsFilename(MyFile, FileType) End Function アドバイスを頂けたらと思います。 どうぞ宜しくお願いします。

  • このようなエクセルマクロを作りたいのですが・・・

    ,で区切られたasc形式のファイルを、エクセル上に出力したいです。 ファイルは大体12万行くらいあります。 やりたいこと) 1. 任意のファイルを読み込む。 2. ,毎に区切って「数値」として出力する。(,は2つあるので、データはABC列に出力されることになります) 3. 32000行を越えたら、DEF列に出力する。 4. DEF列でも再び32000行(合計64000行読み込んだ)を越えたらGHI列に・・・ 5.データがなくなったら終了 ということがやりたいです。 現在、ファイルを読み込んで区切るところまでは出来たのですが、3のところで躓いています。ソースを書いておきますので、どのようにやればいいのでしょうか? 途中で、IF Rowcnt > 32000 then・・・とやると上手くいきそうなのですが、様々なエラーに阻まれてお手上げです・・・ また、このマクロで出力すると、必ず「文字列」として出力されてしまうのですが、どうやれば最初から「数値」として出力してくれるのでしょうか?どこか宣言を誤ったのでしょうか・・・ つたない文章ですが、ご指導のほどよろしくお願いいたします。 Sub CSV_Read() Dim FileType, Prompt As Variant Dim FileNamePath As Variant Dim csvline() As String Dim i, Rowcnt, ColumNum As Integer Dim ch1 As Variant FileType = "asc ファイル (*.asc),*.asc" Prompt = "ファイルを選択してください" FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then End End If ColumNum = GetItemNum(FileNamePath) '1行あたりの項目数を取得します ReDim csvline(1 To ColumNum) 'csvlineを1行あたりの項目数で再割り当て ch1 = FreeFile Open FileNamePath For Input As #ch1 'FileNamePath のファイルをオープンします On Error GoTo CloseFile Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認。 For i = 1 To ColumNum Input #ch1, csvline(i) '1行の項目数だけ読み込み Next Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: Close #ch1 End Sub

  • CSVファイルの読み込み

    お世話になります。 VBAでCSVファイルを読み込んで処理をしたいのですが、 たとえば下記のようなCSVファイルの場合 2つめの項目が金額セットされており、あらかじめ通貨編集(カンマ編集) がされていて 金額を1つの項目として読み込む事が出来ません。 金額は""でくくってあるのですが、 カンマ区切りのデータと""でくくってあるデータを うまく区別して3つの項目をそれぞれ抽出する事は可能でしょうか? -----以下CSVの内容------ 日付,金額,データ 2007/03/09,"1,200",TEST1 2007/03/09,"12,200",TEST2 2007/03/09,"76,00",TEST3 2007/03/09,"4,5600",TEST4 --------------------------- ちなみに現在はこのようにカンマ区切り指定でデータを抽出してるので うまく出来ません。   'FileNameにはオープンするファイル名がセットされています   Open FileName For Input As   'textlineに1行を読み込む   Line Input #ch1, textline   csvline() = Split(textline, ",") VBAがまだ不慣れな為質問やサンプルが分かりずらいと思いますが よろしくお願いします。

  • ジャグ配列生成時の1オリジン

    ExcelVBAで、CSVFileを取込み、シートを介さずに 配列へ格納する処理をしています。 尚、一行のデータの数が変わる可能性があるため、 ジャグ配列にしています。  Dim FileNamePath As Variant 'CSVファイルパス  Dim CSVFile() As Variant  Dim ch1 As Long  Dim RowCnt As Long ~略~  ch1 = FreeFile  Open FileNamePath For Input As #ch1  RowCnt = 1  Do While Not EOF(ch1)   ReDim Preserve CSVFile(RowCnt)   Line Input #ch1, CSVFile(RowCnt)   CSVFile(RowCnt) = Replace(CSVFile(RowCnt), """", "")   CSVFile(RowCnt) = Split(CSVFile(RowCnt), ",")   RowCnt = RowCnt + 1  Loop ~略~ この時、後の処理でやりやすくするために配列の添字を 1からにしたく、行の添字となるRowCntを1としています。 同様に列となる添字も1からとしたくて、モジュールの宣言にて 「Option Base 1」としましたが、上記コードでジャグ配列を 生成すると、(多次元配列で言う)2次元目の添字は 0からとなってしまいます。  例:CSVFile(1)(0) このような状況で、ジャグ配列でも1オリジンとするには どのようにすれば良いのでしょうか。 宜しくお願い致します。

  • ExcelVBAで、隠しフォルダにあるファイルに書き込みする方法

    お世話になります。 ExcelVBAで、ネットワーク上の隠しフォルダ(....$で開く ことができる場所のことです)に、テキストファイルの書き 込みをしたいのですが、outputのところで『パス名が無効です』と 表示され、書き込みを行うことができません。 inputで読み込みを行う際には問題なくできるのですが、どうして 書き込みはできないのでしょうか。 原因と対処法を教えてください。 下記が、その例です。 Public Function readText(ByVal stFileName) As String Dim ch1 As Long Dim textline As String Dim stAllText As String readText = "" '空いているファイル番号を取得します ch1 = FreeFile Close #ch1 'FileNamePath のファイルをオープンします Open stFileName For Input As #ch1 'エラーが発生したらファイルを閉じます On Error GoTo Err_readText stAllText = "" '最初に1行だけ読み込む Line Input #ch1, textline stAllText = textline Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 '1行読み込みます Line Input #ch1, textline ' 文字列を連結する。 stAllText = stAllText & vbCrLf & textline Loop Close #ch1 readText = stAllText Exit Function Err_readText: Close #ch1 MsgBox Err.Description, vbExclamation, sysName End Function ↑↑↑readは成功します。 Public Function writeText(ByVal stFileName, ByVal stBuff) As Boolean On Error GoTo ErrMsg ' ファイルポインタ Dim n As Long n = FreeFile Open stFileName For Output As #n  ← ここでエラーになる。 Print #n, stBuff Close #n writeText = True Exit Function ErrMsg: ' エラー時処理 MsgBox Err.Description, vbCritical, sysName writeText = False End Function ↑↑↑書き込みではエラーになります。 以上、よろしくお願いいたします。

  • Excelで作成されたCSVのVBでの読み込み

    いつもお世話になっております。 Excel2K、2002を使用しております。 Excelで作成されたCSVファイルをVBAで読み込もうと、以下の関数を作成しました。 Public Function CsvRead(ByVal FileName As String)   Dim IntFileNum As Integer 'ファイル番号   Dim TmpStr As String '   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Input #IntFileNum, TmpStr     '     '~その他の処理~     '   Loop   Close End Function その他の処理中で特定の列に対し、特殊な処理を行う必要があるのですが ExcelでCSVファイルを作成する場合、16行単位でカンマの変動が起こりえますので、 http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B400253 正確な列が取れません。 そこで1行読み込んでカンマで分解すればよいかと思い、 以下のように読み込んでみたのですが、、   Dim TmpStr() As String '   Dim LineStr As String   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Line Input #IntFileNum, LineStr     TmpStr = Split(LineStr, ",")     '     '~その他の処理~     '   Loop 値にカンマが存在する場合も区切ってしまうので これも正しく取れませんでした。 値のカンマは区切り文字として判定せず、 正しく値を取得するにはどのようにすればよいでしょうか。 上記のことをふまえた判定をすべて行うしかないでしょうか。 ご教授のほど、よろしくお願いいたします。

  • CSVファイルの読み込みVBA作成について

    初めまして。 色々インターネット等で検索して作成してみたのですが、 ここから先のプログラムが組めないので、 やり方を教えて頂けますと幸いです。 おそらくIf Elseで場合訳すると思うのですが、 上手くできてません。 下記、プログラムの概要です。 (1)フォルダを指定し、そのフォルダにある全てのCSVファイルを読み込む。 (2)CSVファイルを読み込む際には、「*.csv」の「*」部分をワークシート名とし、CSVファイルの内容をワークシートに書き込む。 例)「test.csv」の場合、ワークシート名は「test」になります。 (3)既にブックにワークシート名がある場合は上書き処理を行い、ない場合は新規に作成する。 例)既に「test」ワークシートがある場合は、内容の上書きを行います。 (4)ワークシートを追加する際は、今あるワークシートの最後に追加する。 下記に現在作ったプログラムを記載します --------------------------------- Sub csvRead() Dim FoldPath As String Dim f Dim ch1 As Long Dim r As Long Dim textLine As String Dim csvLine() As String Dim i As Long Dim FSO Dim folderSelect As Object Set folderSelect = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0) If Not folderSelect Is Nothing Then FoldPath = folderSelect.Self.Path 'フォルダ選択 End If Set FSO = CreateObject("Scripting.FileSystemObject") i = Worksheets.Count '現在のワークシート数を格納 For Each f In FSO.GetFolder(FoldPath).Files If StrConv(Right(f.Path, 4), vbLowerCase) = ".csv" Then ch1 = FreeFile Open f.Path For Input As #ch1 r = 1 Worksheets.Add after:=Worksheets(i) With ActiveSheet .Name = Left(f.Name, Len(f.Name) - 4) Do While Not EOF(ch1) Line Input #ch1, textLine If textLine <> "" Then csvLine() = Split(textLine, ",") .Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine() End If r = r + 1 Loop End With i = i + 1 Close #ch1 End If Next End Sub

  • エクセルのCSV読み込みについて

    現在,以下の記述でエクセル上にマクロ実行ボタンを作成しました。 任意のCSVファイルをエクセルに取り込み利用する目的です。 実行ボタンを押すと,「実行時エラー ファイルにこれ以上データがありません。」として,記述中の 「Input #intFF, X(1), X(2), X(3), X(4), X(5), X(6), X(7) ' (2)」 部分が黄色になって止まってしまいます。 エクセル画面上には,希望通りのデータが出力されているようなので,このエラーが表示されなければデータの取り込みとしては問題ないのですが・・・。 どのようにこのエラーを回避し処理すればよいかかが分かりません。 どなたかご教示いただければ幸いです。 どうかよろしくお願いいたします。 Sub Macro4() ' CSV形式テキストファイル(7カラム)読み込みサンプル Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "CSV形式ファイル (*.csv),*.csv,全てのファイル(*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim X(1 To 7) As Variant ' 読み込んだレコード内容 ' (1) Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' レコードを読み込む(このサンプルは7項目のCSV) Input #intFF, X(1), X(2), X(3), X(4), X(5), X(6), X(7) ' (2) ' 行を加算しA~G列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 Range(Cells(GYO, 1), Cells(GYO, 7)).Value = X ' 配列渡し ' (3) Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • VB6.0 CSVファイル読み込みについて

    VB6.0について質問です。 CSVファイルの読み込みを行いたいのですがうまくいきません。。。 以下のソースのどこに問題ありますでしょうか?>< 14個のカンマ区切りのCSVファイルを読み込んでいますが ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。 ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。 しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでした。。。 以下のソースで実行すると改行部でエラーになるようです。 改行を無視するようなロジックを入れる必要があるのでしょうか? Dim MyString(), i Open App.path & "\" & CSV_filename For Input As #1 ReDim MyString(13) Do While Not eof(1) Input #1, MyString(i) Label4(i).caption = MyString(i) i = i + 1 Loop Close #1

専門家に質問してみよう