本しゃぶり

骨しゃぶりの本と何かを繋げるブログ

俺がリボン登録している業務用Excelマクロ

Excelの作業はマクロを使うことで自動化できるものもある。
俺が仕事で多用しているマクロの中から、比較的汎用性の高いものを紹介しよう。

マクロ3つ

今回紹介するマクロは、特にいじらなくても使えるものである。さすがに全ての人がとは言わないが、それでも使うことで生産性が高まる人は多くいると思っている。

俺はExcel中級者*1なので、そう高度なマクロは組めない。この記事は「Excelを仕事で使っていてマクロに興味はあるけれど、どんなことができるのかよく分からない」ぐらいの人をメインターゲットとしている。Excel上級者の人は、もっと使えるマクロを俺に教えて欲しい。

それではマクロの紹介を始める。

それっぽい表を作るマクロ

このようなそれっぽいデザインの表を作るマクロ。

f:id:honeshabri:20180630193528p:plain:w500
それっぽい表

課題

以前なにかで読んだのだが*2、表のデザインとしてただの格子はよろしくない

f:id:honeshabri:20180630193508p:plain:w500
よろしくない表

罫線が多く、ごちゃごちゃして見づらいためだ。

f:id:honeshabri:20180315193805p:plain
もっとよろしくない表

なので表はこのような線の数が最小限であるデザインにするべきだ、と。

f:id:honeshabri:20180630193528p:plain:w500
よろしい表

しかし表のあるべき姿は分かったが、毎回このデザインを0から作るのはめんどくさい。全体を白く塗りつぶし、上下端に太線を入れ、さらにタイトル行を太字にして下にも線を入れる。ただの格子ならば、Excelに元から備わっているボタンで一発なのに。

対応

そこで以下のマクロを作成した。

Step1 表にしたい範囲を選択

f:id:honeshabri:20180630161502p:plain
選択する

Step2 マクロを起動
Sub 表作成()

    sentaku = Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False)
    Range(sentaku).Borders.LineStyle = xlLineStyleNone
    Range(sentaku).Interior.ColorIndex = xlPatternNone
    Range(sentaku).Font.ColorIndex = xlAutomatic

    Range(sentaku).Interior.Color = RGB(255, 255, 255)
    With Range(sentaku).Borders(xlEdgeTop)
        .Color = RGB(0, 0, 0)
        .LineStyle = xlContinuous
        .Weight = xlMedium
    End With
    With Range(sentaku).Borders(xlEdgeBottom)
        .Color = RGB(0, 0, 0)
        .LineStyle = xlContinuous
        .Weight = xlMedium
    End With

    Range(Cells(Selection(1).Row, Selection(1).Column), Cells(Selection(1).Row, Selection(Selection.Count).Column)).Select
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Color = RGB(0, 0, 0)
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Font.Bold = True

End Sub

f:id:honeshabri:20180630153648p:plain
完了

後は行間・列間を適当に調整してやればよい。

罫線を引くマクロ

こんな細い罫線をまとめて引くやつ。

f:id:honeshabri:20180630195455p:plain
罫線

課題

手書き時代の名残りなのか、印刷時の見栄えを気にしているのか知らないが、弊社には罫線が引いてある書類フォーマットがいくつかある。

f:id:honeshabri:20180630164254p:plain
罫線フォーマットのイメージ

罫線フォーマットがクソなのは、入力した文章の行を変える時だ。

f:id:honeshabri:20180630202150p:plain
下へ動かしたい

このような時、テキストエディタならば行頭にカーソルを持っていき、改行してやればスペースが空く。しかしExcelの場合、Enterを叩いてもカーソルが下へ移動するだけで、文章の位置は変わらない。なので移動したい範囲を選択し、ドラッグすることになる。

f:id:honeshabri:20180630164906p:plain
動かした後

そうすると元あったセルから罫線が消えている。腹立たしい。しかも作業中は罫線が消えていることに気が付かず、印刷後に上司から指摘されるところまでがワンセットである。全くもって腹立たしい。

このようなクソフォーマットは滅びるべきなのだが、一度決まったものを変更するには労力がかかる。しかし毎回修正するのも面倒だ。なのでマクロを作った。

対応

やっていることは「それっぽい表」と同じである。

Step1 罫線を引きたい範囲を選択

f:id:honeshabri:20180630165446p:plain
選択する

Step2 マクロを起動
Sub 細い罫線()

    sentaku = Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False)

    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Color = RGB(0, 0, 0)
        .TintAndShade = 0
        .Weight = xlHairline
    End With

End Sub

f:id:honeshabri:20180630165518p:plain
完了

俺の感覚だと罫線は行間に引かれているものなので、上下端には引かれない。上か下のどちらかなら引くようにしてもいいけれど、両方だと1本だけ引くことができなくなるので注意。

定義された名前を表示させるマクロ

こいつを消す方法。

f:id:honeshabri:20180630150044p:plain

課題

Excelでシートをコピーした時に上記エラーメッセージが出ることがある。「定義された名前」が重複しているためだ。名前の管理で確認すると、だいたいすごいことになっている。

f:id:honeshabri:20180702145502p:plain
友人帳かよ

このような状態のブックでシートをコピーすると、エラーメッセージが名前の数だけ出てくるので、エンターキーを推し続けるはめになる。なので死んだ名前は削除しなくてはいけない。

しかし、名前の管理で全ての名前を消し去ったのに、それでもエラーメッセージが出ることがある。それは「定義された名前」が非表示になっているためだ。消し去るためには隠された名前を暴き出す必要がある。

対応

削除まで自動でやると必要な名前まで消し去る危険性があるため、マクロは名前を表示させるだけにしておく。

Step1 マクロを起動
Sub レリーズ()
    Dim name As Object
    For Each name In Names
        If name.Visible = False Then
            name.Visible = True
        End If
    Next
End Sub

これで「名前の管理」に全ての名前が表示されるため、あとは不要な名前を片っ端から削除すればよい。

ところで、ここまで読んで不思議に思った人もいるのではないかと思う。なぜ「定義された名前を表示させるマクロ」を頻繁に使うことがあるのか、と。それは「定義された名前」の適応度が非常に高いためである。「定義された名前」にはフォーマットを通じて感染し、拡大する性質があるのだ。

名前の増加原理

いい機会なので「定義された名前」が感染によって増加する過程を説明する。これから「増える性質を持った遺伝子は増えてしまう」という自然淘汰の真理を垣間見ることになるだろう。

ネームド化

ここに2つのExcelブックがある。片方には「定義された名前」があり、もう片方には無い。便宜上、「定義された名前」を持っているブックを「ネームド」と呼び、持っていないブックを「増田」と呼ぶ。

f:id:honeshabri:20180702160837p:plain:w400
2つのブック

さて、ネームドからシートを増田へコピーしよう。

f:id:honeshabri:20180702161838p:plain:w400
ネームドシートのコピー

するとコピー先である増田はネームドになる。名前に感染したのだ。

f:id:honeshabri:20180702162408p:plain:w400
増田にコピーしたら

f:id:honeshabri:20180702162430p:plain:w400
増田がネームドに!

そして元増田からコピーしたシートを削除したとしても、ネームドであることに変わりはない。

f:id:honeshabri:20180702163359p:plain:w400
シートを削除しても

f:id:honeshabri:20180702163413p:plain:w400
ネームドのまま

では元からのネームドを「ネームド1」として、元増田を「ネームド2」とした時、新たな別の増田にネームド2からシートをコピーしたらどうなるか。

f:id:honeshabri:20180702164125p:plain
ネームド2からコピー

もちろん新たなネームドが誕生する。

f:id:honeshabri:20180702164155p:plain
第三のネームド

このようにネームドからコピーされるたびに新たなネームドが生み出される。どんなに清らかな増田でも、一度ネームドからコピーされてしまえば、その身はネームドに堕ちてしまうのだ。

ではどのようなファイルがネームドとなって名を広めるのだろうか。それはこういうファイルだ。

f:id:honeshabri:20180630164254p:plain
クソフォーマット

フォーマットのファイルである。

ハブ・ネームド

フォーマットはだいたいネームド化している。とはいえ原本がネームド化していることは稀で、基本的には増田である。ネームドとなっているのは書き込まれたフォーマットだ。

上の人に見せるちゃんとした報告資料には、決まったフォーマットがある。そしてそういった報告資料というものは、毎回1から書き始めるというものではない。だいたい前回の報告資料をコピーし、それに加筆修正を行うというものだ。部分的にしか更新しないという点があるが、それよりもフォーマットに沿った書き方をする必要があるからだ。前回の修正ならば、間違った書き方をしてしまう心配は無い。

したがって報告資料が一度ネームド化すると、以降の報告資料もネームドということになる。

f:id:honeshabri:20180702170840p:plain
ネームドの継承

また、報告資料というものは様々なデータを集めて作成することが多い。そのため報告資料はシートのコピー先となりやすいのだ。多くのシートが入ってくるということは、それだけネームドとなる確率が高いということである。

f:id:honeshabri:20180702185634p:plain:w400
この報告資料はネームド化する

さらに報告資料は引用されることが多い。上の人に提出するものであるだけあって、信頼性があるからだ。また上に行くほど他部署とのやり取りも多くなる。そういった時に使われるのは報告資料だ。そして報告資料に付属しているシートはコピーされ、また別の資料に差し込まれるのである。これによって報告資料は拡散する

f:id:honeshabri:20180702185658p:plain:w400
報告資料の拡散

以上、報告資料の「継承」「収集」「拡散」という三要素が組み合わさることにより、報告資料は名前の拡散装置となる。これがハブ・ネームドである。

f:id:honeshabri:20180702174614p:plain
ハブ・ネームド

一度こうなると名前の拡散を止めることは困難となる。時が経つに連れてネームドは増え続ける。何かの拍子に別のフォーマットがネームド化すると、名前はさらに拡散する。別に誰もネームドを増やそうと思っていないし、「名前の定義」は名前を拡散させるために作られたのでもない。ただ増える性質を持っているがゆえに増え続けているだけなのである。

これについて誰か対応を取らないのかと思うだろう。それが取らないのである。なぜならネームド化による問題が小さいからだ。

ネームドの問題点

俺が知る限り、ネームドの問題は2点しかない。「シートコピー時のエラーメッセージ」と「ファイル容量の増加」である。そしてこのどちらもがあまり大した話ではない。

まずエラーメッセージだが、問題となるのはシートをコピーした時だけである。そしてエラーメッセージが表示されても、エンターキーを押し続けていればそのうち消える。それだけだ。

f:id:honeshabri:20180702183158j:plain

ファイル容量の増加もあると言えばあるが、気がつくほどではない。何百もの名前を持ったファイルから名前を消去しても、容量は300KBぐらいしか軽くならなかった。それでもこれは特別に大きい方で、ほとんどのネームドは名前を消しても微々たる変化でしかない。

つまり、ネームドを使ってもちょっとイラッとする程度でしかない。なので多くの人はわざわざ原因を突き止めようとは思わず、その場しのぎの対応で済ませるのである。だからネームドは蔓延しているのだ。

だが、ネームドを駆除することに情熱を燃やしている者がいた。である。

エクセルのエクソシスト

俺は何度も同じことをしたくない。毎回シートをコピーするたびにエンターキーを押し続けるのは本当に馬鹿げている。だからこの現象について調べ、名前を削除すればいいこと、非表示になっている名前が存在していることを知った。

だから今ではフォーマット化されている報告資料や説明資料を開く度、マクロを起動するのである。

真の姿を我の前に示せ、と。

f:id:honeshabri:20180630160539j:plain
[Public domain], via Wikimedia Commons

しかし俺がいくら頑張っても限界がある。駆除する速度より増加する速度のほうが速いのだ。ネームドはこうして記事を書いている現在も増加しているのだろう。

だからこの記事を読んでネームドの存在を知った人に言いたい。あなたもこのマクロを登録するべきだ、と。そして共にネームドを駆除しよう。

終わりに

ネームド滅ぶべし。

Excelの記事

*1:VLOOKUPが使える人のこと。

*2:たぶんこれ 表とグラフ