Excel VBA(事例編)

【事例で学ぶExcel VBA #1】CSVデータをエクセルシートに取り込む

Excel VBA(事例編)

本コーナーでは、私が普段実務で手作業の自動化ツールを作成する中で実装している

処理の一部をピックアップし、掲載用にカスタマイズしたものをご紹介していきます。

全て私の実務ベースで使っているものなので、使いこなすことが出来れば、必ずや

手作業の自動化に一役買ってくれる内容ばかりと勝手に自負しています。

「本だけじゃなくてExcel VBAを実践的に勉強してみたい!」

「ハードル高くて苦手だったけどもう一度VBAを勉強してみたい!」

「実務で役に立つVBAを学びたい!」

そんな方々の学習意欲向上の一助になればと思い、このシリーズを

投稿しようと思いました。一緒に楽しくスキルアップしましょう!

#1:CSVデータをエクセルシートに取り込む

CSVデータをエクセルに取り込むとき、普段どうしているでしょうか。VBAを使わない

場合だと、①CSVファイルをエクセルで開いたり、②外部データの取込機能を使って

取り込む方法が主流ではないかと思います。しかし、毎回手作業でこの作業は正直

しんどいですよね😅そこで、バシッとマクロを組んで自動化してしまいましょう!

ツールの全体像

まずは任意のエクセルシートを開いて、CSVを取込むための一覧を作成しておきます。

あと、マクロ実行用のボタンも配置しておきます。ボタンを配置しなくてもマクロの

実行は可能ですが、汎用性等考慮し、私はいつも必ずマクロ実行用ボタンを配置する

ようにしています。本ツールのVBAコードは以下の通りです。

VBAコード ※パソコンでの閲覧推奨
Option Explicit
'===================================================
'ツール名:CSVデータ取込ツール(まえきんブログ掲載用にカスタマイズ)
'作成日:2022/02/27
'処理概要:CSVデータ取込
'付属機能:なし
'作成者:まえきん
'===================================================
'===================================================
'定数宣言
'===================================================
Const torikomi As String = "CSV取込シート"
'===================================================
'関数名 :メイン関数(CSVデータ取込ボタン)
'処理内容:CSVデータ取込
'トリガー:CSVデータ取込ボタンを押下した際にコールされる
'引数  :なし
'戻り値 :なし
'===================================================
Private Sub CommandButton1_Click()
Dim strPath As String 'ファイルパス変数
Dim qtCsv   As QueryTable 'クエリテーブル変数
'----------
'読込CSVファイル名の指定
'----------
strPath = ActiveWorkbook.Path & "\取込テスト.csv"
'----------
'CSV取り込み先シート、セルを指定
'----------
With Worksheets(torikomi)
Set qtCsv = .QueryTables.Add(Connection:="TEXT;" & strPath, _
Destination:=.Range("A1"))
End With
'----------
'取込形式の指定
'----------
With qtCsv
.TextFileCommaDelimiter = True 'カンマ区切りの指定
.TextFileParseType = xlDelimited   ' 区切り文字の形式
.TextFileColumnDataTypes = Array(2, 2) '項目(列)の型(指定2:文字列)
.TextFileStartRow = 1 '開始行の指定
.TextFilePlatform = 932 '文字コード指定(Shift_JIS を開く)
.RefreshStyle = xlOverwriteCells ' セルに上書き
.Refresh 'QueryTablesオブジェクトを更新し、シート上に出力
.Delete 'QueryTables.Addメソッドで取り込んだCSVとの接続を解除
End With
'----------
'処理完了通知
'----------
MsgBox "CSVデータを取り込みました!"
End Sub

補足:取込用CSVの中身(CSVファイル名:「取込テスト.csv」)

レコード番号,読者様へメッセージ
1,いつもまえきんブログにご訪問頂き
2,本当にありがとうございます!!
3,これからもまえきんブログを
4,よろしくお願いします!(≧▽≦)
VBAコード解説

読込CSVファイル名の指定

取り込み対象のCSVファイルを取得する処理として、私は「ActiveWorkbook.Path」を

使用しています。こうしておくと、どの階層にファイルを置いていてもマクロ実行時に

ファイルパスをきちんと判断して拾ってくれるので重宝しています。

CSV取り込み先シート、セルを指定
次に取り込んだ情報をエクセルシートのどこに書き出していくか(どのセルを起点に

書き出していくか)について、Destination:=.Range(“セル名”))で指定します。

取込形式の指定
ここではCSVを取り込む形式を指定していきます。指定している内容は上記のコードに

簡単にコメントを付与しているのでそちらをご参照頂ければと思います。今回の事例紹介

では特殊な取込形式の指定は想定していないので細かいオプションの解説は省略します。

たいていの場合は上記のコードで事足りるので、「ふーん、そう書くんだぁ🤔」ぐらいで

よいと思います。実際にマクロを実行すると以下のような結果になります。

マクロ実行結果


処理完了通知

上記の通り、結果が得られましたでしょうか😊

ボタン一つでCSVの取込が出来るので、私は実務で大変重宝しています。実はこちら、

冒頭で触れた②外部データの取込機能をVBAで自動化しています。今回は可変長の

CSVデータの取込を対象にしていますが、固定長ももちろんできます。

こちらはちょっとハードルが高くなりますが、、このお話は、またいずれ😊

CSV取込方法に関する補足(QueryTableオブジェクト)

Excel VBAでCSVを取り込むのは、ループを使って1行ずつセルに書き出すのが一般的

とされています。が、CSVのデータ数によってはマクロの処理速度に影響が出ます。

私の場合は今回ご紹介した通り、比較的処理速度が速いとされるQueryTableオブジェクト

を採用しています。CSVのサイズを見て使い分けるのがよいかもしれません。ちなみに、

QueryTableオブジェクトを使って記述すると全体的にコードもシンプルになり私は

好きです。気が向いたら、

「ループを使って1行ずつ書き出し」 VS 「QueryTableオブジェクト」

で処理速度の違いを検証してみようと思います😊

QueryTableオブジェクトを使用する上での注意点

実はこのオブジェクト、空のCSVを取り込むことができないという欠点があります。ただ

実務上記のケースはさして必要はないと考えますが、本格的なシステムでこうした機能を

実装するのであれば、空のCSVが来た場合の考慮も必要になってくることに注意です。

今回はこれで以上です😊

最後まで読んで頂きありがとうございました!ではまた!

👆よろしければ、「いいね」よろしくお願い致します!
ブログ運営のモチベ上がります😄

ブログランキング・にほんブログ村へ
👆ブログランキングに参加しました!
よろしければ、応援よろしくお願い致します!
スポンサーリンク
\シェアする/
まえきんブログ

コメント