この物語は、入社して一年目の新人社員が上司の指南のもと、業務を自動化していく様を記したものです。物語はフィクションですが、自動化の手法は実際にパソコンやスマートフォンで実践できるものですので、物語と自動化作業の両方を楽しめます。(前回のストーリーはこちら)
「プログラムを教えてもらっているお礼に奢らせてください!」
前話を読むと分かるのだけど、僕は果敢にも憧れの太田先輩を食事に誘ったのだ。太田先輩の答えを待つ時間は、ドキドキして長く長く感じた。
「いいの、いいの。こんなの教えているうちに入らないから。奢ってもらうなんて申し訳ないかわ。」
なんとも儚い。あっけなく断られてしまった。ガックリと僕は肩を落とした。そんな僕を気にせず、太田先輩は話を続ける。
「でも、それほど恩を感じてくれるなら、明日の朝は、もっと真剣にプログラムに取り組んでみよう!」
そのとき、ダダダッと隣の部屋から慌ただしく、眼鏡の若い女性が駆け込んできた。その女性は、キリッと太田先輩を睨んで言った。
「太田さん、今なんて言ったの?また、田中さんに時間外労働させようとしているの?!残業や時間外労働が積み重なって人は病んでいくのよ。」
それに対して、太田先輩が真面目な顔で言い返す。
「あら、笹川さん。私はプログラミングで日本企業の作業効率を5倍効率化しようと目論んでいるの。朝の勉強会もその一環よ。私の野望は・・・」
笹川さんと呼ばれたその女性は、太田先輩の話が長く続きそうなのを見て割って入った。
「でも時間外労働は駄目よ。ほら、見てみなさい。田中さん、明らかに元気ないでしょ?」
そう言って、うなだれている僕を指さした。確かに僕は元気なかった。ただし、それは時間外労働ではなく、太田先輩に食事を断られたショックで、こうなっているんだけど・・・・でも、本当のことは言えない。
その後、太田先輩と笹川さんのやりとりがあって、「強制参加の朝のプログラミング勉強会は開かない」という話でまとまってしまった。笹川さんが怖くて太田先輩が引いてしまったのだ。去り際、笹川さんが僕に向けた満面の笑みが印象的だった。
そんなこんなで、始業時間となり、僕たちは通常業務を始めたのだった。しかし、お昼休憩前に、笹川さんが青い顔で僕たちのところに走ってきた。
「太田さん、お願いがあるんだけど。」
太田先輩は、朝の件があるので、皮肉たっぷりに「私の野望をあざ笑っている笹川さん、何かしら?」と言っていた。それでも、背に腹はかえられない笹川さんは、苦々しげにお願いする。
「実は、Wordで作った契約書のひな形が100個ほどあるのだけど見てくれる? このひな形のいろいろなところに『平成__年』って書いてあるんだけど、これを『令和__年』に書き換える必要があるの。これ、午後1時に来るお客さんに渡さないといけないんだけど、みんなで手分けして書き換えて欲しいの。」
それを聞いて、太田先輩は答える。
「午後1時って、あと1時間しかないわ。みんなで手分けするって本気なの?みんなのお昼休憩を奪う気なの?」
笹川さんは、うーっと唸っている。太田先輩、ちょっと言い過ぎなのではと僕が声を掛けようとしたら、先輩は続けて言った。
「・・・なんてね。気にしないで。私一人で十分よ。30分もあれば十分できるかな?」
笹川さんは「100個もWordファイルあるのよ?どうやって一人でやるの?」と言ったので、僕も答えた。
「プログラミングですよ!VBAで自動置換すれば30分でできますよ。ただし、僕ではなく、太田先輩ならばですが・・・」
こうして、太田先輩がプログラムを作り、僕と笹川さんがプログラムの実行結果を検証することになった。
実際のプログラムを見てみよう
さて、物語の途中ですが、太田先輩が作った実際のプログラムを紹介します。今回は、100個あるWordファイルの中にある文字列を置換するVBAのプログラムです。
今回のサンプルプログラムが、こちらにあります。ここのプログラムは、Windows用のMS Wordで動くように作成しています。
今回のプログラムでは、VBAを利用して、Wordファイル100個を順々に開いていって、「平成」と書かれている部分を「令和」に置換します。
Wordの契約書が入ったフォルダに、「置換マクロ.docm」というWordファイルを作成しましょう。このとき、保存するファイルの形式を「Word文書 マクロ有効文書(*.docm)」と指定するのを忘れないようにしましょう。
今回のプログラムでは、この「置換マクロ.docm」を保存したフォルダにあるWordファイル(『.docx』の拡張子)を連続で置換します。
そして、[Alt]+[F11]キーを押して、VBAエディタを起動して、以下のプログラムを記述します。
' 置換する文字列を以下に指定 --- (*1)
Const FindWord = "平成"
Const ReplaceWord = "令和"
' すべてのファイルを処理するプログラム
Sub ReplaceAllFiles()
' ファイル操作用のオブジェクトを得る --- (*2)
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
' ファイルの一覧を得る --- (*3)
For Each f In FSO.GetFolder(ThisDocument.Path).Files
' Excelファイルだけ処理する --- (*4)
If LCase(FSO.GetExtensionName(f.Name)) = "docx" Then
Debug.Print f.Path
ReplaceDoc f.Path
End If
Next
End Sub
' Wordファイル一つを処理するサブルーチン --- (*5)
Sub ReplaceDoc(fname)
Dim doc As Document
' Wordファイルを開いて処理 --- (*6)
Set doc = Application.Documents.Open(fname)
' Wordのテキストを一括置換する --- (*7)
With Selection
.Find.Text = FindWord
.Find.Replacement.Text = ReplaceWord
.Find.Execute Replace:=wdReplaceAll
End With
' ファイルを保存して閉じる --- (*8)
doc.Save
doc.Close
End Sub
プログラムを確認してみましょう。(*1)の部分では、置換する文字列を指定します。ここでは「平成」を「令和」に置換するように指定しています。他の文字列を置換したい場合には、この部分を書き換えましょう。
続いて、プログラムの(*2)から(*3)の部分では、Wordファイルの一覧を得て、サブルーチンのReplaceDocを呼び出します。(*2a)の部分では、Windowsのファイル操作用のオブジェクトを取得します。(*2b)の部分では、このワードファイルのあるフォルダのパスにあるファイルの一覧を取得します。そして、(*3)の部分で、Wordファイル(拡張子がdocx)であれば、サブルーチンReplaceDocを呼び出します。
そして、(*5)のサブルーチンReplaceDocでは、Wordファイル一つを開いて、置換処理を実行します。(*6)の部分でWordファイルを開きます。(*7)のSelectionを利用して置換処理を行います。SelectionのFindを使うと手軽に一括置換を行うことができます。置換をした後は、(*8)の部分でファイルを保存し、Wordファイルを閉じます。
それでは、物語に戻りましょう。
太田先輩は20分ほどかけてプログラムを完成させた。そして、3個のWordファイルでテストして、正しく動いたので、100個のWordファイルを一気に置換した。その後、僕たちでファイルを手当たり次第に開いて、正しく置換されていることを確認した。
結果、検証時間も含めて、無事に30分で100個のファイルを置換することができた。それで、笹川さんは、太田先輩に深々と頭を下げて長めのお礼を言った後、僕に笑顔で何か言った後、走って去って行った。なんだか、笹川さんは嵐のような人だ。しかし、素直に笑った笹川さんも綺麗だなと思った。
急ぎの仕事を終え、ほっとした僕が食事に行こうと席を立つと、太田先輩が僕に近づいてきた。
「田中君、お疲れ様。お昼、遅くなっちゃったね。午後も仕事多いから、ささっと隣の牛丼屋に行かない?」
なんと、思いがけず太田先輩からの食事のお誘いだ!
(続く)
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。