まえきんです!
さぁ今回から、「事例で学ぶExcel VBA」と題したVBAの事例紹介が始まります😁
私が普段実務で手作業の自動化ツールを作成する中で実装している処理の一部を
ピックアップし、ブログ掲載用にカスタマイズしたものをご紹介していきます。
全て私の実務ベースで使っているものなので、使いこなすことが出来れば、
必ずや手作業の自動化に一役買ってくれる内容ばかりと勝手に自負しています笑 😁
「本だけじゃなくてExcel VBAを実践的に勉強してみたい!」「ハードル高くて苦手だった
けどもう一度VBAを勉強してみたい!」「実務で役に立つVBAを学びたい!」そんな方々の
学習意欲向上の一助になればと思い、このシリーズを投稿しようと思いました。
私自身もこのシリーズの投稿を通じて、新しい知識の習得、習得した知識の棚卸しや
ブラッシュアップをしていきます😊一緒に楽しくスキルアップしていきましょう!!👍✨
👇さて、記念すべき第1弾はコチラ
#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オブジェクト)
私のTwitterをフォローして下さっている方は目にして頂いたかもしれませんが
Excel VBAでCSVを取り込むのは、ループを使って1行ずつセルに書き出すのが
一般的とされています。が、CSVのデータ数によってはマクロの処理速度に
影響が出ます。私の場合は、今回ご紹介した通り、比較的処理速度が速い
とされるQueryTableオブジェクトを採用しています。CSVのサイズを見て、
使い分けるのがよいかもですね!ちなみに、QueryTableオブジェクトを
使って記述すると全体的にコードもシンプルになり私は好きです😁
気が向いたら、「ループを使って1行ずつ書き出し」 VS 「QueryTableオブジェクト」で
処理速度の違いを検証してみようと思います😊
QueryTableオブジェクトを使用する上での注意点
実はこのQueryTableオブジェクト、空のCSVを取り込むことができないという欠点が
あります。実務上、空のCSVを取り込むケースはあまり想定しなくてもいいとは
思いますが、本格的なシステムでこうした機能を実装するのであれば、空のCSVが
来た場合の措置も考慮しておくべきだと思います。ここだけ注意です😁
今回はこれで以上です😊
この記事やVBAコードが「参考になった!」「役に立った!」など
少しでも思って頂けたらご支援やいいねを頂けると嬉しいです😌
今後の記事投稿のモチベーションアップになります(*´ω`)
↓↓