ぶろぐ

日記です

VBAで新規ワークシートにCSVファイルを読み込む


やりたいこと

  • 俗にいう、売上管理ってやつ。手作業大変なのでマクロ化
  • 33個のCSVファイルを読み込み、新規ワークシートに挿入する
  • それぞれの読み込んだデータにマクロ(見た目の整形と数式を適応する)を実行
  • 毎月使います。

やり方

プログラムを組んで、頑張って読み込み変数に入れて利用しようとしていた。
しかーし、そんな事をする必要がはなかった!
下記の作業をマクロで記録する。

  1. 「外部データの取り込み」を利用する
  2. Excel 2007 なら、「データ」のリボン→「テキストファイル」をクリック。
  3. 目的のCSVファイルを選択し、区切り文字を「カンマ」にする。
  4. 最後にデータを返す先を「新規ワークシート」にする。

おお、ワークシートに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ファイルがワークシートに追加されている。
後は、それぞれのワークシートに目的のマクロを適応していく。
コーディング不要!楽してマクロ!
ファイルの名前とパスは毎回合わせる必要があるが、ここは設定より規約!(キリッを重んじる!

ライフハック!!(キリッ

これは、しばしばバイトに遅刻する私が、店長の役に立って遅刻を見逃してもらうためのライフハックです!

拡張予定

さすがに、ファイル名をコード内でリテラルにするのは雑魚過ぎる。
「設定」ワークシートを作り、そこに読み込むファイル名を記述できるようにしたい。
それは、いつかやる!
とりあえず今日出勤してすぐやらないといけないから、これでやり過ごす!

追記

拡張しました。

  1. 「設定」のシートを作り、そこのセルに「読み込むのファイル」を記述する
  2. Rangeとかでそれらのセルのデータを読み込み、配列に格納。
  3. for文で、その配列を展開しながらファイルを読み込み、シートに落とす。
  4. シート名を適切な名前に変更
  5. 印刷プロパティの設定、改ページ位置の設定など。
  6. 3のforループに戻る。
  7. 終わり。
  8. このマクロを実行するための「ボタン」を作成する。

ここまで自動化すれば、かなり楽チンだし、パソコン詳しくない人でもボタン一発!

今回覚えたこと

  • 全部の処理をいちいちVBAプログラムで手打ちでコーディングするのはめんどくさいし、できない。
  • 「マクロの記憶」でExcelに目的の動作をコード化(Subプロシージャ)させる。
  • それを、SubプロシージャからFunctionプロシージャに置き換える。Functionプロージャじゃないと、Subプロシージャから呼び出すことができない。SubプロシージャからSubプロシージャを呼び出すことができない為。
  • 後は用途に合わせてFunctionを改造。そしてSubからFunctionに値を投げて実行。Function化したほうがコードがすっきりするのと、目的の処理を一か所にまとめる事が出来るので楽。(後で変更があった時、一つのFunctionの変更のみで、すべてに変更がかかる。まぁ、逆に影響度が大きくなるから気をつけないといけないではある。多分DRY原則のこと)
  • 多分だけど、引数なしのFunctionプロシージャでも引数を指定しなくてはいけない。ので、Functionプロシージャはダミーの引数を用意し、SubプロシージャからFunctionプロシージャを呼び出すときもダミーの引数を投げる。
  • 嘘、functinoプロシージャは引数省略できるみたい
  • いつもやってるプログラミングとは違う言語だけど、こういう事がしたい!こういうコードを書きたい!⇒ググって逆引きやリファレンスを読む⇒VBAではこうやるのか・・・⇒コーディング。という、「プログラミング」という意味では、あまり変わらないなぁと思った。関数化とか配列とかfor文とか、どの言語でも普遍的に使う概念とパターンはしっかり押さえておくべきだな!とか思った。