マクロを作ってアドイン登録

毎月のルーティン作業で一番嫌いなのが、ある拠点に提出するエクセルファイルの更新作業。複数あるのだけれど、いずれも不必要にセル(列)の結合がされている。エクセル方眼までいかないまでも、非常に迷惑。エクセル方眼はまだ申請用紙のフォーマットに合わせるため、とかなんとか言い訳を受け入れられるけれど(それでもできるだけやめてほしい)、私が毎月格闘するエクセルレポートは明らかに作成者が無計画にフォームを作った結果だろうな、と思われるもの。慌てず、あと5分くらい設計図を考えれば、こんなフォームで私の時間が奪われずに済んだだろうに。

私は後々の面倒臭さを回避したい人間なので、エクセルでフォーマットを作れ、と言われたら、時間がかかるタイプ。私が想像するに、私の大嫌いなフォーマットの作成者は、一つ一つの作業が速くて、一つ一つコピペして、行の高さを変更して、という作業が苦じゃないタイプなんだろうと思う。(もしくは、実際の作業を想像できないか。)

セルが結合されたら発生しちゃう面倒くさい作業

行の高さの自動調整が出来ない。

一時期、この行の高さを調整するタスクが大量に舞い込んできたので、調整用マクロを作ったのだけど、そうしたら、更に「調整しておいて」と言われることが増えたので、エクセルのアドインとして登録。この他にも、各シートの表示倍率を統一してA1セル選択した状態にするマクロ(【追記】下にサンプル付けました)とか、別ブックからのリンクがある場合にリンクを削除するマクロ(【追記】下にサンプル付けました)、シートインデックスを一番左に作るマクロをアドインとして登録している。

「わざわざアドインとして登録するまでもない」と思えるような作業でも頻繁に発生するのであれば登録しておいた方がいい。コーヒー休憩に行く時間くらいは作ってくれるはずだ。

マイクロソフトが高さの自動調整の改良をしてくれることを切に願います。(変な使い方を考える人は、私を含め、減ることはないと思う。)

おまけ

【各シートの表示倍率を統一してA1セル選択した状態にするマクロ】
[code language=”vb”]
Option Explicit
Sub ZoomLevelSetting()

Dim i As Long
Dim ZoomLevel As Long ‘表示倍率

ZoomLevel = InputBox(Prompt:=”シートの表示倍率を” & vbCrLf & “半角英数字で指定してください。”, Default:=100)
If StrPtr(ZoomLevel) = 0 Then Exit Sub

For i = 1 To ActiveWorkbook.Worksheets.Count
ActiveWorkbook.Worksheets(i).Activate
ActiveSheet.Range(“A1”).Select
ActiveWindow.ScrollColumn = 1
ActiveWindow.ScrollRow = 1
ActiveWindow.View = xlNormalView
ActiveWindow.Zoom = ZoomLevel
Next i

ActiveWorkbook.Worksheets(1).Activate

End Sub
[/code]

【別ブックからのリンクがある場合にリンクを削除するマクロ】
[code language=”vb”]
Option Explicit
Sub CheckExternalLink()

Dim msg As VbMsgBoxResult ‘選択したメッセージの値
Dim aryLink As Variant ‘外部リンクの格納
Dim i As Long

aryLink = ActiveWorkbook.LinkSources(xlExcelLinks)

‘他のブックへのリンクがあるかを確認し、リンクを削除するか選択する。
If IsArray(aryLink) Then
msg = MsgBox(“他のブックへのリンクがあります! ” & vbCrLf & “リンクを解除しますか?”, vbYesNo + vbQuestion)
If msg = vbYes Then
‘リンクを削除する
For i = 1 To UBound(aryLink)
ActiveWorkbook.BreakLink _
Name:=aryLink(i), _
Type:=xlLinkTypeExcelLinks
Next i
Else
MsgBox “リンクを解除していません。”
End If
Else
MsgBox “他のブックへのリンクはありませんでした。”
Exit Sub
End If

MsgBox “DONE”

End Sub
[/code]
アドインに登録する場合には、ThisWorkbookではなくActiveを使います。

Advertisements

少しでもラクをする仕組みを作っておく

繰り返し発生する業務は出来る範囲で自動化するようにしている。

自動化するためには、まずタスクの処理方法を整理。プログラムを書けるかどうかは気にしない。作業をいつもやっているとおり正直に書き出してから、冷静に見てみると意外にヘンテコな手順を踏んでいることに気づいたり、いらない手順が見えてくる。

次に、自動化出来そうな部分と、手作業で手を打つ部分に区別する。毎月発生するエクセルのタスクは同じ様な作業が多いので、以前に作ったコードが再利用出来たりする。

最初から書いたコードと再利用コードの組み合わせが完了したら、最後に、再利用するのコードの見直しもしておく。以前は長々と書いていたコードも、少し時間を空けて見てみると、もっと簡潔に出来ることが多々ある。

《ボタンをポチッと押したら全自動で》というわけではないので、手順メモを作成しておくことが重要。(最初に手順を書き出したメモの再利用。)

同じことを繰り返していると作業自体早く出来る様になってくるけど、急にタスク量が増えて余裕がなくなってくるとミスが発生しやすくなるし、こんなちょっとした仕組みが役に立つ。

ここ数週間、突然のタスクにテンパりつつも何とかやり遂げられたのには、これまでコツコツ作ってきた仕組みがあったからかもしれない。

エラーメッセージで数時間

(※2018年3月1日に更新)

下っ端の事務員の仕事の中には《決まったフォーマット》を使って《言われたとおり》仕事をする、というのが多い。
この《決まったフォーマット》というのが、見た目だけを重視する人によって作られたものだと、事務員のタスクは不必要にハードになる。

仕事の面倒臭さというのは、作業それ自体の面倒臭さと作業に関わる人のの面倒臭さの掛け合わせだ。

作業の面倒臭さ=(そもそもの面倒臭さ)✕(前の工程にいる人のクオリティの低さ)✕(最終提出先の求めるクオリティ)

今日は、この前の工程でのクオリティの低さで、散々な目に合っている話と、それとは関係なくイラついた話、そしてどうしたら少しはマシな作業になるかと考えたこと。
(当初の投稿では、イラつきすぎて正常な思考ができず、クオリティの低さとエラーを関連付けてしまうという、とんでもなことをしていたので今回修正した。)

印刷の段階でユーザーを苦しめる列の結合

私の一番やりたくないタスクの一つにExcelの幅調整というのがある。
「Excelの幅調整なんてダブルクリックすればいいだけじゃない?」と思う人がいるだろうが、それはよく練られたExcelの表にだけ当てはまる。
行の高さを調整しようとダブルクリックをしたら、一行分の高さに調整されてしまった、という経験をしたことはないだろうか。
この現象は、列の結合をしている表で見られるものだ。

【列の結合のない表の場合】
autofit_row_height

【列が結合されている表の場合】
autofit_row_height2
※【列の結合のない表の場合】を巻き戻しているわけではありません。

ちなみに、結合されたセルはコピペも面倒というデメリットもある。

おかしなフォーマットが生み出される背景を想像する

同じページに他にも表があって仕方なく列が結合されているということもあるだろう。
しかし、地域本社のある部署から渡されるフォーマットの8割は、残念ながら無意味に結合されている。
《Excel方眼紙》なら、「あー、作成者は方眼紙信奉者か」と軽く嘆いた後に、諦めがつくのだけど、それほど信念を感じられない。

非常に勝手な想像だが、恐らく「表を作る」→「上司に見せる」→「上司の要求を入れる」→「上司に見せる」→「上司の必殺技:朝令暮改が発動される」→「とりあえず見た目が合ってればいいとの結論を下す」→「関係者へ配布される」という経緯で、使いにくいテンプレートが日々生み出されているのだと思っている。

【ドラフトを作る】

【上司からのリクエストを反映させる】

赤枠で囲んだように、他のデータを入れるようにリクエストが入ったりする。

【結局、前の話に戻る】

リクエスト反映版を見たら、それほどでもないと感じた上司が「やっぱりいいや」と言ったりする。
でも面倒くさいから、上司がいらないといった部分だけ削除して、セルの結合を放置した表を完成版フォーマットとして全体に配布する。

ある程度他人を巻き込むのであれば、その後の影響ということにも少しは想像力を使っていただきたい。

そして私も印刷に苦しむ

さて、今回私がイラついているタスク、全体像は下図のような感じ。

Monthly reporting process

最初のクオリティ同様、最終版のクオリティも低い
最初のフォーマットがすでにダメダメなのだが、最終版も負けず劣らずなクオリティ。
各拠点から回収したシートを適当に一つのファイルにまとめておしまい。
シートの並びは毎月ばらばらで、列の高さの調整もされてない。

私にはそんなファイルを「印刷して上司に渡す」という役割がある。
行の高さを調整して、印刷範囲の設定をして、毎月同じ順序で印刷することを求められている。

最初こそ、こんなにバカバカしいタスクがルーティンとして存在していることが信じられず、「今月だけが例外なんだろう」とバカ正直に全てを手作業で調整したが、拠点数があるため、1時間以上かかる大仕事だった。

そして、翌月、これがルーティンだという衝撃の事実を知る。

Excelファイルならマクロで対応

拠点によって行が追加されていたりと、小さなアレンジがあるため、いくつも条件分岐させるようなマクロで、長くてあんまり上手い書き方ではなかったかもしれない。

各シートの印刷設定をしシートの順番を並び替えるマクロと、行の高さを調整するマクロの2つを作った。
2つに分けた理由は、列の結合されているファイルが他にもあり、他のファイルでも使えるような形にしておきたかったため。

エラー処理が甘くて数時間

しばらくの間は機能していたマクロだったが、今日、初めて処理に失敗した。処理の前半で止まってしまう。何が悪いのか画面とにらめっこをしていたが全く分からない。変な列やシートが追加されている形跡はない。

途中別の仕事もしながら、ウンウンとうなり続けること数時間、原因が判明。シートの数枚の名前の後にスペースが追加されていたことによる不具合だった。本来【シート名】となっているべきところ、【シート名 】となっているなんて目視じゃ気づけない。

「単に一つのファイルにシートをまとめるくらいちゃんとやってほしいんだけど・・・」とイライラが最高点に達したが、冷静になって考えると、私がエラー処理をすればいいだけ。
(最初の投稿の時から少しだけ成長した。)

どういうエラーが起きる可能性があるかということについて、まだまだ考えが及ばない。こういう経験がきっと問題なく動くマクロを作る糧になるのだと信じたい。

本末転倒な速さ信仰:全体最適って知ってる?

自分で対応出来るところは自分でも対応するようにするけど、そもそも論として、全体を管理すべきフォーマット作成者・取りまとめ者(今回の場合は同一人物)の仕事が雑なのがこの作業の問題点のような気がしている。
というのも、上司のために対応しているこの業務、手作業だと1時間。

「他の拠点も苦しんでるんじゃないか」と思い、試しに「印刷用に調整済みのものが必要でしたらどうぞ」と、印刷ボタンをポチればいいだけのPDFを送ってみた。(もちろんしおり付きで)

やっぱり他でも需要があった。
印刷せずとも見やすいデータファイルであればそんなに需要はないのかもしれないが、件のファイルは印刷せずに読むのが非常に難しい。
だから、みんなこんな作業に時間をとられることのバカバカしさを感じつつも作業をしていたのだ。

嫌々ながらも作業をしていたところはまだ良いが、途中で力尽きた拠点は、端からレポートを提出しておしまい、他の拠点の動向はスルーするという暴挙に出ていたようだった。本末転倒である。ある程度時間を割いて無意味なレポートを作っているだなんて悲しすぎる。

どうしてこんな状況が生まれたのだろうと考えた時、全体を管理しているチームなり人なりが、自分たちの仕事を早く終わらせることだけを優先させてしまったからではないかと思えてくる。

確かに仕事にはある程度速さが要求される。
しかし、一人が速さ(☓効率)追求した挙句、他の全員が時間をとる結果となっているのであれば、その速さってみんなにとっては迷惑でしかない。

私は末端で働いているだけなので、私が全体と思っている部分が実は限られた部分でしかない可能性もある。統括者がちゃんと全体最適を考えてこのようになっているのであれば文句は全くないけど、残念ながら現状、そんな風には全く見えない。

他への影響力のある人の雑な仕事が全体の仕事量を増やしてしまう、というケースを目のあたりにして、私も(多くの人に影響するような仕事はそんなにないけど)丁寧な仕事を心がけようと反省した。