この物語は、入社したての新人社員、田中君が業務を自動化していく様を記したものです。物語はフィクション(時々ノンフィクション)ですが、自動化の手法は実際にパソコンやスマートフォンで実践できるもので物語と自動化作業の両方を楽しめます。
【物語】
前回、元気のなかった僕のために部署のみんながオンライン飲み会を開いてくれた。飲み会では、お酒の勢いもあって普段思っていたことや悩んでいる事を素直に相談することができた。
僕が相談すると「私もそう思っていた」とか「そんな気にすることないよ」など、みんなの素直な気持ちを聞くことができて大いに気分が晴れた。結果、オンライン飲み会は大いに盛り上がり、すっかり僕も元気を取り戻すことができた。
こんな時だからこそ、みんなとしっかりコミュニケーションを取ることで、小さな誤解や失敗もゼロに戻すことができるのだと感じた。コミュニケーションは本当に大切だ。
あれから数日、出社した僕を美人上司の太田先輩が笑顔で迎えてくれた。
「田中君、私は君を待っていた!」
先輩に頼りにされていることは嬉しいのだが、これは面白くない登場の仕方だろう。そして、カバンを自分の席に置く間も与えられず、先輩の席まで連れて行かれた。そして先輩は僕に建築資材の発注予定リストを見せてくれた。そして先輩が無邪気に言う。
「見てみて!これ(建築資材)って本当いろいろな種類があるでしょう?」
これがデートで行ったデパートの売り場での会話ならどれだけ良いだろうと思いつつ、「そうですね」とだけ僕は答える。
「実はね、この長い長い発注リストの中に、現在注文できない古い型番の資材が含まれているの。」
僕は急に嫌な予感がして答えた。
「それは困ったことですよね?・・・もしかして、有効な資材のリストを見て、無効な資材を洗い出すってことですか?」
太田先輩がニターっと悪い顔になって「そうなのよ。田中君、君もだいぶ分かってきたわね」と答えて、続けて言った。
「今日のお昼までに仕上がるかしら?午後の会議までに営業部に報告したいのよ。」
軽くリストを見ただけでも1000件もの発注部品の一覧があった。
「うぅ、お腹痛くなってきました。」
こうして緊急案件が僕に割り振られた。超特急で作業しなければならない。とは言え、さすが仕事のできる太田先輩だ。どんなVBAのプログラムを作れば良いのかを親切にポイントを押さえて教えてくれた。
僕は必死にプログラムを作って、ギリギリお昼前までに無効な部品を洗い出すことができたのだった。
【プログラムを作ろう】
それでは、まず、大田先輩が田中君に送ったExcelブックを紹介します。このブックには「発注表」と「有効資材一覧」という二つのシートがあります。
「発注表」のシートには1000件の発注部品の一覧が載せられています。A列には納入先、B列には部品の型番、C列には発注個数が記されています。そして「有効資材一覧」には、現在も発注可能な資材の一覧100個が記されています。
こちらからダウンロードできます。
田中君が行う実際の作業は「発注表」にある発注予定の部品が、「有効資材一覧」の掲載されているかを一つずつ調べていくというものです。もし、有効資材一覧に掲載されていなければ、その行を赤く塗りつぶして、無効であることが分かるようにします。
発注表には1000件もの発注内容が記されており、手作業で調べたらものすごく大変です。そこで、VBAのプログラムを作って自動で調べるようにします。
そして、田中君が頑張って作ったプログラムは以下の通りです。Excelを起動して、[Alt]+[F11]キーを押してVBエディタを起動します。そして、以下のプログラムを記述します。
Sub FindInvalidItem()
Dim sh1 As Worksheet, sh2 As Worksheet, sh2last, sh1last
Dim ItemNo As String, dic As Object, r As Range
' シートを得る --- (*1)
Set sh1 = ThisWorkbook.Sheets("発注表")
Set sh2 = ThisWorkbook.Sheets("有効資材一覧")
Set dic = CreateObject("Scripting.Dictionary")
sh1last = sh1.Cells(1, 1).End(xlDown).Row
sh2last = sh2.Cells(1, 1).End(xlDown).Row
' 有効資材一覧を辞書変数dicに覚える --- (*2)
For Row = 2 To sh2last
ItemNo = sh2.Cells(Row, 1) ' 型番
dic(ItemNo) = 1
Next
' 発注表シートを調べる --- (*3)
For Row = 2 To sh1last
ItemNo = sh1.Cells(Row, 2)
If Not dic.Exists(ItemNo) Then ' --- (*4)
Set r = sh1.Range(sh1.Cells(Row, 1), sh1.Cells(Row, 3))
r.Interior.Color = RGB(255, 0, 0)
Debug.Print Row, ItemNo
End If
Next
End Sub
カーソルを上記のEnd Subの上に合わせて[F5]キーを押すか、マクロダイアログが出たら「Sheet1. FindInvalidItem」を選んで実行しましょう。
すると、上記のように、有効資材一覧のシートに該当がない部品が記されている行を赤く塗りつぶして、部品の型番が無効であることを明示します。なお、このプログラムはWindowsのExcel専用です。
プログラムを確認しましょう。(*1)では「発注表」と「有効資材一覧」のシートを取得します。そして、それぞれのセルの最終行を得て、変数sh1lastとsh2lastに代入します。
(*2)では辞書変数のdicのキーに型番を代入します。この変数dicはCreateObjectを使って作成したDictionary(辞書)オブジェクトです。辞書変数には、キーと値のペアを複数代入できます。これによって辞書のキーとして複数の型番を覚えたことになります。
そして、(*3)の部分では、発注表の型番を一つずつチェックしていきます。(*4)の部分で辞書変数を使うことで『dic.Exists(型番)』と書くことで、その型番が存在するかをチェックできます。型番が存在しない場合、その行を赤で塗りつぶします。
まとめ
以上、今回はExcel VBAを利用して、シートに記入されている無効な値を探し出すプログラムを作ってみました。1000件にも及ぶセルを目視するのは大変な労力が必要ですが、今回のようにプログラムを使えばあっという間に仕事を片付けることができます。その際、無効な値のチェックにはDictionary(辞書)オブジェクトを利用できます。実際のところ、より複雑な値チェックが必要な場合もあると思いますが、Dictionaryオブジェクトを使うと、手軽に処理を記述できます。参考にしてみてください。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。