- ベストアンサー
ExcelVBAでCSVファイル簡単に取り込む
- ExcelVBAを使用してCSVファイルを簡単に取り込む方法を教えてください。
- Openコマンドを使用してCSVファイルを開き、セルにカンマごとに切り分けてセットする方法はありますが、もっと簡単な方法はありませんか?Excelの「外部データのインポート」でも取り込むことができますが、余計な情報がセルに貼り付けられてしまうため、純粋にテキスト情報のみをセルに貼り付けたいです。
- 「外部データのインポート」ではCtrl+*で65536行目まで選択されてしまうため、データのある行数を調べるためにRange("A65536").End(xlUp)を使用しています。しかし、より良い方法があれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「外部データの取り込み」は比較的簡単で高速だと思いますけどね。 >この機能を使って取り込むと、何やら余計な情報がくっついてしまうようです。 QueryTableの定義情報は削除する事ができます。 With ActiveSheet.QueryTables.Add(..) : .Refresh BackgroundQuery:=False 'MsgBox .ResultRange.Rows.Count '※2 '.Parent.Names(.Name).Delete '※1 .Delete End With Refreshメソッドでデータを取り込んだ直後にQueryTableを削除すれば テキスト情報のみになります。 Excelのバージョンが2003sp3よりも下位の場合は※1の名前定義削除も必要。 >Ctrl+*で65536行目まで選択されてしまうところです。 Ctrl+Shift+*のショートカットキーですよね。 CurrentRegionの選択ですから、通常はそのような挙動にはならないはずなんですが。 新規Sheetに取り込んでも同様ですか? 必要であれば※2 .ResultRange.Rows.Count で取り込んだデータ行数を得る事はできます。
その他の回答 (2)
- queuerev2
- ベストアンサー率78% (96/122)
No.1です。 >csvファイルの「001」が取り込み後は「1」と表示されてしまったのですが >(セルの書式はマクロ実行前も実行後も"文字列"になってます) >これを「001」のまま取り込むことはできるのでしょうか? 「001」を文字列のまま取り込まなければならないのですか。 そうであれば残念ながらNo.1に書いた単純に開く方法ではだめです。 質問者様やNo.2様が書かれている外部データの取り込みを使われるのがよいと思います。
お礼
ありがとうございました。 初めにこういう制約があることを書いてなかったために 余計な回答をさせてしまいましたね。 すみません。
- queuerev2
- ベストアンサー率78% (96/122)
質問者様の方法でもそれほど面倒ではないとは思いますが、別の案として、ふつうにExcelで開いてそこからデータを吸い上げるというのではだめでしょうか。 マクロのあるブックのシート1にデータを取り込む例です。 Sub test() Dim CsvData As Variant Workbooks.Open "取り込みたいCSVファイル.csv" CsvData = ActiveCell.CurrentRegion.Cells ActiveWorkbook.Close ThisWorkbook.Sheets(1).Range(Cells(1, 1), Cells(UBound(CsvData, 1), UBound(CsvData, 2))) = CsvData End Sub
お礼
返事が遅くなってすみません。 シンプルでわかりやい方法をありがとうございます。
補足
試してみました。 csvファイルの「001」が取り込み後は「1」と表示されてしまったのですが (セルの書式はマクロ実行前も実行後も"文字列"になってます) これを「001」のまま取り込むことはできるのでしょうか? この点さえクリアできれば、採用できるのですが。。。
お礼
回答ありがとうございます。 返事が遅くなってすみません。
補足
>CurrentRegionの選択ですから、通常はそのような挙動にはならないはずなんですが。 すみません、改めて動かしてみたら、ちゃんとデータの行数だけ選択されました。 質問したときいろいろ試している最中だったので、余計なゴミデータが残っていたのかもしれません。 >QueryTableの定義情報は削除する事ができます。 >Refreshメソッドでデータを取り込んだ直後にQueryTableを削除すれば テキスト情報のみになります。 まさに理想のかたちです。採用させて頂きます。 ----- 「何行目までデータがあるか?をCtrl+*で調べているため」について補足します。 このExcelの使い方として、 1.csvからインポートする 2.手入力でデータを追加する 3.チェックする 4.csvへエクスポートする という使い方を想定しています。 「チェックする」の中身は型チェック、外部キーチェックのほか、入力漏れチェックが含まれるのですが、 例えばRange("A65536").End(xlUp)のような方法だと、 A列に入力を忘れていた場合、何行目まで入力されているかを正しく判断できません。 このため、どこか1列でも入力されている行まで選択できるCtrl+Shift+*のショートカットキーで調べることにしているためです。