今、職場の業務効率化を図るため、Excel macro で使うVBA(Visual Basic for Application)を勉強中です。特に1000人くらい参加する予定のイベントのうち 、こちらが把握したい人(ある集団のメンバー)が含まれているかどうかを確認する必要が生じたため、職員が2つの名簿を照合して手作業で確認していましたが、この確認作業は洩れがないよう極めて正確性が求められる作業なので、こんなときその担当者がExcel macro の知識を持っていれば、迅速かつ正確に行うことができるので、今回のことをきっかけとしてVBAプログラミングの勉強をして業務の効率化に協力しようと思い立ちました。
私も学生のころ、授業でフォートランを学んだので多少のプログラミングのやり方は覚えているつもりだし、その後、趣味でC言語やJAVA, BV.Netもかじりましたが、どれも中途半端で途中で挫折しました。
プログラミング言語というものは、趣味で勉強しても普段から使っていなければやがて忘れてしまうものなので、趣味程度の気持ちではなかなか上達しないものだとわかりました。何か明確な目的や目標がなければ身につかないものです。
そのような状況の中で、世の中はAI(人工知能)やRPAなどデジタル社会に突入する状況となりました。また、未曾有の少子高齢化社会に向って、人手不足の問題がますます深刻化していく時代となりました。このような状況下では必然的に業務効率化による労働生産性の向上が求められます。
私が勤務している職場も仕事は増えていく一方なのに事務所スペースが限られているため職員の増員には限界があることから、人間の判断を要しない定型的な業務はできる限り自動化をしていく方針としています。
ということで、現在、RPAソフトを検討しているところで、弊社は非営利団体なのでUiPathなら無料で購入できるため、現在、UiPathが有力となっています。しかし、無料の場合は、サポートがつかないため独学で覚えなければなりません。そこで、職員に覚えさせるのは時間もかかるので、専門派遣を使って構築してもらおうかなと考えています。
UiPathは個人でも無料でダウンロードできるので、先日、インストールして少し勉強したのですが、へたにある程度プログラミングをかじったことがある人間から見るとかえってわかりづらいという印象でした。
RPAはどこのベンダーもプログラミングの知識を知らなくても簡単に覚えられるとのフレコミですが、クリックによってアクティビティやプロパティを張り付けてプログラムのようなものを構成していくので、パソコン操作手順の自動記録の方法以外については、通常のプログラミングとあまり変わらない印象でした。
コードをキーで入力する手間や細かい文法で使う単語を入力しなくてもよいというメリットはあるかと思います。しかし、RPAも結局はプログラムの作成です。通常のパソコン作業を分析してどのように組めば自動化できるかというフローチャートを描けなければなりません。
また、その対象となる作業が、頻度が少なく、かつ、手間もかからないような作業であれば、RPAで自動化する意味があまりありません。特に小規模事業場においては、一つの定型的なパソコン作業で比較的大量に行う作業というものはあまりないかもしれません。規模の小さな事業場では自動化させることに適したパソコン業務を洗い出す作業が結構難しいと感じました。
UiPath陣営はおそらく小規模事業場(年商100万ドル以下かつパソコン250台以下の事業場)や個人はRPAを購入することはあまり期待できないとみて、無料にしたのかもしれません。
Excel macro でもExcel関連であればパソコン業務の自動化は可能なので、UiPathの導入と並行して、VBAの普及も視野に入れようかなと考えています。
それには、まず、VBAのしくみや使い方を知る必要があるので、まず基本的な知識や使い方を勉強しました。かつて、VB.Netを少し勉強したことがあるので、ほとんど抵抗なく勉強できました。
練習問題として、昼のイベントと夜のイバントの両方に出席する人を抽出をする方法についてExcel macroのVBAを使って以下のようにプログラムを作成したところ、以下の表のように両方出席した人の名前を別の欄に記載し、昼の出席者ののうちその人の名前の欄を黄色で表示し、その人数(3名)を別の欄に表示できるようにしました(この画面では色は出ていませんが実際のExcel画面では色が出ています。)。
最初は、Application.WorksheetFunction.Matchなどのオブジェクやプロパティを使ってプログラムを考えていましたが、うまくいかなかったので難しいプログラムを避けて単純な構成のフローチャートを考えたところ、以下のように比較的簡単に作成できました。
このような作業は実際の仕事でもあると思うので、VBAの初心者の方は参考にしてください。
ただし、VBAのわかりづらいところは、等号と代入の記号が同じ「=」であるという点です。一般的なプログラム言語では代入は「=」が使われていますが、等号まで代入と一緒の「=」を使っているところはあまりないのではないかと思います。
通常、プログラム言語の等号記号は「==」を使うと思うのですが…。
論理的に代入と等号は概念が異なるので記号を区別するよう改めたほうがわかりやすいと思います。
Sub 重複会員()
Application.ScreenUpdating = False
Dim i, j, cnt As Long
cnt = 0
For i = 2 To 11
For j = 2 To 11
If Cells(i, 2) = Cells(j, 3) Then Cells(i, 2).Interior.Color = vbYellow
If Cells(i, 2) = Cells(j, 3) Then Cells(i, 4) = Cells(i, 2)
If Cells(i, 2) = Cells(j, 3) Then cnt = cnt + 1
Next
Next
Range(“E2”) = cnt
End Sub
実行前
昼に出席 | 夜に出席 | 両方出席 | 人数 | |
1 | 田中 | 野村 | ||
2 | 鈴木 | 市川 | ||
3 | 山川 | 山本 | ||
4 | 池田 | 吉田 | ||
5 | 木村 | 成田 | ||
6 | 佐藤 | 森本 | ||
7 | 山本 | 神林 | ||
8 | 河村 | 池田 | ||
9 | 大谷 | 松本 | ||
10 | 中野 | 大谷 |
実行後
昼に出席 | 夜に出席 | 両方出席 | 人数 | |
1 | 田中 | 野村 | 3 | |
2 | 鈴木 | 市川 | ||
3 | 山川 | 山本 | ||
4 | 池田 | 吉田 | 池田 | |
5 | 木村 | 成田 | ||
6 | 佐藤 | 森本 | ||
7 | 山本 | 神林 | 山本 | |
8 | 河村 | 池田 | ||
9 | 大谷 | 松本 | 大谷 | |
10 | 中野 | 大谷 |