EXCELマクロの簡単なVBAプログラミング

今、職場の業務効率化を図るため、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 中野 大谷

 

 

 

 

 

人間の知識欲

知識欲は人間の本質的な本能です。たとえば、宇宙の構造や素粒子の構造が解明されたところで、興味のない人にとっては、それがわかったところで何なの?と思う人も多いでしょう。それらの研究に世界中で国の予算を使って研究して何の役に立つのだと不満に思う人もいるでしょう。
しかし、今までの科学の歴史を振り返ってみると当時は何の役にも立たない研究と思われていたものでも、そのしくみが発見された後は、いろいろな分野に応用されて技術的な進歩ひいては文明の進化が遂げられてきました。
当時は、世の中の何かに役立てようと思って研究することがなくても、その基礎的な研究結果を応用して科学技術が発展してきたと言っても過言ではないでしょう。
しかし、理学系の多くの研究は、基本的には最初から何かの役に立つことを目的として国の予算や大学の予算を使っているわけではなく、人間の本質的な知識欲を満たすことを目的としています。

そんなことに金を使うのをやめて直接国民に役にたつことに金を使うべきではないかと主張する人もいるかもしれません。

しかし、たとえば多くのノーベル物理学賞の内容を見てもその発見がその当時は直接何か世の中に役立つような内容はほとんどないと言っていいでしょう。
では、何故そんな直接世の中に役立ちそうもないような発見にノーベル賞が与えられるのでしょう?

それは、人間の不思議と思う本質的な知識に対する欲望を満たすことができるからです。

人間はただ生きていくためのみ価値を見出すべきものであるならば原始時代の動物に近い存在と同じになります(今の時代、生きていくことだけでもたいへんな時代にはなっているとは思いますが…)。

人間の知識欲というものは、ほかの本能的欲望(食欲、眠欲など)に比べて人によって様々です。この知識欲というものは本能に近いものなので、それが満たされるまでの間は留まることはないでしょう。
中には、ほとんどの人が関心がないことに関して、ある人だけが不思議に思って何故そうなっているのだろうと疑問に感じて研究し、新発見をすることがあります。
たとえば、ニュートンが発見した万有引力の法則は、リンゴが木から落ちるのを見て当時は誰も不思議に思う人はいませんでしたが、ひとりの天才が不思議に思ってくれたおかげで偉大な発見につながることになったわけです。

人間の知能、知識をもってしても長い間誰も気づかないあるいはなかなか解明できないことについて、誰かが発見あるいは解明したとしたら、それはやはり賞賛に値するものであり、人類として価値あるものになることでしょう。

これは、歴史的に見ると、昔は世の中の不思議な現象に対して科学的な知識がない時代はそれは神の仕業であり、神のみが知りうることであるとして神を崇めましたが、人間がそのしくみを発見していく中で神の仕業ではないことが分かってきたことから、その発見者に対して尊敬の念を抱くことになったのだと思います。

世の中の現象の全てを知りたいという欲望は人間である以上、永遠と続くことでしょう。

しかし、将来、世の中の全ての謎が解明されたとき、人間の未知の世界に対する知識欲はどうなるのでしょう。理学系(基礎的医学系等を含む)の学問が消滅し、工学系の学問のみが残っていろいろな発明をしていく世の中になるのでしょうか。
そのときは、それまで数式化できない分野の哲学系などについて数式化する試みがあるかもしれません。また、全ての謎を知り尽くしたと思ってもそれは気づいていないだけであってまだ知りえていない謎もあるのかもしれません。
また、従来、定説となっていた理論でも実はそれは間違っていたと主張する学者が出てくる可能性もあります。

いずれにしても人間の知識欲というものはいつの時代も留まることはないのかもしれません。

 

天災大国である日本を人災にしてはならない

今回、西日本に甚大な被害をもたらした豪雨を含め、最近、日本で発生する水害や地震災害は、今まで記録的には発生したことがない地方において発生している場合が多く、今までの経験や統計だけではほとんど予測がつかない状況となっている。

水害については、いつも河川の堤防の決壊、土砂崩壊を繰り返している。日本は、豪雨が発生しやすく、かつ、水害が発生しやすい地形であることを強く認識する必要があり、国や自治体は最優先でその災害防止対策を全国的に行う必要がある。

その対策には膨大な経費・予算が必要になると思われるが、頻繁に発生する甚大な被害、経済的損失を考えれば、最優先で早急に実行しなければならない。

単に堤防や山の斜面を頑丈にするとか堤防の高さを高くするというような従来型の対策では、時間も費用も膨大なものとなるため、科学技術の粋を凝らして何か画期的な対策を研究することに予算を投じるべきである。

また、大地震についても、かつてほとんど地震が発生したことがない淡路阪神地方においても大地震が発生するので、日本で絶対に大地震が発生しない地方があることを証明することは不可能に近い状況である。

そのような地震大国において、そもそも原発をあえて積極的に設置するという発想自体に対して外国人から見ると多分日本人はクレイジーな国民と思われるだろう。
リスクの塊のような国に原発を設置すること自体、ものすごいギャンブルである。これは例えていうと「うちの子に限って」、「ここだけは地震がこないだろう」、「天災がくれば仕方がない、あきらめよう」という日本人特有の楽観主義的、あきらめ型の発想が一種のギャンブルということだ。
いつか来るかもしれないがそれが来ないほうにかけるという発想である。
そして来れば運が悪かったという発想である。
だから目先の利益を享受しようという発想である。

目先のコストで原発を選択するという発想は、核のゴミ処理問題や大きな事故が発生した場合のコスト、廃炉するときのコストを考えると長期的には莫大なコストがかかることを覆い隠しているだけである。

今後、政府は原発をどんどん再稼働させていく方針なのだろうが、これは将来日本が滅びる原因となるだろう。

人類の科学技術の発展は目覚ましいものがあるが、核の発見だけは人間は悪いことに利用し過ぎた。
核利用はがん治療や物理の実験などで少量使う以外は、大量に扱うと一歩間違えると甚大な被害をもたらす凶器となるので、大量に使うことに利用すべきではない。
また、地震によって原発が制御不能になる危険以外に、将来サイバー攻撃によって原発が狙われることがないという保証はどこにもない。
いずれにしても今後予想もしていなかったことが原因で原発事故が再び発生することが絶対にないという保証はない以上、甚大なリスクを常に抱えたまま生活をする不安を持たされることを日本人は望むのだろうか。

かつて、「原発は安全ですよ」と何度も政府が繰り返したが、その結果が福島の原発事故である。しかも福島県沖にマグニチュード9近くの大地震が発生した場合、高さ15メートル程度の津波が福島の原発施設を襲うことを予め予測しておきながら、そのような大地震が来ないことにかけるほうのギャンブルを行って目先の利益を最優先し、国民を一度だましておきながら、福島の原発事故のあとでも再び各地で原発を推進させようとする発想はあきれるばかりである。

今後、政府が「これで絶対安全になりました。」と公言して原発をどんどん再稼働させた後に、再びどこで起こるか予測ができない大地震や津波などによって大きな事故が発生した場合、おきまりの「想定外だった。」というセリフで国民の非難をかわすことになるのだろう。

ここまで国民がばかにされていることに対して国民はもっと怒り、人間としてのプライドを持ち、日本に安心して住むことができる権利を主張しなければならない。

将来、日本を滅ぼさないために。