この物語は、入社したての新人社員、田中君が業務を自動化していく様を記したものです。物語はフィクション(時々ノンフィクション)ですが、自動化の手法は実際にパソコンやスマートフォンで実践できるものですので、物語と自動化作業の両方を楽しめます。
【物語】
新型コロナウイルスの世界的流行から1年が経って多くの人の生活に変化があった。仕事をなくした人もいた。僕のように入社したばかりの下っ端は会社の業績が悪くなれば真っ先に切られてしまうかもしれないと思うと胃が痛くなる日々だ。
今は緊急事態宣言が出ている最中だが、これまで通り会社に行かないとできない仕事も多い。それで我が社では出社時間と退社時間を短縮しつつ、できることは在宅でやるようにという指示となった。僕の敬愛する美人上司の太田先輩も最初こそ状況に戸惑っていた時期もあったが、今では自分の仕事をバリバリこなしつつ、みんなに細かく気を配っている。さすがと言うしかない。
できる人というのは、周りの状況が変化しても、その中で最善の方法を考えて前向きに歩んで行く。実に頼もしい。それに心から見倣いたいと思っているけれど、なかなか思い通りにはいかない。僕はと言えば、環境の変化が大きすぎて何をして良いのか分からず、右往左往するばかり。会議でも何の良いアイデアも出せず、日々言われた通りやるだけ。先輩にはフォローしてもらうばかりで申し訳ない気持ちでいっぱいだ。それに、最近、以前よりも頭痛の回数が増えている気がする。気をつけないと。
そんなある日、定例会議の後、太田先輩が個人的に声を掛けてくれた。
「田中君、最近元気ないけど大丈夫?」
「は、はい。なんとかなっています。」
「コロナ禍で精神的に調子を崩している人も多いらしいの。田中君も無理しないでね。こんな状況でみんな何かしらストレスを感じているんだから。何か気になっていることがあったら何でも言ってね。」
太田先輩の言葉に涙が出そうになった。信頼する先輩が一言優しい言葉をかけてくれる。それだけでものすごく力が沸いてきた。
「太田先輩、ありがとうございます。なんか元気が出て来ました。」
「そう、それは良かったわ。さっそく今日の仕事をやってもらいたいのだけど。100個のCSVファイルを結合して欲しいの。」
「100個のファイル?!・・・元気なくなってきました。」
そうして、今日も和やかに仕事が割り振られた。コロナ禍になって関係がギクシャクしている会社もあるようだけど、我が社は有能な上司のおかげでメンタンルケアまで万全だ。
今日の仕事は、経理部が利用している会計ソフトから出力したCSVファイルを一つにまとめることだ。CSVファイルは取引業者ごとに100個ある。この100個のデータを結合する。
この作業は今後毎月発生する。と言うのも、これまで紙の伝票でやっていた仕事なのだけど、テレワークを徹底するためオンラインでデータをやり取りすることになったからだ。
そんなわけで、今日は太田先輩からVBAでマクロを作り、毎月マクロを実行するだけで、CSVファイルをExcelに取り込むようなものを作って欲しいと言われている。
僕が考えた手順は次の通り:
- (1)複数CSVファイルを選ぶ
- (2)ファイルを一つずつ読んでExcelに取り込んでいく
- (3)取り込む時に不要なヘッダ行を削除する
Excelを起動し、[Alt]+[F11]を押してVBエディタを開く。そしてプログラムを作った。若干苦労した場面もあったけど、毎月手軽に100個のCSVファイルを取り込めるようになった。
太田先輩に報告すると大いに褒められた。そして、僕が席に戻ると、僕のスマホに電子マネーが送られて来た。なんだろうと思っていると、太田先輩がやってきて「今日は早めに上がって美味しい物を買って帰ってね。今夜はこの部署でオンライン飲み会をやるから田中君もぜひ来てね」との事だった。会社からも少しの援助があったそうだ。
そして、どうやら部署のみんなが元気のなさそうな僕を見て、気遣って今夜の会を計画してくれたことが分かった。僕は暖かい気持ちで家路についた。
=== === ===
【プログラムを作ろう】
それでは、今回、田中君が作ったプログラムを紹介します。今回作ったのは、100個あるCSVファイルを順に読み込んでExcelに取り込むというものです。
ちなみに、Windowsのバッチファイルを使えば、手軽にCSVファイルを手軽に結合できます。例えば、100個のCSVファイルと同じフォルダに「結合.bat」という名前のバッチファイルを作ります。メモ帳を開いて以下の一行を書き込み保存しましょう。この時、文字コードはUTF-8ではなくASCII(Shift_JIS)を選ぶ必要があります。
copy *.csv 結合.csv
そして保存したバッチファイルダブルクリックすると「結合.csv」という名前のファイルが作成されます。
しかし、作成されたCSVファイルをExcelで開いてみると、データの先頭にあるヘッダ行が重複した美しくない表が表示されます。つまり、ただ結合しただけでは、この後ヘッダ行を削ったり並び替えたりと整形処理が必要となってしまいます。
そこで、VBAを用いてCSVファイルを読み込み整形された状態でExcelのシートに差し込むことができれば便利です。
それで、田中君が作ったVBAのプログラムは次のようなものです。こちらからサンプルファイルをダウンロードできます。
ファイルダイアログで複数のCSVファイルを指定します。すると、それらを読み込んでExcelのシートに差し込むというものです。
Excelを起動したら、マクロ有効ブック「insert.xlsm」という名前で保存しましょう。そして、[Alt]+[F11]キーを押してVBエディタを起動します。以下のプログラムを記述したら実行してみましょう。
Sub 複数CSVの取り込み()
' 複数ファイル選択 --- (*1)
Files = Application.GetOpenFilename( _
"すべてのファイル,*.csv", MultiSelect:=True)
' ファイルの内容を読み込んでSheet1に書き込む --- (*2)
Row = 2
For Each f In Files
' ファイルを開いて読み込む --- (*3)
Open f For Input As #1
Line Input #1, buf ' ヘッダ行を読み飛ばす --- (*4)
Do Until EOF(1)
Line Input #1, buf
a = Split(buf, ",") ' フィールドを分割して読み込む --- (*5)
If UBound(a) >= 2 Then
Sheet1.Cells(Row, 1) = a(0)
Sheet1.Cells(Row, 2) = a(1)
Sheet1.Cells(Row, 3) = a(2)
Row = Row + 1
End If
Loop
Close #1
Next
End Sub
プログラムを実行すると、以下のようなファイルの選択ダイアログが表示されます。そこで、取り込みたいファイルを選択します。ShiftキーやCtrlキーを使うと複数のファイルを選択できます。
ファイルを選択すると、CSVファイルの1行目を読み飛ばし、A列、B列、C列にCSVファイルのフォールドを取り込みます。
プログラムを確認してみましょう。(*1)の部分ではファイルの選択ダイアログを開きます。この時、MultiSelect:=Trueとオプションを付けると、複数のファイルを選択できます。(*2)でダイアログで選択したファイルを一つずつ読み込みます。そのために、For Each文を使います。
(*3)ではCSVファイルを開きます。(*4)では一行読みます。そして、ファイルの先頭にある1行目はヘッダ行なので読み飛ばします。そして、Do Until文で繰り返しファイルの最後まで繰り返し読みます。(*5)でSplit関数を使ってCSVの区切り記号であるカンマ「,」でフィールドを分割してシートに値を書き込みます。ここでは、3つのフィールドしか取り込んでいませんが、もし、フィールド数が多い場合はセルに設定する
まとめ
以上、今回はファイルダイアログを利用してCSVファイルを指定し、それを読み込むというプログラムを作ってみました。VBAを使うとデータを効率的に扱えるようになるので便利ですね。
ところで、本連載の主人公である田中君もコロナで憂鬱な気分になってしまったようです。コロナ禍で頑張ってる皆さん、本当にお疲れ様です。こんな時は無理せずマイペースを心がけて、家族や友人、同僚たちに相談できると良いですね。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。