はじめに
私の今の肩書は 「マクロの書ける事務員さん」 です。
しかも私もう間近にその身分すら剝奪される期限がぶら下がっているワケです。3年目の有期の派遣なので。契約形態変えて延長もないそうです。そんなぁ~……
でも仕方がないのです。今のこの時代に「ちょっとPCが得意でマクロも書ける事務員さん」の席はどんどんAIやRPAに食い尽くされていく定めであることは誰にだって分かるのです。
だって誰でも持ってるスマホや社用PCの中にもいるAIが、
「え?今数時間手作業でやってるんですか?こうすれば早いですよ!ポン!」
って無料で魔術の呪文を教えてくれたり、
「こういうツール入れれば勝手にこんな作業深夜の誰もいない間に終わりますよ!なんと~人件費は~……0円!!」
とか教えてくれるので。オイオイ営業妨害やぞ
そんな状況から脱するために、私は慣れ親しみ時には抱擁し時に共に泣き、時には右ストレートを打ち込むも寧ろカウンターでボコボコにされながらも付き合ってきたVBAと距離を置き、新しくC#と懇ろにしていく覚悟を決めるワケです。
ちなみにこの文章は
- 仲間を見つけてほくそ笑みたい同じ「マクロの書ける事務員さん」
(わかるよ……大体「なんかよくわからん多分すごいことやってる奴」になりがちで孤独だよな……) - 事務員マクロを見せられ絶望し、書いてる側のメンタリティを知りたいIT担当
(正直いつもすまんとは思っている)
辺りが見てオモロいなあと思ってもらえたらいいなあと思って書いています。
あとついでにあわよくば転職活動の自己紹介にもします。
おしゃべり苦手なので……
これは経験に基づくオモシロポエムとして書いているので間違い等もあるかも。
でもまあ私、「マクロの書ける事務員さん」 ですからね。
「マクロの書ける事務員さん」とVBAの蜜月
VBAの入口というか、引き込み方ってすごいですよね。
勝手にMSOfficeについててちょ~っと調べて「マクロの記録」ボタンへたどり着けば、
「オッ!お目が高い!アッシがアナタのお仕事自動化しますぜ!何?コードを書いたことはない?そんなんアッシが勝手にやっておきやすよ!ゲヘヘ……」
などと手を揉みながらヤツが歩いてくる訳ですよ。
言われるがままに私含めて多くの事務員は記録したマクロを手にし、そのボタンを押すのです。
するとどうでしょう!
今自分が行った操作そのまま、何もしていないのに再現されるじゃあありませんか!
ものすごい勢いで勝手にウィンドウが切り替わって!?
カーソルがあちこちへ移動しアレを選択し!?
こちらへ移動して……
貼った~!
なんと!コピペが自動化したじゃありませんか!すげ~!
今考えれば 最低限Application.Screenupdating=Falseくらいしろや と思う訳ですが、
事務員たちは高速に自動で切り替わりチカチカ点滅するウィンドウを見て愚直に思うのです。
「俺今、すげーことやってる感ある~」……と。
結果まあぼちぼちの数の記録マクロ依存者を生むワケです。
その依存者たちは私含めてこう夢想するのです。
「もしかしたら今やってるこのめんどくさいだけの手間のかかるほとんど人間の意思なんて必要としない資料作成マシーンみたいな仕事なんて自動でやってもらえるのではないか?」
そこに辿り着いてしまえばそれが沼の入口です。
ようこそ。
記録したマクロをちょっと修正したくなってVBEを開く
まあでも記録マクロは記録したことの再生です。
ぶっちゃけ言えば「全く同じ形の全く同じ形式のデータ」はどうにでもしてくれるけど、そんなもん業務中に都合よく降ってきません。
事務員さんは考えます。
「何行のデータが来たって同じように処理してもらうにはどうしたらいいんだろう?」
それを解決するためにインターネットで検索して色々探るうちに、とうとう辿り着くのです。
「これ以上のことをするには、VBEでコードを編集しなくてはならない」
という事実に。
事務員さんは思います。
「話が違うぞ?アイツ(記録マクロ)がそういうのは書かなくてもどうにかしてくれるって言ってたはずだが?」 と。
でも自動化の沼に片足を突っ込んでしまった哀れな事務員さんはこうなってはもう片足も己の意思で突っ込むしかありません。
最初は範囲指定をちょっと変更するだけでした。
Range(”A1:C10").Selectを
Range("A1:C10000").Selectにでもしてしまえば
対象範囲が広がって沢山処理ができるようになりました。
まあ!うれしいですね!
やがて高速化をしたくなってきます。
集計処理にVlookupを使っていた事務員さん。
Vlookupをいっぱい入力して、それをコピーして値にして貼り付ける。
それだけの作業ですがまあ重い。
他にもフィルタをして結果をコピーしてフィルタを解除して、
次のフィルタを設定してコピーして、フィルタを解除して。
その積み重ねが1000行を超えたExcel相手では大変重いワケです。
ひどいときはマクロのボタンを押して15分、ただチカチカする画面をみながらぼーっとするだけ。
うーん。今日もチカチカチカチカ、ゴキゲンですね。
まあ、コーヒーでも飲みましょう。
だってExcelはマクロに取られちゃったから他の仕事が出来る訳でもないし。
……いやこの時間どうにかなんないの!?今日繁忙日だよ!?他にも死ぬほど業務あるよ!?
そこからが大変な沼でした。
まず事務員さんは
「どうにも直接数式を書き込んだり、WS上を触ったりするのが重いらしいぞ?」
と様々な場所を調べるうちに気付くのです。
そこで色々調べるうちに、Worksheetfunctionを使えばどうにもVBA側で計算をしてくれるらしいのではないかということを知ります。
まあ今となっては分かるんですよ。大罠ですよ。
結局WorksheetFunctionは計算してるのExcel側だし。
直接セルに数式としてVlookupを書き込んでいた部分を喜々としてWorksheetfunction.Vlookupに置き換えた事務さんですが、勿論そんなに高速化するはずもありません。
コーヒーを飲みましょう。しょうがないので。
さて、ではどうすれば重い処理を回避できるのだろう?
次にSelectしてからSelectionで処理することが無駄だということを知りました。
Range("A1").SelectしてからSelection.Copyしていたものを、
Range("A1").Copy出来るようになりました。
事務さんはSelectしていた範囲に直接計算結果を突っ込めるようにもなりました。
CopyならCopyしてPasteしなくたって、Copy Destinationで早くなるらしい、ってのも知りました。
更に言えば値貼付したいならRange.value=Range.valueすればいいんですって!すご~い!
う~ん なんだか体感できるくらい速くなった気がする!
ちょ~っとマシになりましたね!
でも残念!まだまだコーヒーは飲めますね。このままではカフェイン中毒で死にます。
マクロの書ける事務員さんあるある~!
「Range(オブジェクト)とRange(範囲)の違いが分からない」
なんでSetつけるかつけないかでエラーが出たり出なかったりするんですか?
本当にVBAってそういうとこ無責任ですよね! ぷんぷん!
次回予告
このままではカフェイン中毒で事務員さんは死ぬ!
救いを求めてインターネットの海を彷徨った事務員さん、長い航海の果てに見えてきたものとは……!?
次回 「Excel使うのに辞書なんか引いたことないが?」
おたのしみに~!