質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1579閲覧

VBAでエクセルにデータ型を指定してCSVをインポートする際に項目行もインポートしたい

singlestroke

総合スコア68

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/04/06 23:43

やりたいこと

エクセル(2019)にCSVファイルをVBAで項目のデータ型を指定してインポートしたい。
CSVファイルは1行目に各項目があり、2行目以降がデータ行となっている。
2行目以降をインポートするということはできた。
1行目からインポートしたいが、インポートしようとするとエラーとなってしまう。

現状のコード

VBA

1Sub Import() 2 Dim buf As String, tmp As Variant, n As Long 3 Close #1 4 Open "C:\vba\sample.csv" For Input As #1 5 Do Until EOF(1) 6 Line Input #1, buf 7 tmp = Split(buf, ",") 8 n = n + 1 9 '応募日時 10 Cells(n, 1).Value = DateValue(tmp(0)) 11 '年齢 12 With Cells(n, 2) 13 .NumberFormat = "@" 14 .Value = tmp(1) 15 End With 16 '生年 17 With Cells(n, 3) 18 .NumberFormat = "@" 19 .Value = tmp(2) 20 End With 21 '姓 22 Cells(n, 4).Value = tmp(3) 23 '名 24 Cells(n, 5).Value = tmp(4) 25 Loop 26 Close #1 27End Sub

表示されるエラー

実行時エラー'13':
型が一致しません

おそらく、2行目以降のデータのデータ型を指定してしまっているため、文字型である1行目の項目名がデータ型が一致せず読み込めないのかと思われます。

CSVファイルの1行目から読み込める方法を教えていただけますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

いろいろ方法はあります。

1行目は書式設定しないようにするとか。nで行数を判定できます。

vba

1 Do Until EOF(1) 2 Line Input #1, buf 3 tmp = Split(buf, ",") 4 n = n + 1 5 '応募日時 6 Cells(n, 1).Value = DateValue(tmp(0)) 7 '年齢 8 With Cells(n, 2) 9 If n > 1 Then .NumberFormat = "@" 10 .Value = tmp(1) 11 End With 12 '生年 13 With Cells(n, 3) 14 If n > 1 Then .NumberFormat = "@" 15 .Value = tmp(2) 16 End With 17 '姓 18 Cells(n, 4).Value = tmp(3) 19 '名 20 Cells(n, 5).Value = tmp(4) 21 Loop

あるいは、書式指定せずにすべて読み込んでから、2列目、3列目の2行目以降はまとめて書式設定するとか。
こちらの方が1セルずつ書式設定するより高速です。

vba

1Do Until EOF(1) 2 3’ 略 4 5Loop 6 7Dim rng As range 8Set rng = Cells(1,1).CurrentRegion 9Set rng = rng.Offset(1, 1).Resize(rng.Rows.Count - 1, 2) 10rng.NumberFormat = "@"

追記

コメントで指摘がありましたが、
Cells(n, 1).Value = DateValue(tmp(0))
でDateValueがエラーの原因ですね。
日付にならない文字列だとエラーになります。
そもそも DateValue は必要ないです。
日付と判断できる文字列ならExcelが自動で日付にしてくれますので。

必用なら上記の後の方法であとから書式設定すればいいでしょう。

投稿2021/04/07 00:35

編集2021/04/07 01:06
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xail2222

2021/04/07 00:40

書式設定でエラーはでなかったはず。DateValueでエラーが出てるのでは?
hatena19

2021/04/07 01:08

なるほど、そのようですね。そこを見落としてました。 そもそも DateValue は必要ないですよね。Excel君がよしなにしてくれますので。 回答に追記しておきました。
guest

0

n = n + 1
の行の後で、
①n=1のケースと
②それ以外のケースに分けて処理する。

①では、項目行の処理なので、それを記述する。
②は、従来の記述の部分を使用する。

このようにすれば、良いと思いますが、いかがでしょうか。

投稿2021/04/07 00:29

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問