この物語は、入社して一年目の新人社員が上司の指南のもと、業務を自動化していく様を記したものです。物語はフィクションですが、自動化の手法は実際にパソコンやスマートフォンで実践できるものですので、物語と自動化作業の両方を楽しめます。(前回のストーリーはこちら)
入社数日目。新人の僕は、みんなより早めに出社することにしていた。しかし、配属された経理部の部屋に入ろうとすると、そこには、既に太田先輩がいるのが見えた。さすが美人で仕事のできる太田先輩だ。
あっ、でもスマホ見てニヤニヤしてるな。何しているんだろう。あっ、あの緑の吹き出しが流れる画面は、LINEを見てるようだ。何かLINEでチャットしてるみたい。誰と話しているんだろう。気になるな、彼氏とかいるんだろうか。居るんだろうな、先輩美人だからと、そんな事を考えながら挨拶をした。
「太田先輩、おはようございます。いつも早めに出社しているんですか?」
急に声をかけられて、太田先輩は驚いたらしく、ウサギのような顔で応えた。
「あ、あぁ、田中君、おはよう。そうね、少し早めに出社すると電車も空いているしね。」
そのとき、僕はスゴイ事に気づいてしまった。朝、早めに出社すれば太田先輩と二人きりで話す機会があるという事だ。つまり、この時間を活用すれば先輩から、いろいろとプログラミングのことを教えてもらうことができそうだ。僕も早く先輩のような仕事のできる一人前になりたい。そう決意を新たにしているとき、先輩が口を開いた。
「そう言えば、先日やったExcelのシートを分ける作業だけど、課長がデータがすぐに探せるようになったって喜んでいたわ。」
僕は笑顔で答えた。
「Excelブック内のシートの一枚ずつを複数のファイルに分離する作業ですね!先輩のおかげで、あっと言う間にできました。ありがとうございました。」
最初は先輩にプログラムを教わったけど、その後、僕も実際にVBAのプログラムをコピー&ペーストして、いくつかのExcelファイルをシート一枚ずつに分離したんだ。仕事が評価されると嬉しいな。
しかし、その後、太田先輩が続けて言った。
「それで、課長から、この機会に過去の事例データのExcelファイル300個についてもやっておいてって追加依頼が来たわ。頑張ってね。」
「えーっ?300個もですか!」
今日の僕の仕事は、一日、Excelと格闘することになりそうだ。いくら、VBAで自動でシートを分離できるとは言え、300個のExcelファイルを開いて、VBAを書き込んで実行するには、それなりに時間がかかりそうだ。1ファイル1分として計算すると、1分×300個で300分、5時間はかかるな。僕はため息をついた。
今日一日繰り返される単純仕事を想像して、僕がうなだれていると、太田先輩が意地悪な声で言った。
「あら、もしかして、一日この仕事だけをする気なの?こんな単純な仕事、1時間以内に終わらせて欲しいわ。」
「そ、そんな、無茶言わないでくださいよ!そんなの無理ですよ。」
僕は泣きそうな声で言い返した。
「無理、無理、無理ですよー。いくらマウス操作が得意で、コピー&ペーストが高速にできる僕とは言え、集中して作業できたとして、一日かかる仕事です!」
太田先輩は、そんな気弱な僕を見て満足したのか、急に優しい口調になって言った。
「ふふふ。普通の方法では無理なことくらい分かっているわ。こういう時は何をしたら良いか考えてみたのかな?」
なんと、太田先輩が何かしらのヒントを出してきた。何を言おうとしているのだろうか。
「も、もしかして、その口ぶり、何か裏技があるんですよね。先日のような素敵な裏技が・・・。」
太田先輩は笑顔で頷いた。
「そうよ。そこで『プログラミング』と言うキーワードが出てくれば100点だったけど、『裏技』というのもかっこいいから許してあげるわ。」
良かった。この展開から考えると、昨日のように先輩が『プログラミング』を教えてくれるようだ。
「先輩、教えてください!」
僕は熱意を見せる。すると、先輩は自分のPCでExcelを起動して言った。
「前回も紹介したけど、ExcelやWordなど、Office製品には、VBAと言って自動処理させるためのプログラミング言語が内蔵されているのは十分に理解したよね?」
「はい。」
僕は力を込めてうなずいた。それは、先日の作業でとてもよく分かった。先輩は続けて言う。
「それで、実際、VBAのプログラムで操作できる範囲は、一つのファイルだけではないの。複数のファイルをまとめて処理することもできるのよ。」
「え?『複数のファイルをまとめて処理』ってどういうことですか?」
僕の頭は、まだ何ができるのか、よく分かっていなかった。先輩は辛抱強く解説を続ける。
「つまり、次から次へとExcelファイルを自動で開いて、連続で処理することができるということなの。プログラムを作れば、300個でも500個でもExcelファイルを一気に処理できるの。便利でしょう?」
ようやく分かってきた。僕が一日かけてやろうとしていた仕事も、一気にプログラムで自動化できるということらしい。しかし、本当にそんなことができるのだろうか。
「本当にそんなことができるなら便利ですね。」
僕が懐疑的に言い放つと、太田先輩は嬉しそうに、「まぁ、見ててよ。」と言って操作を始めた。先日と同じように、キーボードの[Alt]+[F11]キーを押して、Excel VBAエディタを起動した。そして、太田先輩は、すごい勢いでプログラムを打ち込んでいく。
「すごい・・・、先輩、かっこいいです!」
僕は尊敬のまなざしで、その様子を見ていた。そんな僕の視線を感じた太田先輩は、急に気恥ずかしくなったらしく、早口で解説を始めた。
「えっと、基本的には、前回作ったプログラムを再利用して、複数ファイルに対応するように書き換えるだけだよ。こうやって、前回作ったプログラムをサブルーチンにまとめおくの。そして、ファイルの一覧を列挙してから繰り返しサブルーチンを呼び出すして・・・。」
そうして、太田先輩は、あっという間にプログラムを完成させた。そして、プログラムを実行する。
すると、次々とExcelファイルが開いて、ブック内の複数シートを一枚ずつファイルに保存していった。僕は思わず叫んだ。
「すごい、すごい、すごい!Excelファイルが自動で開かれて、新規フォルダを作成し、ブック内のシートをバラバラにして保存していきます!」
なんとも爽快な気分だ。新幹線に乗って窓の外を眺めているかのようだった。前回の方法でVBAを使ったとしても、たっぷり5時間はかかるだろう仕事を、なんとものの数十分ほどで終えることができた。
まだまだ、太田先輩の書いたプログラムは、ちっとも分からなかったものの、太田先輩がVBAの達人であること、そして、ExcelのVBA機能が非常に強力だということが分かった。
僕がしきりに感心していると、他の社員も出社してきた。そのとき、太田先輩がこそっと僕に意味深なことを言った。
「田中君、明日の朝も早く来られる? 私のLINEを教えてあげる。そのとき、秘密の特訓をしてあげるね。」
「えっ?!」
(続く)
プログラムの解説
さて、前回に引き続き、太田先輩はExcel VBAを利用して、業務を自動化する手段を、新人の田中君に紹介しました。
前回は、一つのExcelファイル(ブック)にある複数のシートを個別のバラバラのExcelブックに振り分けるだけでしたが、今回は、300個もあるExcelファイルの中のシートをそれぞれ分割しなければなりません。
今回、課長が太田先輩に託したExcelファイルのサンプルがこちらからダウンロードできます。
プログラムの仕組みは次の通りです。
(1)指定のフォルダにあるファイル一覧を列挙
(2)ファイル一覧を一つずつ確認して、Excelファイルであれば、(3)の処理を繰り返し処理する
(3)Excelファイルの名前を元にフォルダを作成する
(4)ブックの中にある複数シートをバラバラのファイルに分けて作成したフォルダの中に保存する
プログラミング初心者には、少し難しいプログラムですが、VBAを使えば、こんなこともできるんだという例として、実際にプログラムを実行して動作を確かめてみましょう。
それでは、太田先輩が田中君の熱い視線を受けながら書いたプログラムを紹介しましょう。Excelを起動して、新規ブックを作成した後、[Alt]+[F11]キーを押してVBAエディタを起動、メニューから[挿入 > 標準モジュール]で、エディタに以下のプログラムを記述します。
' 複数Excelファイルのパスを指定する(↓要書換) --- (*1)
Const TargetPath = "C:\Users\kujira\Desktop\sample"
Dim FSO As Object
' すべてのファイルを処理するプログラム
Sub SplitAllFiles()
Application.DisplayAlerts = False
' ファイル操作用のオブジェクトを得る
Set FSO = CreateObject("Scripting.FileSystemObject")
' ファイルの一覧を得る --- (*2)
For Each f In FSO.GetFolder(TargetPath).Files
' Excelファイルだけ処理する --- (*3)
If LCase(FSO.GetExtensionName(f.Name)) = "xlsx" Then
Debug.Print f.Path
SplitSheet f.Path
End If
Next
End Sub
' Excelファイル一つを処理するサブルーチン --- (*4)
Sub SplitSheet(fname)
' シートの保存先となるフォルダを作る --- (*5)
Path = Replace(fname, ".xslx", "") & "-sheets\"
If Not FSO.FolderExists(Path) Then FSO.CreateFolder Path
' Excelファイルを開いてシートを処理 --- (*6)
Set wb = Application.Workbooks.Open(fname)
For i = 1 To wb.Sheets.Count
Set Sheet = wb.Sheets(i)
Set newb = Application.Workbooks.Add
fname2 = Path & Sheet.Name & ".xlsx"
Sheet.Copy newb.ActiveSheet
newb.SaveAs (fname2)
newb.Close
Next
wb.Close
End Sub
そして、プログラムの(*1)の部分に、300個のExcelファイルを配置したフォルダのパスに書き換えます。そして、[F5]キーを押すか、VBAエディタの実行ボタンをクリックして、プログラムを実行します。その際、実行する処理を選ぶダイアログがでたら、「Sheet1.SplitAllFiles」を選んで実行します。
ただし、注意点ですが、300個のプログラムを実行するには、それなりに時間がかかりますので、最初はサンプルファイル3つくらいで試してみると良いでしょう。
それでは、簡単にプログラムを確認してみましょう。(*1)では、プログラム全体で利用する定数や変数を宣言します。(*2)の部分では、(*1)で指定したフォルダにあるファイルの一覧を得て、繰り返し処理を行うようにFor文を記述します。(*3)では、Excelファイルだけを処理するように条件を記述します。ここでは、(*4)の部分で定義しているSplitSheetを繰り返し呼び出します。
(*5)の部分ではExcelファイル名を利用して、シートの保存先フォルダを決定し、新規フォルダを作成します。(*6)の部分はほぼ前回と同じですが、Excelファイルの各シートを一枚ずつ新規ブックにコピーして保存する処理を行います。
以上、複数ファイルを対象にした、Excelブック中のシートをバラバラのブックに分割するプログラムを紹介しました。今回、Excel VBAが強力であることを体感できたのではないでしょうか。それでは、次回、太田先輩の秘密の特訓もお楽しみに!
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。