VBAで新規ワークシートにCSVファイルを読み込む
やりたいこと
- 俗にいう、売上管理ってやつ。手作業大変なのでマクロ化
- 33個のCSVファイルを読み込み、新規ワークシートに挿入する
- それぞれの読み込んだデータにマクロ(見た目の整形と数式を適応する)を実行
- 毎月使います。
やり方
プログラムを組んで、頑張って読み込み変数に入れて利用しようとしていた。
しかーし、そんな事をする必要がはなかった!
下記の作業をマクロで記録する。
- 「外部データの取り込み」を利用する
- Excel 2007 なら、「データ」のリボン→「テキストファイル」をクリック。
- 目的のCSVファイルを選択し、区切り文字を「カンマ」にする。
- 最後にデータを返す先を「新規ワークシート」にする。
おお、ワークシートにCSVファイルが読み込まれた。
これがやりたかった。
33回やる。
VBAを開いてコードをコピペする。
本当はループで回す方がいいに決まっているけど、やっつけマクロなのでそんなことは気にしない。
開発のリボンからVisualBasicをクリックし、開発環境っぽい画面に映る。
(開発のリボンがない場合は、OfficeメニューからExcelのオプション→開発タブをリボンに表示する、にチェックを入れることで表示される)
それっぽい処理をコピーして貼り付ける。
要件:それぞれのCSVを読み込んでワークシートに追加したい。
ActiveSheet.QueryTables.Add(Connection:= _
“TEXT;C:\Documents and Settings\Administrator\My Documents\売上01.csv”, _
Destination:=Range(“$A$1″))
ってとこの「売上01.csv」を「売上02.csv」、「売上03.csv」・・・・「売上33.csv」とかに置換してコピペ。
おお、できた
マクロを実行すると、CSVファイルがワークシートに追加されている。
後は、それぞれのワークシートに目的のマクロを適応していく。
コーディング不要!楽してマクロ!
ファイルの名前とパスは毎回合わせる必要があるが、ここは設定より規約!(キリッを重んじる!
拡張予定
さすがに、ファイル名をコード内でリテラルにするのは雑魚過ぎる。
「設定」ワークシートを作り、そこに読み込むファイル名を記述できるようにしたい。
それは、いつかやる!
とりあえず今日出勤してすぐやらないといけないから、これでやり過ごす!
追記
拡張しました。
- 「設定」のシートを作り、そこのセルに「読み込むのファイル」を記述する
- Rangeとかでそれらのセルのデータを読み込み、配列に格納。
- for文で、その配列を展開しながらファイルを読み込み、シートに落とす。
- シート名を適切な名前に変更
- 印刷プロパティの設定、改ページ位置の設定など。
- 3のforループに戻る。
- 終わり。
- このマクロを実行するための「ボタン」を作成する。
ここまで自動化すれば、かなり楽チンだし、パソコン詳しくない人でもボタン一発!
今回覚えたこと
- 全部の処理をいちいちVBAプログラムで手打ちでコーディングするのはめんどくさいし、できない。
- 「マクロの記憶」でExcelに目的の動作をコード化(Subプロシージャ)させる。
- それを、SubプロシージャからFunctionプロシージャに置き換える。Functionプロージャじゃないと、Subプロシージャから呼び出すことができない。SubプロシージャからSubプロシージャを呼び出すことができない為。
- 後は用途に合わせてFunctionを改造。そしてSubからFunctionに値を投げて実行。Function化したほうがコードがすっきりするのと、目的の処理を一か所にまとめる事が出来るので楽。(後で変更があった時、一つのFunctionの変更のみで、すべてに変更がかかる。まぁ、逆に影響度が大きくなるから気をつけないといけないではある。多分DRY原則のこと)
- 多分だけど、引数なしのFunctionプロシージャでも引数を指定しなくてはいけない。ので、Functionプロシージャはダミーの引数を用意し、SubプロシージャからFunctionプロシージャを呼び出すときもダミーの引数を投げる。
- 嘘、functinoプロシージャは引数省略できるみたい
- いつもやってるプログラミングとは違う言語だけど、こういう事がしたい!こういうコードを書きたい!⇒ググって逆引きやリファレンスを読む⇒VBAではこうやるのか・・・⇒コーディング。という、「プログラミング」という意味では、あまり変わらないなぁと思った。関数化とか配列とかfor文とか、どの言語でも普遍的に使う概念とパターンはしっかり押さえておくべきだな!とか思った。